OAuth/OIDC 에서 토큰 교환 이해하기
토큰 교환은 신뢰할 수 있는 클라이언트가 사용자 개입 없이 새 토큰을 얻을 수 있는 OAuth 확장으로, 다양한 시나리오에서 사칭, 자동화, 시스템 간 통합, 및 토큰 마이그레이션에 유용합니다.
토큰 교환은 신뢰할 수 있는 클라이언트가 사용자 개입 없이 새 토큰을 얻을 수 있는 OAuth 확장으로, 다양한 시나리오에서 사칭, 자동화, 시스템 간 통합, 및 토큰 마이그레이션에 유용합니다.
RFC 8693 에 소개된 토큰 교환은 신뢰할 수 있는 클라이언트가 기존 토큰을 다른 속성이나 범위를 가진 새로운 토큰으로 교환할 수 있게 하는 OAuth 확장입니다. 이 메커니즘은 서비스, 애플리케이션 또는 최종 사용자가 사전 승인된 토큰을 통해 일반 OAuth 액세스 토큰을 얻을 수 있게 하며, 전체 OAuth 플로우를 거칠 필요가 없습니다.
먼저, 액세스 토큰을 얻기 위한 가장 일반적인 플로우인 OAuth 인증 코드 플로우를 살펴보겠습니다.
그리고 이것이 토큰 교환 플로우입니다:
주된 차이점은 인증 코드 플로우에서는 클라이언트 애플리케이션이 사용자를 인증 서버로 리디렉션하여 액세스 토큰을 받는다는 것입니다. 토큰 교환에서는, 클라이언트 애플리케이션이 사용자를 리디렉션하지 않고 인증 서버와 토큰을 교환할 수 있습니다.
그 이유는 인증 코드 플로우에서는 클라이언트 애플리케이션이 '신뢰할 수 없는' 것이기 때문에 사용자 자격 증명을 알고 있어야 액세스 토큰을 받을 수 있기 때문입니다. 반면 토큰 교환에서는 클라이언트 애플리케이션이 이미 사용자로부터 토큰을 받았기 때문에 신뢰할 수 있으며, 인증 서버는 그 토큰을 검증하고 새로운 토큰을 발행합니다.
토큰 교환 플로우에서는, 'Auth Server' 가 이제 두 가지 참가자로 나뉩니다:
토큰 교환 서비스는 인증 코드 플로우에서 "Auth Server" 와 동일하며, 토큰 발행자는 제 3자 신원 공급자일 수도 있고, 또는 전용 서비스로 "Auth Server" 에서 분리될 수도 있습니다.
토큰 교환 플로우는 사용자 개입 없이 수행될 수 있으며, 다음과 같은 시나리오에서 유용합니다:
새로운 액세스 토큰으로 교환하는 것은 가장 일반적인 사용 사례이며, 이를 예로 들어 보겠습니다. 액세스 토큰에 국한되지 않고, 토큰 교환은 리프레시 토큰, ID 토큰 등 다른 유형의 토큰을 발행하는 데 사용할 수 있습니다.
토큰 교환을 수행하려면 인증 서버와 등록된 클라이언트 애플리케이션이 필요합니다.
그리고 클라이언트 애플리케이션은 주체 토큰을 사전에 가지고 있어야 하며, 이 토큰은 보통 인증 서버나 신뢰할 수 있는 제 3자 신원 공급자가 부여합니다. 이 토큰을 보유함으로써 클라이언트 애플리케이션은 사용자 자격 증명과 상호작용 없이 토큰을 교환할 수 있는 '신뢰할 수 있는' 상태가 됩니다.
클라이언트는 기존 토큰을 교환하기 위해 요청을 인증 서버의 토큰 엔드포인트로 보냅니다. 여기에는 주체 토큰 (교환하려는 토큰) 과 선택적으로 대상 대상자, 범위, 그리고 토큰 유형이 포함됩니다.
grant_type: 필요. 이 매개변수의 값은 urn:ietf:params:oauth:grant-type:token-exchange 여야 하며, 토큰 교환이 수행되고 있음을 나타냅니다.subject_token: 필요. 사용자의 PAT.subject_token_type: 필요. subject_token 매개변수에 제공된 보안 토큰의 유형. 이 매개변수의 일반적인 값은 urn:ietf:params:oauth:token-type:access_token 이지만, 교환되는 토큰에 따라 다를 수 있습니다.resource: 선택사항. 자원 지표로, 액세스 토큰의 대상 자원을 지정하는 데 도움을 줍니다.audience: 선택사항. 액세스 토큰의 대상자, 즉 토큰의 의도된 수신자를 나타내며, audience 가 지정되지 않으면 인증 서버가 resource 값을 사용할 수 있습니다.scope: 선택사항. 요청된 범위.또한, 요청에는 클라이언트 정보가 포함되어야 하며, 이는 기본 인증 헤더로 인코딩되거나 양식 데이터로 전송될 수 있습니다.
다음은 요청 예시입니다: