A2A의 에이전트 발견

A2A의 에이전트 발견 (Agent Discovery)

Agent2Agent(A2A) 프로토콜로 협업하려면 AI 에이전트들이 먼저 서로를 찾고 상대의 역량을 이해해야 해요. A2A는 Agent Card를 통해 에이전트 자기 설명을 표준화해요. 하지만 이러한 Agent Card의 발견 방식은 환경과 요구사항에 따라 달라져요. Agent Card는 에이전트가 무엇을 제공하는지 정의하고, 클라이언트 에이전트가 이 카드를 발견하는 다양한 전략이 있어요. 전략 선택은 배포 환경과 보안 요구사항에 달려 있어요.

출처: 문서

본문

Agent Card의 역할

Agent Card는 A2A 서버(원격 에이전트)의 디지털 "명함" 역할을 하는 JSON 문서예요. 에이전트 발견과 상호작용에 중요하죠. Agent Card에 포함된 핵심 정보는 다음과 같아요.

  • 정체성(Identity): name, description, provider 정보를 포함해요.
  • 서비스 엔드포인트(Service Endpoint): A2A 서비스의 url을 지정해요.
  • A2A 역량(A2A Capabilities): streaming, pushNotifications 같은 지원 기능을 나열해요.
  • 인증(Authentication): 필요한 schemes(예: "Bearer", "OAuth2")를 상세히 기술해요.
  • 스킬(Skills): AgentSkill 객체로 에이전트의 작업을 설명해요. id, name, description, inputModes, outputModes, examples를 포함해요.

클라이언트 에이전트는 Agent Card를 사용해 에이전트의 적합성을 판단하고, 요청을 구성하고, 안전한 통신을 보장해요.

발견 전략(Discovery Strategies)

다음 섹션은 클라이언트 에이전트가 원격 Agent Card를 발견하는 데 쓰는 일반적인 전략을 설명해요.

1. 잘 알려진 URI(Well-Known URI)

이 접근 방식은 공개 에이전트나 특정 도메인 내에서 널리 발견되도록 의도된 에이전트에 권장돼요.

  • 메커니즘: A2A 서버는 자신의 도메인에 표준화된 well-known URI에 Agent Card를 호스팅해 발견 가능하게 해요. 표준 경로는 RFC 8615 원칙을 따르는 https://{agent-server-domain}/.well-known/agent-card.json이에요.
  • 과정:
    1. 클라이언트 에이전트는 잠재 A2A 서버의 도메인을 알거나 프로그래밍 방식으로 발견해요(예: smart-thermostat.example.com).
    2. 클라이언트는 https://smart-thermostat.example.com/.well-known/agent-card.json에 HTTP GET 요청을 보내요.
    3. Agent Card가 존재하고 접근 가능하면 서버는 JSON 응답으로 반환해요.
  • 장점: 구현이 쉬움, 표준을 따름, 자동 발견 촉진.
  • 고려사항: 개방형 또는 도메인 통제 발견 시나리오에 가장 적합. Agent Card에 민감한 세부사항이 포함되면 이를 서빙하는 엔드포인트에서 인증이 필요해요.

2. 큐레이션된 레지스트리(카탈로그 기반 발견)

이 접근 방식은 엔터프라이즈 환경이나 공개 마켓플레이스에서 사용돼요. Agent Card가 중앙 레지스트리로 관리되는 경우가 많죠. 큐레이션된 레지스트리는 중앙 저장소 역할을 해서, 클라이언트가 "스킬"이나 "태그" 같은 기준으로 에이전트를 질의하고 발견하게 해요.

  • 메커니즘: 중간 서비스(레지스트리)가 Agent Card 모음을 유지해요. 클라이언트는 다양한 기준(예: 제공 스킬, 태그, 제공자 이름, 역량)으로 이 레지스트리를 질의해 에이전트를 찾아요.
  • 과정:
    1. A2A 서버가 자신의 Agent Card를 레지스트리에 게시해요.
    2. 클라이언트 에이전트가 레지스트리의 API를 질의하고 "특정 스킬" 같은 기준으로 검색해요.
    3. 레지스트리가 일치하는 Agent Card 또는 참조를 반환해요.
  • 장점: 중앙화된 관리와 거버넌스, 역량 기반 발견(예: 스킬별), 접근 제어와 신뢰 프레임워크 지원, 개인 및 공개 마켓플레이스 모두에 적용 가능.
  • 고려사항: 레지스트리 서비스의 배포와 유지가 필요. 현재 A2A 스펙은 큐레이션된 레지스트리용 표준 API를 규정하지 않아요.

3. 직접 구성 / 비공개 발견(Direct Configuration / Private Discovery)

이 접근 방식은 밀접하게 결합된 시스템, 비공개 에이전트, 또는 개발 목적에서 사용돼요. 클라이언트가 Agent Card 정보나 URL로 직접 구성되는 경우죠.

  • 메커니즘: 클라이언트 애플리케이션은 하드코딩된 세부사항, 구성 파일, 환경 변수, 또는 독점 API를 사용해 발견해요.
  • 과정: 과정은 애플리케이션의 배포·구성 전략에 따라 특정적이에요.
  • 장점: 알려진 정적 관계 내에서 연결을 설정하는 데 직관적이에요.
  • 고려사항: 동적 발견 시나리오에는 유연하지 않음. Agent Card 정보가 바뀌면 클라이언트 재구성이 필요. 독점 API 기반 발견은 표준화가 부족하기도 해요.

Agent Card 보안(Securing Agent Cards)

Agent Card에는 민감한 정보가 포함돼요. 예를 들어.

  • 내부 또는 제한된 에이전트의 URL.
  • 민감한 스킬의 설명.

보호 메커니즘

위험을 완화하려면 다음 보호 메커니즘을 고려해야 해요.

  • 인증된 Agent Card(Authenticated Agent Cards): 민감한 정보나 더 상세한 버전의 카드를 서빙할 때 인증된 확장 agent card 사용을 권장해요.
  • 보안 엔드포인트(Secure Endpoints): Agent Card를 서빙하는 HTTP 엔드포인트(예: /.well-known/agent-card.json 또는 레지스트리 API)에 접근 제어를 구현해요. 방법에는 다음이 있어요.
    • 상호 TLS(mTLS)
    • 네트워크 제한(예: IP 범위)
    • HTTP 인증(예: OAuth 2.0)
  • 레지스트리 선택적 공개(Registry Selective Disclosure): 레지스트리는 클라이언트의 정체성과 권한에 따라 서로 다른 Agent Card를 반환해요.

민감한 데이터를 담은 Agent Card는 인증과 권한 부여 메커니즘으로 반드시 보호해야 해요. A2A 스펙은 Agent Card 안에 정적 비밀을 넣는 대신 대역외(OOB, out-of-band) 동적 자격 증명을 사용할 것을 강력히 권장해요.

캐싱 고려사항(Caching Considerations)

Agent Card는 에이전트 역량을 기술하며 대개 자주 바뀌지 않아요. 예를 들어 스킬이 추가되거나 인증 요구사항이 업데이트될 때 정도죠. Agent Card 엔드포인트에 표준 HTTP 캐싱 관행을 적용하면 불필요한 네트워크 요청을 줄이면서 클라이언트가 결국 업데이트된 정보를 받도록 보장해요.

서버 지침

Agent Card 엔드포인트를 호스팅하는 서버는 응답에 HTTP 캐싱 헤더를 포함해야 해요. 적절한 max-age 지시어가 있는 Cache-Control 헤더는 클라이언트와 중간자가 지정된 기간 동안 카드를 캐시하게 해요. 카드의 version 필드나 콘텐츠 해시에서 파생된 ETag 헤더를 포함하면 클라이언트가 조건부 요청을 하고 변경되지 않은 카드를 다시 다운로드하는 것을 피할 수 있어요.

클라이언트 지침

Agent Card를 가져오는 클라이언트는 표준 HTTP 캐싱 의미를 존중해야 해요. 캐시된 카드가 만료되면 클라이언트는 전체 카드를 무조건 다시 가져오기보다 조건부 요청(예: 저장된 ETag를 쓰는 If-None-Match 또는 If-Modified-Since)을 사용해야 해요. 서버가 캐싱 헤더를 제공하지 않으면 클라이언트는 합리적인 기본 캐시 기간을 적용할 수 있어요. 확장 Agent Card의 경우 클라이언트는 스펙에 기술된 세션 범위 캐싱 지침도 따라야 해요. 규범적 요구사항은 스펙의 8.6절을 참고하세요.

향후 고려사항

A2A 커뮤니티는 레지스트리 상호작용이나 고급 발견 프로토콜의 표준화를 탐색하고 있어요.

더 알아보기 (Learn more)