OAuth/OIDC 에서 토큰 교환 이해하기
토큰 교환은 신뢰할 수 있는 클라이언트가 사용자 개입 없이 새 토큰을 얻을 수 있는 OAuth 확장으로, 다양한 시나리오에서 사칭, 자동화, 시스템 간 통합, 및 토큰 마이그레이션에 유용합니다.
RFC 8693 에 소개된 토큰 교환은 신뢰할 수 있는 클라이언트가 기존 토큰을 다른 속성이나 범위를 가진 새로운 토큰으로 교환할 수 있게 하는 OAuth 확장입니다. 이 메커니즘은 서비스, 애플리케이션 또는 최종 사용자가 사전 승인된 토큰을 통해 일반 OAuth 액세스 토큰을 얻을 수 있게 하며, 전체 OAuth 플로우를 거칠 필요가 없습니다.
인증 코드 플로우와의 비교
먼저, 액세스 토큰을 얻기 위한 가장 일반적인 플로우인 OAuth 인증 코드 플로우를 살펴보겠습니다.
그리고 이것이 토큰 교환 플로우입니다:
리디렉션
주된 차이점은 인증 코드 플로우에서는 클라이언트 애플리케이션이 사용자를 인증 서버로 리디렉션하여 액세스 토큰을 받는다는 것입니다. 토큰 교환에서는, 클라이언트 애플리케이션이 사용자를 리디렉션하지 않고 인증 서버와 토큰을 교환할 수 있습니다.
그 이유는 인증 코드 플로우에서는 클라이언트 애플리케이션이 '신뢰할 수 없는' 것이기 때문에 사용자 자격 증명을 알고 있어야 액세스 토큰을 받을 수 있기 때문입니다. 반면 토큰 교환에서는 클라이언트 애플리케이션이 이미 사용자로부터 토큰을 받았기 때문에 신뢰할 수 있으며, 인증 서버는 그 토큰을 검증하고 새로운 토큰을 발행합니다.
토큰 발행자와 토큰 교환 서비스
토큰 교환 플로우에서는, 'Auth Server' 가 이제 두 가지 참가자로 나뉩니다:
- 토큰 발행자: 클라이언트 애플리케이션에 주체 토큰을 발행합니다.
- 토큰 교환 서비스: 주체 토큰을 검증하고 클라이언트 애플리케이션에 새로운 토큰을 발행합니다.
토큰 교환 서비스는 인증 코드 플로우에서 "Auth Server" 와 동일하며, 토큰 발행자는 제 3자 신원 공급자일 수도 있고, 또는 전용 서비스로 "Auth Server" 에서 분리될 수도 있습니다.
언제 토 큰 교환을 사용할까?
토큰 교환 플로우는 사용자 개입 없이 수행될 수 있으며, 다음과 같은 시나리오에서 유용합니다:
- 사칭: 서비스 (예: 백엔드 마이크로서비스) 나 관리 사용자가 전체 사용자 자격 증명을 노출하지 않고 사용자를 대신하여 작업을 수행할 수 있도록 합니다.
- 자동화: 신뢰할 수 있는 서비스가 수동 개입 없이 자동으로 작업이나 자동화된 테스트를 수행할 수 있도록 합니다.
- 다른 IdP와의 통합: 사용자 경험을 매끄럽게 유지하고 권한을 효과적으로 관리하기 위해 다른 신원 시스템 간에 토큰을 변환합니다. 일반적인 시나리오는 SSO 토큰을 하위 서비스의 토큰으로 변환하는 것입니다.
- 마이그레이션: 한 인증 서버에서 다른 서버로 토큰을 마이그레이션합니다. 예를 들어 오래된 시스템에서 최신 OAuth/OIDC 호환 시스템으로의 마이그레이션입니다.
토큰 교환 프로세스
새로운 액세스 토큰으로 교환하는 것은 가장 일반적인 사용 사례이며, 이를 예로 들어 보겠습니다. 액세스 토큰에 국한되지 않고, 토큰 교환은 리프레시 토큰, 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
: 선택사항. 요청된 범위.
또한, 요청에는 클라이언트 정보가 포함되어야 하며, 이는 기본 인증 헤더로 인코딩되거나 양식 데이터로 전송될 수 있습니다.
다음은 요청 예시입니다: