Claude Platform Docs
관리자인증

WIF 참조

Workload Identity Federation을 위한 환경 변수, 검증 규칙, 프로필 구성 및 오류 참조입니다.

이 페이지는 Workload Identity Federation의 구성 인터페이스, 검증 제약 조건 및 오류 매핑을 모아 놓은 것입니다. 설정 안내는 공급자 가이드를 참조하세요.

토큰 교환 요청

POST /v1/oauth/tokenRFC 7523 jwt-bearer 그랜트를 사용하는 JSON 본문을 받습니다. SDK는 환경 변수로부터 이 요청을 자동으로 구성합니다. 각 공급자 가이드의 cURL 예제는 원시 본문을 보여 줍니다.

필드필수 여부설명
grant_type항상 urn:ietf:params:oauth:grant-type:jwt-bearer입니다.
assertionID 공급자가 발급한 OIDC JWT입니다.
federation_rule_id평가할 페더레이션 규칙의 태그된 ID(fdrl_...)입니다.
organization_idAnthropic 조직의 UUID입니다.
service_account_id대상 서비스 계정의 태그된 ID(svac_...)입니다.
workspace_id조건부발급되는 토큰의 범위를 지정할 워크스페이스의 태그된 ID(wrkspc_...) 또는 조직의 기본 워크스페이스를 나타내는 리터럴 default입니다. 규칙이 둘 이상의 워크스페이스에 대해 활성화된 경우 필수입니다. 생략하면 서버가 규칙의 유일한 활성 워크스페이스를 선택합니다.

토큰 교환 응답

POST /v1/oauth/token은 표준 OAuth 2.0 토큰 응답(RFC 6749 §5.1)을 반환합니다:

필드타입설명
access_tokenstringsk-ant-oat01-... 접두사가 붙은 단기 Anthropic 토큰입니다. Authorization: Bearer <token>으로 전달하세요.
token_typestring항상 Bearer입니다.
expires_ininteger토큰이 만료될 때까지의 초 단위 시간입니다.
scopestring일치한 규칙이 부여한 OAuth 범위입니다.

환경 변수

SDK는 생성자 인수 없이 페더레이션 토큰 교환을 수행하기 위해 다음 변수를 읽습니다.

변수필수 여부설명예시
ANTHROPIC_FEDERATION_RULE_ID평가할 페더레이션 규칙의 태그된 ID입니다.fdrl_...
ANTHROPIC_ORGANIZATION_IDAnthropic 조직의 UUID입니다. Claude Console의 Settings > Organization에서 확인할 수 있습니다.00000000-0000-0000-0000-000000000000
ANTHROPIC_IDENTITY_TOKEN_FILE_TOKEN_FILE 또는 _TOKEN 중 하나"identity provider"(ID 공급자), 즉 IdP가 발급한 JWT의 파일 시스템 경로입니다. SDK는 디스크에서 교체되는 프로젝션된 토큰이 항상 최신 상태가 되도록 매 교환 시마다 이 파일을 다시 읽습니다./var/run/secrets/anthropic.com/token
ANTHROPIC_IDENTITY_TOKEN_TOKEN_FILE 또는 _TOKEN 중 하나문자열 형태의 리터럴 JWT입니다. 플랫폼이 토큰을 파일이 아닌 환경 변수로 주입하는 경우에 사용하세요.eyJhbGciOiJSUzI1NiIs...
ANTHROPIC_SERVICE_ACCOUNT_ID발급된 액세스 토큰이 대행할 대상 Anthropic 서비스 계정의 태그된 ID입니다.svac_...
ANTHROPIC_WORKSPACE_ID조건부발급되는 토큰의 범위를 지정할 워크스페이스의 태그된 ID 또는 리터럴 default입니다. 페더레이션 규칙이 둘 이상의 워크스페이스에 대해 활성화된 경우 필수이며, 규칙이 단일 워크스페이스에 바인딩된 경우 선택 사항입니다. 발급되는 토큰은 교환 시점에 이 워크스페이스로 범위가 지정되므로, 워크스페이스를 전환하려면 새로운 교환이 필요합니다.wrkspc_...
ANTHROPIC_PROFILE아니요로드할 구성 프로필의 이름입니다. 이 표의 페더레이션 환경 변수보다 우선합니다.staging-profile

직접 환경 변수 페더레이션 경로는 ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID, 그리고 ANTHROPIC_IDENTITY_TOKEN_FILE 또는 ANTHROPIC_IDENTITY_TOKEN 중 하나가 모두 설정된 경우에만 활성화됩니다. ANTHROPIC_WORKSPACE_ID는 함께 읽히지만 활성화 여부를 결정하지는 않습니다.

자격 증명 우선순위

SDK는 다음 순서로 자격 증명을 확인합니다. 자격 증명을 제공하는 첫 번째 소스가 선택됩니다.

순서소스참고
1생성자 인수(api_key=, auth_token=, credentials=)항상 다른 모든 것보다 우선합니다.
2ANTHROPIC_API_KEY 또는 ANTHROPIC_AUTH_TOKEN페더레이션을 완전히 가립니다. API 키에서 마이그레이션할 때는 이 변수들을 unset하세요.
3ANTHROPIC_PROFILE<config_dir>/configs/<name>.json을 로드합니다. 지정된 이름의 프로필이 없으면 다음 단계로 넘어가지 않고 오류가 발생합니다.
4페더레이션 환경 변수ANTHROPIC_FEDERATION_RULE_ID + ANTHROPIC_ORGANIZATION_ID + ANTHROPIC_SERVICE_ACCOUNT_ID + ANTHROPIC_IDENTITY_TOKEN[_FILE].
5활성 프로필<config_dir>/active_config에서 확인하며, 없으면 default라는 이름의 프로필로 대체합니다.

프로필이 로드되면 환경 변수는 프로필이 생략한 필드를 채우지만, 프로필이 명시적으로 설정한 필드는 절대 덮어쓰지 않습니다. 예를 들어 ANTHROPIC_WORKSPACE_ID는 활성 프로필이 workspace_id를 설정하지 않은 경우에만 이를 채웁니다.

프로필 구성 파일

프로필은 SDK와 ant CLI가 모두 읽는 이름이 지정된 구성 파일입니다. 프로필을 사용하면 컨테이너 이미지와 함께 페더레이션 매개변수를 배포하거나 코드를 변경하지 않고 환경 간에 전환할 수 있습니다.

구성 디렉터리

SDK는 다음 순서로 구성 디렉터리를 찾습니다:

  1. $ANTHROPIC_CONFIG_DIR
  2. Linux 및 macOS의 경우 ~/.config/anthropic
  3. Windows의 경우 %APPDATA%\Anthropic

활성 프로필

활성 프로필 이름은 다음 순서로 확인됩니다:

  1. $ANTHROPIC_PROFILE
  2. <config_dir>/active_config의 내용(ant profile activate <name>이 작성하는 한 줄짜리 파일)
  3. 리터럴 이름 default

Claude Code와 Claude Agent SDK도 동일한 확인 순서를 따르므로, 여기에서 구성한 페더레이션 프로필은 추가 설정 없이 해당 도구들도 인증합니다.

파일 레이아웃

경로내용민감도
<config_dir>/configs/<profile>.jsonversion, authentication 블록, organization_id, workspace_id, base_url.비밀이 아님. 커밋하거나 이미지에 포함해도 안전합니다.
<config_dir>/credentials/<profile>.jsonversion, 캐시된 access_token, expires_at, 그리고 (대화형 로그인의 경우) refresh_token.비밀. SDK가 모드 0600으로 작성합니다.

구성 파일과 자격 증명 파일 모두 major.minor 형식(현재 "1.0")의 최상위 문자열 version 필드를 가집니다. SDK는 향후 릴리스에서 이전 형식을 감지하고 마이그레이션할 수 있도록 이 필드를 자동으로 작성합니다. 구성을 직접 작성할 때 이 필드를 생략하면 SDK는 해당 파일을 현재 버전으로 취급합니다.

페더레이션 프로필 예시

configs/production.json
{
  "version": "1.0",
  "authentication": {
    "type": "oidc_federation",
    "federation_rule_id": "fdrl_...",
    "service_account_id": "svac_...",
    "identity_token": {
      "source": "file",
      "path": "/var/run/secrets/anthropic.com/token"
    }
  },
  "organization_id": "00000000-0000-0000-0000-000000000000",
  "workspace_id": "wrkspc_...",
  "base_url": "https://api.anthropic.com"
}

authentication.identity_token이 생략되면 SDK는 환경의 ANTHROPIC_IDENTITY_TOKEN_FILE 또는 ANTHROPIC_IDENTITY_TOKEN으로 대체합니다.

OAuth 범위

페더레이션 규칙에 설정하는 oauth_scope는 발급된 액세스 토큰이 호출할 수 있는 Claude API 엔드포인트를 결정합니다.

범위접근 권한 부여 대상
workspace:developer규칙의 워크스페이스에 있는 모든 비관리 Claude API 엔드포인트: Messages(스트리밍 및 토큰 카운팅 포함), Models, Managed Agents 및 해당 세션, Files, Skills. 이는 동일한 워크스페이스의 워크스페이스 API 키가 갖는 접근 권한과 일치합니다.
workspace:inference규칙의 워크스페이스에 있는 추론 엔드포인트: Messages(스트리밍 및 토큰 카운팅 포함), Models, OpenAI 호환 채팅 엔드포인트. Claude를 호출하기만 하고 Files, Skills 또는 기타 리소스를 관리할 필요가 없는 워크로드에 사용하세요.
workspace:manage_tunnelsMCP 터널 API: 터널 생성, 목록 조회 및 조회, CA 인증서 등록 및 보관, 터널 토큰 표시 및 교체, 터널 보관. Console의 터널 생성 모달 창에서 규칙을 생성하면 이 범위로 고정됩니다.
org:adminAdmin API에 대한 전체 접근 권한(조직 구성원, 초대, 워크스페이스, API 키 등). OAuth org:admin 토큰은 workspace:developer 또는 workspace:inference 범위의 규칙만 생성하거나 수정할 수 있으며, 다른 범위의 규칙을 뒷받침하는 발급자는 업데이트할 수 없습니다. 제약 조건을 참조하세요.

토큰의 범위를 벗어난 엔드포인트에 대한 요청은 HTTP 403을 반환합니다. 더 세분화된 범위(리소스별 또는 읽기/쓰기 구분)는 현재 제공되지 않습니다.

권한 경계

페더레이션 규칙의 oauth_scope는 상한선입니다. 발급된 토큰은 이를 절대 초과할 수 없습니다. 대상 서비스 계정의 organization_role(developer 또는 admin)이 부여 가능한 범위를 결정하므로, org:admin을 부여하는 규칙은 organization_role=admin인 서비스 계정을 대상으로 해야 합니다. 유효 권한은 규칙의 범위와 서비스 계정 역할의 교집합입니다.

규칙 oauth_scope서비스 계정 organization_role유효 권한
workspace:developeradmin규칙의 워크스페이스에서만 Claude API 접근 가능. 범위가 토큰을 역할보다 낮게 제한합니다.
org:adminadminOAuth 호출자 예외 사항을 제외한 전체 Admin API 접근 권한(조직 구성원, 초대, 워크스페이스, API 키 등). 제약 조건을 참조하세요.

검증 규칙

Anthropic은 발급자와 규칙을 생성하거나 업데이트할 때, 그리고 교환 시점에 수신된 JWT를 검증할 때 다음 제약 조건을 적용합니다.

전체 매개변수 세부 정보와 응답 스키마는 서비스 계정 API 참조, 페더레이션 발급자 API 참조, 페더레이션 규칙 API 참조를 참조하세요.

리소스 필드

필드제약 조건
발급자, 규칙 및 서비스 계정 name^[a-z0-9-]+$와 일치해야 하며, 길이는 1~255자입니다.
workspace_idapplies_to_all_workspaces가 true가 아닌 한 생성 시 필수입니다. 이 규칙에 따라 발급된 토큰에 할당량, 청구 및 속도 제한이 적용되는 워크스페이스(wrkspc_...)입니다. 동일한 조직의 워크스페이스여야 하며, 대상 서비스 계정이 해당 워크스페이스의 구성원이어야 합니다.
applies_to_all_workspaces불리언. 하나의 워크스페이스를 지정하는 대신 조직의 모든 워크스페이스에서 규칙을 활성화하려면 true로 설정하세요. 생성 시 이 필드 또는 workspace_id 중 하나가 필수입니다.
token_lifetime_seconds60에서 86400 사이의 정수(1분~24시간). 기본값은 3600입니다. 이 범위를 벗어난 값은 요청 시점에 거부됩니다. 토큰 수명 및 갱신을 참조하세요.

URL 필드

issuer_url, jwks.discovery_base, jwks.url 필드는 다음과 같이 검증됩니다:

제약 조건세부 사항
스킴https여야 합니다.
포트443이어야 합니다(명시적 또는 기본값).
호스트OIDC 공급자의 공개 DNS 호스트 이름이어야 합니다. 공개 IP 주소로 확인되어야 하며, IP 리터럴은 허용되지 않습니다.

URL 검증 실패는 오류 메시지 앞에 필드 이름이 접두사로 붙은 400 invalid_request_error를 반환합니다(예: issuer_url: url must use https scheme).

JWT 검증

제약 조건세부 사항
최대 크기assertion JWT는 최대 16 KiB여야 합니다.
서명 알고리즘비대칭 알고리즘(RSA 및 ECDSA 계열: ES256, ES384, ES512, RS256, RS384, RS512, PS256, PS384, PS512)만 허용됩니다. HMAC(HS256, HS384, HS512) 및 none은 거부됩니다.
키 IDJWT 헤더에는 발급자의 JWKS에 있는 키와 일치하는 kid가 있어야 합니다. kid가 없는 토큰은 거부됩니다.
필수 클레임sub가 있어야 합니다. iat가 있어야 하며 미래 시점이 아니어야 합니다. exp가 있어야 하며 미래 시점이어야 합니다.
일회 사용jti 클레임이 있는 assertion은 발급자당 한 번만 교환할 수 있습니다. 동일한 jti로 교환을 반복하면 재전송(replay)으로 거부됩니다. 발급자의 check_jti 필드(기본적으로 활성화됨)가 이 검사를 제어하며, jti 클레임이 없는 assertion은 이 검사의 대상이 아닙니다. 페더레이션 발급자 API 참조를 참조하세요.
최대 수명토큰의 수명(exp에서 iat를 뺀 값)은 발급자에 구성된 최대값(기본 1시간, Claude Console에서 발급자별로 구성 가능)을 초과할 수 없습니다.
시계 오차exp, nbf, iat에 30초의 여유가 적용됩니다.

규칙 매칭 의미론

페더레이션 규칙의 match 블록은 수신된 JWT의 수락 여부를 결정합니다. 채워진 모든 필드는 AND 의미론으로 평가됩니다. 즉, JWT는 채워진 모든 매처를 만족해야 합니다. subject_prefix, claims, condition 중 적어도 하나는 설정되어야 하며, audience만 포함하거나 매처가 전혀 없는 match 블록은 거부됩니다. 이는 발급자의 모든 토큰을 수락하는 규칙을 방지하기 위한 것입니다.

매처타입의미론
subject_prefixstringJWT sub 클레임과 정확히 일치해야 합니다. 끝에 *가 있으면 접두사 일치가 됩니다(sub 값이 * 앞의 문자들로 시작해야 함). 대소문자를 구분합니다.
audiencestringJWT aud 클레임에 이 정확한 문자열이 포함되어야 합니다. aud가 배열인 경우 정확히 일치하는 요소가 하나라도 있으면 검사를 통과합니다.
claimsmap<string, string>각 키는 최상위 클레임 이름이고 각 값은 요구되는 정확한 문자열 값입니다. 중첩, 숫자, 불리언 또는 리스트와 맵 같은 복잡한 클레임의 경우 대신 CEL 표현식과 함께 condition을 사용하세요.
conditionstring (CEL)true로 평가되어야 하는 CEL 표현식입니다.

CEL 평가 환경

condition 표현식은 단일 변수에 접근할 수 있습니다:

변수타입내용
claimsmap디코딩된 전체 JWT 클레임 집합입니다. 중첩된 객체는 중첩된 맵으로 접근할 수 있습니다.

예시:

claims.sub.startsWith("repo:acme-corp/") && claims.ref in ["refs/heads/main", "refs/heads/release"]

오류

토큰 교환 오류

POST /v1/oauth/token은 표준 API 오류 형식으로 오류를 반환합니다. SDK는 교환 실패를 HTTP 상태, 응답 본문 및 request_id를 노출하는 타입이 지정된 FederationExchangeError(또는 언어별 동등 항목)로 래핑합니다.

상태오류원인해결 방법
400invalid_request_errorfederation_rule_id의 형식이 잘못되었거나 필수 요청 필드가 누락되었습니다.fdrl_ ID를 확인하고 요청 본문에 모든 필수 필드가 포함되어 있는지 확인하세요.
400invalid_request_errorworkspace_id가 있지만 올바른 형식의 wrkspc_... ID 또는 리터럴 default가 아닙니다.workspace_id 값을 수정하세요. 응답 메시지에 예상 형식이 명시됩니다.
401authentication_errorJWT iss 클레임이 등록된 issuer_url과 정확히 일치하지 않습니다.끝의 슬래시와 스킴을 포함하여 바이트 단위로 비교하세요: jq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson | .iss' <<< "$JWT".
401authentication_errorJWKS 가져오기에 실패했거나, JWKS가 오래되었거나, JWT가 JWKS에 없는 키로 서명되었습니다.inline 모드의 경우 교체된 키로 발급자를 업데이트하세요. discoveryexplicit_url의 경우 JWKS 엔드포인트가 포트 443에서 접근 가능한지 확인하세요. 발급자가 최근에 서명 키를 교체했다면 키 교체 및 캐싱을 참조하세요.
401authentication_errorJWT exp 클레임이 과거 시점입니다(30초 오차 허용 범위 초과).ID 공급자가 새로운 토큰을 프로젝션하고 있는지, SDK가 토큰 파일을 다시 읽고 있는지 확인하세요.
401authentication_errorJWT는 검증되었지만 클레임이 규칙의 match 블록을 만족하지 않습니다.JWT를 디코딩하고 각 클레임을 규칙과 비교하세요. subject_prefix는 대소문자를 구분합니다. audience는 정확한 요소 일치가 필요합니다.
401authentication_errorfederation_rule_id가 존재하지 않거나, 보관되었거나, JWT가 해당 규칙에 대해 권한이 없습니다(열거 공격 방지를 위해 통합됨).Claude Console에서 규칙 ID를 확인하고 규칙이 보관되지 않았는지 확인하세요.
401authentication_error페더레이션 규칙이 둘 이상의 워크스페이스에 대해 활성화되어 있고 요청에 workspace_id가 생략되었습니다. 인증 기록 항목에 사유 workspace_id_required가 표시됩니다.ANTHROPIC_WORKSPACE_ID(또는 원시 요청의 경우 workspace_id 본문 필드)를 토큰 범위로 지정할 wrkspc_... ID로 설정하세요. 토큰 교환 요청을 참조하세요.

모든 assertion 거부는 어떤 검사가 실패했는지와 관계없이 고정 메시지 Authentication failed와 함께 동일한 불투명한 401 authentication_error를 반환합니다. 구별 가능한 오류는 호출자가 규칙 구성을 탐색할 수 있게 하기 때문입니다. 거부 사유는 인증 기록의 해당 시도 항목에 기록됩니다. 예를 들어 sub 클레임이 규칙의 subject_prefix를 통과하지 못하면 match_subject_prefix, 규칙이 여러 워크스페이스에 걸쳐 있고 요청이 아무것도 지정하지 않으면 workspace_id_required가 기록됩니다. 규칙의 조직이 확인되기 전에 거부된 요청(위의 400 invalid_request_error 계열)은 기록 항목을 남기지 않으며, 응답 메시지에 문제가 직접 명시됩니다. 일치하는 기록 항목이 없는 401은 일반적으로 federation_rule_id 자체가 인식되지 않았음을 의미합니다.

일반적인 SDK 측 실패

증상원인해결 방법
SDK가 교환하는 대신 "no credentials"를 보고함ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID, ANTHROPIC_IDENTITY_TOKEN[_FILE] 중 하나가 설정되지 않았고 활성 프로필이 없습니다.네 변수를 모두 설정하거나 프로필을 구성하세요.
SDK가 페더레이션 대신 API 키로 인증함ANTHROPIC_API_KEY 또는 ANTHROPIC_AUTH_TOKEN이 설정되어 우선순위에서 이깁니다.키 또는 토큰 변수를 unset하세요.
첫 요청 시 FileNotFoundErrorANTHROPIC_IDENTITY_TOKEN_FILE의 경로가 존재하지 않습니다. SDK는 교환 시점에 파일을 지연 방식으로 엽니다.프로젝션된 토큰 볼륨이 마운트되어 있고 경로가 일치하는지 확인하세요.
토큰 교환은 성공하지만 Claude API 요청이 403을 반환함발급된 토큰의 범위가 해당 엔드포인트에 대한 접근 권한을 부여하지 않습니다.규칙의 oauth_scopeOAuth 범위와 대조하여 확인하세요.
빈 자격 증명으로 인증 실패자격 증명 환경 변수가 export되었지만 빈 문자열로 설정되어 있습니다. 빈 값도 우선순위 자리를 차지합니다.VAR="" 대신 unset VAR로 변수를 unset하세요.

실패한 교환 문제 해결

401 authentication_error 응답은 의도적으로 불투명하며 메시지는 항상 Authentication failed입니다. 거부 사유는 응답이 아닌 인증 기록에 기록됩니다.

흔한 불투명 실패 중 하나는 재전송된 assertion입니다. jti 클레임이 있는 assertion은 한 번만 교환할 수 있으므로, 동일한 JWT를 다시 보내는 워크로드(재시도 루프 또는 교체되지 않은 토큰을 다시 읽는 갱신)는 두 번째 교환에서 거부됩니다. 인증 기록 페이지에는 이러한 시도가 사유 jti_reused와 함께 표시되며, 해결 방법은 매 교환마다 새로운 assertion을 발급하는 것입니다.

여전히 JWT 자체에서 디버깅해야 한다면 다음 검사를 순서대로 진행하세요:

  1. JWT 디코딩

    각 클레임을 발급자 및 규칙 구성과 비교할 수 있도록 전송한 assertion을 디코딩하세요:

    cURL
    jq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson' <<< "$JWT"
  2. iss가 발급자와 일치하는지 확인

    디코딩된 iss 클레임은 스킴, 포트 및 끝의 슬래시를 포함하여 등록된 issuer_url과 바이트 단위로 일치해야 합니다. 단 한 글자라도 불일치하면 검증에 실패합니다.

  3. aud가 규칙과 일치하는지 확인

    디코딩된 aud 클레임에는 규칙의 audience 값이 정확히 일치하는 형태로 포함되어야 합니다. aud가 배열인 경우 하나의 요소가 정확히 일치해야 합니다.

  4. sub 및 각 claims 항목 확인

    sub를 규칙의 subject_prefix와 비교하세요(대소문자 구분, 끝의 *는 접두사 일치이며 그 외는 정확한 일치). 규칙의 claims 맵에 있는 모든 키를 같은 이름의 최상위 클레임과 비교하세요.

  5. exp, nbf, iat 확인

    exp는 미래 시점이어야 하고 nbf/iat는 과거 시점이어야 하며, 30초 오차 허용 범위 내에 있어야 합니다. 워크로드 호스트의 시계가 어긋나 있으면 그 외에는 유효한 토큰도 거부됩니다.

  6. JWKS 접근 가능성 확인

    discovery 모드의 경우 포트 443의 공개 HTTPS를 통해 <jwks.discovery_base or issuer_url>/.well-known/openid-configuration을 가져와 jwks_uri가 확인되는지 확인하세요. explicit_url의 경우 JWKS URL을 직접 가져오세요. inline의 경우 키를 등록한 이후 발급자의 서명 키가 교체되지 않았는지 확인하세요.

    발급자가 서명 키를 교체하고 즉시 해당 키로 서명을 시작한 경우, Anthropic의 JWKS 캐시가 갱신되는 동안 최대 1분간 교환이 실패할 수 있습니다. 키 교체 및 캐싱을 참조하세요.

JWKS 소스 모드

페더레이션 발급자를 등록할 때 jwks 필드는 Anthropic이 해당 발급자의 JWT 서명을 검증하는 데 사용하는 공개 키를 얻는 방법을 제어합니다. 이는 type을 키로 하는 구별된 유니온(discriminated union)입니다:

jwks.typejwks 형태동작사용 시점
discovery(기본값){ "type": "discovery", "discovery_base": "https://..." }(discovery_base는 선택 사항이며, 디스커버리 URL이 issuer_url과 다를 때 설정)Anthropic이 <discovery_base or issuer_url>/.well-known/openid-configuration을 가져와 디스커버리 문서에서 jwks_uri를 읽고 거기서 JWKS를 가져옵니다.IdP가 공개 인터넷에서 표준 OIDC 디스커버리 문서를 제공하는 경우. 대부분의 관리형 공급자(EKS, GKE, Cloud Run, GitHub Actions, Entra ID)가 이를 지원합니다.
explicit_url{ "type": "explicit_url", "url": "https://..." }Anthropic이 url에서 JWKS를 직접 가져옵니다. issuer_url은 JWT iss 클레임과의 문자열 비교에만 사용되며 절대 접속하지 않습니다.IdP가 디스커버리 문서를 제공하지 않거나, 디스커버리는 내부 전용이지만 JWKS는 공개적으로 접근 가능한 경우.
inline{ "type": "inline", "keys": [...] }JWK 객체 배열을 인라인으로 제공합니다(래퍼 객체가 아닌 JWKS 문서의 keys 배열). Anthropic은 아웃바운드 요청을 하지 않습니다. issuer_urliss 비교에만 사용됩니다.에어갭 환경, 클러스터 내부 발급자 URL을 사용하는 자체 관리형 Kubernetes 클러스터, 또는 키 교체를 명시적으로 제어하려는 경우.

구별된 유니온은 구조적으로 동반 필드들을 상호 배타적으로 만듭니다. discoveryexplicit_url 모두 사설 CA로 TLS를 제공하는 발급자를 위해 선택적 ca_cert_pem 문자열도 허용합니다.

키 교체 및 캐싱

discoveryexplicit_url 모드에서 Anthropic은 가져온 JWKS를 캐시합니다. ID 공급자가 새 서명 키를 게시하고 즉시 해당 키로 토큰 서명을 시작하면, 캐시가 갱신되는 동안 최대 1분간 해당 토큰을 제시하는 교환이 서명 오류로 실패할 수 있습니다.

이 기간을 피하려면 ID 공급자가 새 서명 키로 토큰 서명을 시작하기 최소 15분 전에 JWKS에 새 서명 키를 게시하고, 대체된 키로 서명된 토큰이 만료될 때까지 해당 키를 JWKS에 유지하세요. 관리형 ID 공급자는 일반적으로 자체적으로 이 원칙을 따릅니다. 자체 발급자(자체 관리형 Kubernetes 클러스터, SPIRE OIDC 디스커버리 공급자, 또는 교체 주기가 구성된 Okta 커스텀 인가 서버)를 운영하는 경우, 교체 정책이 최초 사용 전에 새 키를 게시하는지 확인하세요.

Was this page helpful?