7장. 토큰 교환 사용
토큰 교환은 기술 프리뷰 이며 완전히 지원되지 않습니다. 이 기능은 기본적으로 비활성화되어 있습니다.
-Dkeycloak.profile=preview
또는 -Dkeycloak.profile.feature.token_exchange=enabled
로 서버를 시작하려면 다음을 수행하십시오. 자세한 내용은 프로필을 참조하십시오.
토큰 교환을 사용하려면 token_exchange
기능도 활성화해야 합니다. 프로필 을 참조하십시오.
7.1. 토큰 교환 방식
Red Hat Single Sign-On에서 토큰 교환은 완전히 다른 토큰을 얻기 위해 자격 증명 또는 토큰 세트를 사용하는 프로세스입니다. 클라이언트는 신뢰할 수 없는 애플리케이션에서 호출해야 하므로 현재 토큰을 다운그레이드할 수 있습니다. 클라이언트는 연결된 소셜 공급자 계정에 저장된 토큰에 대해 Red Hat Single Sign-On 토큰을 교환할 수 있습니다. 다른 Red Hat Single Sign-On 영역 또는 외부 IDP에서 Mint한 외부 토큰을 신뢰할 수 있습니다. 클라이언트는 사용자를 가장해야 할 수 있습니다. 다음은 토큰 교환과 관련된 Red Hat Single Sign-On의 현재 기능에 대한 간략한 요약입니다.
- 클라이언트는 다른 클라이언트를 대상으로 하는 새 토큰을 위해 특정 클라이언트에 대해 생성된 기존 Red Hat Single Sign-On 토큰을 교환할 수 있습니다.
- 클라이언트는 기존 Red Hat Single Sign-On 토큰을 외부 토큰(예: 연결된 Facebook 계정)으로 교환할 수 있습니다.
- 클라이언트는 Red Hat Single Sign-On 토큰의 외부 토큰을 교환할 수 있습니다.
- 클라이언트가 사용자 가장할 수 있습니다.
Red Hat Single Sign-On의 토큰 교환은 IETF에서 OAuth 토큰 교환 사양 구현이 매우 느렸습니다. 이를 약간 연장하고, 일부를 무시하며, 사양의 다른 부분을 느슨하게 해석했습니다. 영역의 OpenID Connect 토큰 끝점에서 간단한 부여 유형 호출입니다.
/auth/realms/{realm}/protocol/openid-connect/token
양식 매개변수(application/x-www-form-urlencoded
)를 입력으로 허용하며 출력은 교환을 요청한 토큰 유형에 따라 다릅니다. 토큰 교환은 클라이언트 끝점이므로 요청이 호출 클라이언트에 대한 인증 정보를 제공해야 합니다. 공용 클라이언트는 클라이언트 ID를 form 매개 변수로 지정합니다. 기밀 클라이언트는 양식 매개 변수를 사용하여 클라이언트 ID 및 시크릿, 기본 인증, 기본 인증을 전달할 수도 있지만 관리자가 해당 영역에 클라이언트 인증 흐름을 구성했습니다.
7.1.1. 매개 변수 양식
- client_id
- 필수 항목인. 이 매개변수는 인증에 양식 매개 변수를 사용하는 클라이언트에 필요합니다. Basic Auth, 클라이언트 JWT 토큰 또는 클라이언트 인증서 인증을 사용하는 경우 이 매개변수를 지정하지 마십시오.
- client_secret
- 필수 항목인. 이 매개변수는 인증에 양식 매개 변수를 사용하고 클라이언트 시크릿을 자격 증명으로 사용하는 클라이언트에 필요합니다. 영역의 클라이언트 호출이 다른 방법으로 인증되는 경우 이 매개 변수를 지정하지 마십시오.
- grant_type
-
필수 항목입니다. 매개변수 값은
urn:ietf:params:oauth:grant-type:token-exchange
이어야 합니다. - subject_token
- 선택사항입니다. 요청이 이루어진 당사자의 ID를 나타내는 보안 토큰입니다. 새 토큰의 기존 토큰을 교환하는 경우 필요합니다.
- subject_issuer
-
선택사항입니다.
subject_token
의 발급자를 식별합니다. 토큰이 현재 영역에서 가져오거나subject_token_type
에서 발행자를 결정할 수 있는 경우 비워 둘 수 있습니다. 그렇지 않으면 이를 지정해야 합니다. 유효한 값은 영역에 대해 구성된ID 공급자
의 별칭입니다. 또는 특정ID 공급자에 의해 구성된 발행자 클레임 식별자입니다
. - subject_token_type
-
선택사항입니다. 이 매개변수는
subject_token
매개변수와 함께 전달되는 토큰의 유형입니다.subject_token
이 영역에서 제공되며 액세스 토큰인 경우 기본값은urn:ietf:params:oauth:token-type:access_token
입니다. 외부 토큰인 경우subject_issuer
의 요구 사항에 따라 이 매개 변수를 지정하거나 지정하지 않아도 됩니다. - requested_token_type
-
선택사항입니다. 이 매개 변수는 클라이언트가 교환하려는 토큰 유형을 나타냅니다. 현재 oauth 및 OpenID Connect 토큰 유형만 지원됩니다. 이 기본값은 응답 내에서 액세스 토큰과 새로 고침 토큰을 모두 반환하는 경우
urn:ietf:params:oauth:token-type:refresh_token
인지 여부에 따라 달라집니다. 기타 적절한 값은urn:ietf:params:oauth:token-type:access_token
및urn:ietf:params:oauth:token-type:id_token
입니다. - 대상
- 선택사항입니다. 이 매개변수는 새 토큰이 Mint된 대상 클라이언트를 지정합니다.
- requested_issuer
-
선택사항입니다. 이 매개변수는 클라이언트가 외부 공급자가 Mint된 토큰을 가져오도록 지정합니다. 영역 내에 구성된
ID 공급자
의 별칭이어야 합니다. - requested_subject
- 선택사항입니다. 클라이언트가 다른 사용자로 가장하려는 경우 사용자 이름 또는 사용자 ID를 지정합니다.
- scope
- 구현되지 않습니다. 이 매개변수는 클라이언트가 요청하는 OAuth 및 OpenID Connect 범위의 대상 세트를 나타냅니다. 현재 구현되지 않지만 Red Hat Single Sign-On이 일반적으로 범위를 더 잘 지원하게 되면 됩니다.
현재 OpenID Connect 및 OAuth 교환만 지원합니다. 사용자 요구에 따라 SAML 기반 클라이언트 및 ID 공급자에 대한 지원이 향후 추가될 수 있습니다.
7.1.2. 토큰 교환 요청의 응답
교환 호출에서 성공한 응답에서는 클라이언트가 요청하는 requested-token-type
및 requested_issuer
에 따라 달라지는 콘텐츠 유형이 포함된 HTTP 200 응답 코드를 반환합니다. OAuth 요청된 토큰 유형은 OAuth 토큰 교환 사양에 설명된 대로 JSON 문서를 반환합니다.
{ "access_token" : ".....", "refresh_token" : ".....", "expires_in" : "...." }
새로 고침 토큰을 요청하는 클라이언트는 응답에서 액세스 및 새로 고침 토큰을 모두 반환합니다. 액세스 토큰 유형만 요청하는 클라이언트는 응답에서 액세스 토큰만 가져옵니다. 만료 정보는 requested_issuer
paramater를 통해 외부 발행자를 요청하는 클라이언트에 포함되거나 포함되지 않을 수 있습니다.
오류 응답은 일반적으로 400 HTTP 응답 코드 범주에 속하지만 오류 심각도에 따라 다른 오류 상태 코드가 반환될 수 있습니다. 오류 응답에는 requested_issuer
에 따라 내용이 포함될 수 있습니다. OAuth 기반 교환은 다음과 같이 JSON 문서를 반환할 수 있습니다.
{ "error" : "...." "error_description" : "...." }
추가 오류 클레임은 교환 유형에 따라 반환될 수 있습니다. 예를 들어, OAuth ID 공급자는 사용자에게 ID 공급자에 대한 링크가 없는 경우 추가 account-link-url
클레임을 포함할 수 있습니다. 이 링크는 클라이언트 시작 링크 요청에 사용할 수 있습니다.
토큰 교환 설정에는 세분화된 관리자 권한에 대한 지식이 필요합니다(자세한 내용은 서버 관리 가이드 참조). 교환할 수 있는 권한을 고객에게 부여해야 합니다. 이 내용은 이 장의 뒷부분에서 자세히 설명합니다.
이 장의 나머지 부분에서는 설정 요구 사항에 대해 설명하고 다양한 교환 시나리오에 대한 예를 제공합니다. 단순화를 위해 현재 영역에 의해 축소된 토큰을 내부 토큰으로 호출하고 외부 영역 또는 ID 공급자에 의해 외부 토큰으로 Mint되는 토큰을 호출합니다.