엔드포인트 참조: 에이전트 ID HTTP API용 SDK Microsoft Entra

이 문서에서는 AgentID용 Microsoft Entra SDK에서 노출하는 HTTP 엔드포인트에 대한 전체 참조를 제공합니다.

API 사양

OpenAPI 사양: /openapi/v1.json(개발 환경) 및 리포지토리에서 사용할 수 있습니다. https://github.com/AzureAD/microsoft-identity-web/blob/master/src/Microsoft.Identity.Web.Sidecar/OpenAPI/Microsoft.Identity.Web.Sidecar.json

이를 사용하여 다음을 수행합니다.

  • 클라이언트 코드 생성
  • 요청 유효성 검사
  • 사용 가능한 엔드포인트 검색

엔드포인트 개요

엔드포인트 메서드 목적 인증 필요
/Validate 가져오기 인바운드 전달자 토큰의 유효성을 검사하고 클레임을 반환합니다. Yes
/AuthorizationHeader/{serviceName} 가져오기 인바운드 토큰의 유효성을 검사하고(있는 경우) 다운스트림 API에 대한 권한 부여 헤더를 획득합니다. Yes
/AuthorizationHeaderUnauthenticated/{serviceName} 가져오기 인바운드 사용자 토큰 없이 권한 부여 헤더(앱 또는 에이전트 ID) 획득 Yes
/DownstreamApi/{serviceName} GET, POST, PUT, PATCH, DELETE 인바운드 토큰의 유효성을 검사하고(있는 경우) 자동 토큰 획득을 사용하여 다운스트림 API 호출 Yes
/DownstreamApiUnauthenticated/{serviceName} GET, POST, PUT, PATCH, DELETE 다운스트림 API 호출(앱 또는 에이전트 ID에만 해당) Yes
/healthz 가져오기 상태 프로브(활동성/준비 상태) 아니오
/openapi/v1.json 가져오기 OpenAPI 3.0 문서 아니요(개발 전용)

Authentication

모든 토큰 획득 및 유효성 검사 엔드포인트는 명시적으로 인증되지 않은 것으로 표시되지 않는 한 헤더에 Authorization 전달자 토큰이 필요합니다.

GET /AuthorizationHeader/Graph
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...

토큰은 구성된 Microsoft Entra ID 설정(테넌트, 대상 그룹, 발급자, 사용하도록 설정된 경우 범위)에 대해 유효성을 검사합니다.

/Validate

인바운드 전달자 토큰의 유효성을 검사하고 해당 클레임을 반환합니다.

요청

GET /Validate HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...

성공적인 응답(200)

{
  "protocol": "Bearer",
  "token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
  "claims": {
    "aud": "api://your-api-id",
    "iss": "https://sts.windows.net/tenant-id/",
    "iat": 1234567890,
    "nbf": 1234567890,
    "exp": 1234571490,
    "acr": "1",
    "appid": "client-id",
    "appidacr": "1",
    "idp": "https://sts.windows.net/tenant-id/",
    "oid": "user-object-id",
    "tid": "tenant-id",
    "scp": "access_as_user",
    "sub": "subject",
    "ver": "1.0"
  }
}

오류 예제

// 400 Bad Request - No token
{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "status": 400,
  "detail": "No token found"
}
// 401 Unauthorized - Invalid token
{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Unauthorized",
  "status": 401
}

/AuthorizationHeader/{serviceName}

구성된 다운스트림 API에 대한 액세스 토큰을 획득하고 권한 부여 헤더 값으로 반환합니다. 사용자 전달자 토큰이 인바운드로 제공되면 OBO(위임됨)가 사용됩니다. 그렇지 않으면 앱 컨텍스트 패턴이 적용됩니다(사용하도록 설정된 경우).

Path 매개 변수

  • serviceName – 구성의 다운스트림 API 이름

쿼리 매개 변수

표준 재정의

매개 변수 유형 Description 예시
optionsOverride.Scopes 문자열[] 구성된 범위 재정의(반복 가능) ?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read
optionsOverride.RequestAppToken 불리언 앱 전용 토큰 강제 적용(OBO 건너뛰기) ?optionsOverride.RequestAppToken=true
optionsOverride.AcquireTokenOptions.Tenant 문자열 테넌트 ID 재정의 ?optionsOverride.AcquireTokenOptions.Tenant=tenant-guid
optionsOverride.AcquireTokenOptions.PopPublicKey 문자열 PoP/SHR 사용(base64 공개 키) ?optionsOverride.AcquireTokenOptions.PopPublicKey=base64key
optionsOverride.AcquireTokenOptions.PopClaims 문자열 추가 PoP 클레임(JSON) ?optionsOverride.AcquireTokenOptions.PopClaims={"nonce":"abc"}

에이전트 ID

매개 변수 유형 Description 예시
AgentIdentity 문자열 에이전트 앱(클라이언트) ID ?AgentIdentity=11111111-2222-3333-4444-555555555555
AgentUsername 문자열 사용자 계정 이름(위임된 에이전트) ?AgentIdentity=<id>&AgentUsername=user@contoso.com
AgentUserId 문자열 사용자 개체 ID(위임된 에이전트) ?AgentIdentity=<id>&AgentUserId=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

규칙:

  • AgentUsername 또는 AgentUserId 필요 AgentIdentity (사용자 에이전트).
  • AgentUsernameAgentUserId 상호 배타적입니다.
  • AgentIdentity alone = 자율 에이전트입니다.
  • AgentIdentity + 사용자 인바운드 토큰 = 위임된 에이전트입니다.

예시

기본 요청:

GET /AuthorizationHeader/Graph HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
GET /AuthorizationHeader/Graph?optionsOverride.RequestAppToken=true HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
GET /AuthorizationHeader/Graph?AgentIdentity=agent-id HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...

응답

{
  "authorizationHeader": "Bearer eyJ0eXAiOiJKV1QiLCJhbGc..."
}

PoP/SHR 응답:

{
  "authorizationHeader": "PoP eyJ0eXAiOiJhdCtqd3QiLCJhbGc..."
}

/AuthorizationHeaderUnauthenticated/{serviceName}

인바운드 사용자 토큰과 동일한 /AuthorizationHeader/{serviceName} 동작 및 매개 변수가 필요하지 않습니다. 사용자 컨텍스트 없이 앱 전용 또는 자율/에이전트 ID 획득에 사용됩니다. 사용자 토큰의 유효성을 검사하는 오버헤드를 방지합니다.

요청

GET /AuthorizationHeaderUnauthenticated/Graph HTTP/1.1

응답

{
  "authorizationHeader": "Bearer eyJ0eXAiOiJKV1QiLCJhbGc..."
}

/DownstreamApi/{serviceName}

액세스 토큰을 획득하고 다운스트림 API에 대한 HTTP 요청을 수행합니다. 다운스트림 응답에서 상태 코드, 헤더 및 본문을 반환합니다. 사용자 OBO, 앱 전용 또는 에이전트 ID 패턴을 지원합니다.

Path 매개 변수

  • serviceName – 구성된 다운스트림 API 이름입니다.

추가 쿼리 매개 변수(매개 변수 추가 /AuthorizationHeader )

매개 변수 유형 Description 예시
optionsOverride.HttpMethod 문자열 HTTP 메서드 재정의 ?optionsOverride.HttpMethod=POST
optionsOverride.RelativePath 문자열 구성된 BaseUrl에 상대 경로 추가 ?optionsOverride.RelativePath=me/messages
optionsOverride.CustomHeader.<Name> 문자열 사용자 지정 헤더 추가 ?optionsOverride.CustomHeader.X-Custom=value

요청 본문 전달

본문은 변경되지 않은 상태로 전달됩니다.

POST /DownstreamApi/Graph?optionsOverride.RelativePath=me/messages HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Content-Type: application/json
{ 
  "subject": "Hello", 
   "body": { "contentType": "Text", "content": "Hello world" } 
}

응답

{
  "statusCode": 200,
  "headers": {
    "content-type": "application/json"
  },
  "content": "{\"@odata.context\":\"...\",\"displayName\":\"...\"}"
}

오류 미러 /AuthorizationHeader 및 다운스트림 API 오류 상태 코드

/DownstreamApiUnauthenticated/{serviceName}

인바운드 사용자 토큰과 동일 /DownstreamApi/{serviceName} 하지만 유효성은 검사되지 않습니다. 앱 전용 또는 자율 에이전트 작업에 사용합니다.

/healthz

기본 상태 프로브 엔드포인트입니다.

응답

정상(200):

HTTP/1.1 200 OK

비정상(503):

HTTP/1.1 503 Service Unavailable

/openapi/v1.json

OpenAPI 3.0 사양을 반환합니다(개발 환경에만 해당). 다음을 수행합니다.

  • 클라이언트 코드 생성
  • 요청 유효성 검사
  • 엔드포인트 검색

일반적인 오류 패턴

잘못된 요청(400)

누락된 서비스 이름:

// 400 Bad Request - Missing service name
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "Bad Request", "status": 400, "detail": "Service name is required" }

// 400 Bad Request - Invalid agent combination
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "Bad Request", "status": 400, "detail": "AgentUsername and AgentUserId are mutually exclusive" }

// 401 Unauthorized - Invalid token
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "Unauthorized", "status": 401 }

// 403 Forbidden - Missing scope
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.3", "title": "Forbidden", "status": 403, "detail": "The scope 'access_as_user' is required" }

// 404 Not Found - Service not configured
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4", "title": "Not Found", "status": 404, "detail": "Downstream API 'UnknownService' not configured" }

// 500 Internal Server Error - Token acquisition failure
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.6.1", "title": "Internal Server Error", "status": 500, "detail": "Failed to acquire token for downstream API" }

MSAL 오류 예제

{ "type": "https://tools.ietf.org/html/rfc7231#section-6.6.1", "title": "Internal Server Error", "status": 500, "detail": "MSAL.NetCore.invalid_grant: AADSTS50076: Due to a configuration change ...", "extensions": { "errorCode": "invalid_grant", "correlationId": "..." } }

전체 재정의 참조

optionsOverride.Scopes=<scope>     # Repeatable
optionsOverride.RequestAppToken=<true|false>
optionsOverride.BaseUrl=<url>
optionsOverride.RelativePath=<path>
optionsOverride.HttpMethod=<method>
optionsOverride.AcquireTokenOptions.Tenant=<tenant-id>
optionsOverride.AcquireTokenOptions.AuthenticationScheme=<scheme>
optionsOverride.AcquireTokenOptions.CorrelationId=<guid>
optionsOverride.AcquireTokenOptions.PopPublicKey=<base64-key>
optionsOverride.AcquireTokenOptions.PopClaims=<json>
optionsOverride.CustomHeader.<Name>=<value>

AgentIdentity=<agent-client-id>
AgentUsername=<user-upn>            # Requires AgentIdentity
AgentUserId=<user-object-id>        # Requires AgentIdentity

재정의의 예

범위 재정의:

GET /AuthorizationHeader/Graph?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...

속도 제한

에이전트 ID에 대한 Microsoft Entra SDK 자체는 속도 제한을 적용하지 않습니다. 유효 한도는 다음과 같습니다.

  1. Microsoft Entra ID 토큰 서비스 제한(SDK 캐시 토큰으로 발생하지 않아야 합니다).
  2. 다운스트림 API 제한
  3. 토큰 캐시 효율성(취득 볼륨 감소)

모범 사례

  1. 임시 재정의보다 구성을 선호합니다.
  2. 서비스 이름을 정적이고 선언적으로 유지합니다.
  3. 일시적인 오류에 대한 재시도 정책 구현(HTTP 500/503).
  4. 호출하기 전에 에이전트 매개 변수의 유효성을 검사합니다.
  5. 서비스 간 추적을 위한 상관 관계 ID를 기록합니다.
  6. 토큰 획득 대기 시간 및 오류 비율을 모니터링합니다.
  7. 오케스트레이션 플랫폼에서 상태 프로브를 사용합니다.