RFC 8693 OAuth 2.0 토큰 교환 2020년 1월
Jones 외. 표준 트랙 [페이지]
스트림:
인터넷 엔지니어링 태스크 포스(IETF)
RFC:
8693
범주:
표준 트랙
발행:
ISSN:
2070-1721
저자:
M. Jones
Microsoft
A. Nadalin
Microsoft
B. Campbell, 편집자
Ping Identity
J. Bradley
Yubico
C. Mortimore
Visa

RFC 8693

OAuth 2.0 토큰 교환

초록

이 명세는 HTTP 및 JSON 기반의 보안 토큰 서비스(STS)를 위한 프로토콜을 정의하며, OAuth 2.0 인가 서버에서 보안 토큰을 요청하고 획득하는 방법을 정의합니다. 가장 및 위임을 사용하는 보안 토큰도 포함합니다.

이 메모의 상태

이 문서는 인터넷 표준 트랙 문서입니다.

이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물입니다. 이는 IETF 커뮤니티의 합의를 나타냅니다. 공개 검토를 받았으며 인터넷 엔지니어링 운영 그룹(IESG)에 의해 출판 승인을 받았습니다. 인터넷 표준에 관한 추가 정보는 RFC 7841의 섹션 2에서 확인할 수 있습니다.

이 문서의 현재 상태, 모든 정오표 및 이에 대한 피드백 제공 방법에 관한 정보는 다음에서 확인할 수 있습니다. https://www.rfc-editor.org/info/rfc8693.

목차

1. 소개

보안 토큰은 이기종 환경 또는 보안 도메인 간에 신원 및 보안 정보를 공유하는 데 도움이 되는 정보의 집합이다. 보안 토큰의 예로는 JSON Web Token (JWT) [JWT] 및 Security Assertion Markup Language (SAML) 2.0 어서션 [OASIS.saml-core-2.0-os]이 있다. 보안 토큰은 무결성을 달성하기 위해 일반적으로 서명되며, 때로는 기밀성을 달성하기 위해 암호화되기도 한다. 보안 토큰은 [RFC7521]에서처럼 때때로 어서션이라고도 설명된다.

보안 토큰 서비스(Security Token Service, STS)는 제공된 보안 토큰을 검증하고 이에 대한 응답으로 새 보안 토큰을 발급할 수 있는 서비스로, 클라이언트가 이기종 환경 또는 보안 도메인 전반의 리소스에 대해 적절한 액세스 자격 증명을 얻을 수 있게 한다. 웹 서비스 클라이언트는 토큰 교환을 위해 STS와 상호 작용하는 프로토콜로 WS-Trust [WS-Trust]를 사용해 왔다. WS-Trust가 XML과 SOAP를 사용하는 반면, 현대 웹 개발의 흐름은 RESTful(Representational State Transfer) 패턴과 JSON으로 향해 왔다. OAuth 2.0 Authorization Framework [RFC6749]와 OAuth 2.0 Bearer Tokens [RFC6750]는 HTTP 및 RESTful 리소스에 대한 서드파티 애플리케이션의 액세스를 인가하기 위한 인기 있는 표준으로 부상했다. 전통적인 OAuth 2.0 상호 작용은 리소스 소유자 인가의 어떤 표현을 액세스 토큰으로 교환하는 것을 포함하며, 이는 실제로 매우 유용한 패턴임이 입증되었다. 그러나 그 입력과 출력은 보안 토큰 교환 프레임워크를 완전히 수용하기에는 다소 지나치게 제한적이다.

이 명세는 OAuth 2.0을 확장하는 프로토콜을 정의하여 클라이언트가 STS 역할을 하는 인가 서버로부터 보안 토큰을 요청하고 획득할 수 있게 한다. OAuth 2.0과 유사하게, 이 명세는 클라이언트 개발자의 단순성에 초점을 맞추며, 현대 개발 환경에서 거의 보편적으로 사용할 수 있는 HTTP 클라이언트와 JSON 파서만을 요구한다. 이 명세에서 정의하는 STS 프로토콜은 그 자체로는 RESTful하지 않지만(STS는 REST 접근 방식에 특별히 잘 맞지 않는다), RESTful 시스템 작업에 익숙한 개발자에게 친숙해야 하는 통신 패턴과 데이터 형식을 활용한다.

토큰 교환 요청을 위한 새로운 grant type과 이러한 요청을 토큰 엔드포인트에 보낼 때의 관련 특정 매개변수는 이 명세에서 정의한다. 토큰 교환 응답은 토큰 엔드포인트에서 오는 일반적인 OAuth 2.0 응답이며, 여기에 클라이언트에 정보를 제공하기 위해 본 문서에서 정의하는 몇 가지 추가 매개변수가 붙는다.

토큰 교환 요청을 수행하는 엔티티는 토큰 교환 상호 작용의 맥락에서 클라이언트로 간주된다. 그러나 이는 이 프로파일의 사용을 전통적인 OAuth 클라이언트로 제한하지 않는다. 예를 들어 OAuth 리소스 서버는 보호된 리소스 요청에서 받은 액세스 토큰을 백엔드 서비스 호출에 포함하기에 적절한 새 토큰으로 바꾸기 위해 토큰 교환 중에 클라이언트 역할을 맡을 수 있다. 새 토큰은 다운스트림 서비스에 대해 더 좁은 범위가 지정된 액세스 토큰일 수도 있고, 전혀 다른 종류의 토큰일 수도 있다.

이 명세의 범위는 OAuth 2.0을 활용하는 STS 스타일 토큰 교환을 위한 기본 요청-응답 프로토콜의 정의로 제한된다. 위임 의미론을 표현할 수 있게 하는 몇 가지 새로운 JWT 클레임이 정의되지만, 토큰 자체의 구체적인 구문, 의미론 및 보안 특성 (인가 서버에 제시되는 토큰과 클라이언트가 얻는 토큰 모두)은 명시적으로 범위 밖이며, 구현이 배포될 수 있는 신뢰 모델에 대해서는 어떠한 요구사항도 부과하지 않는다. 추가 프로파일은 서명 및/또는 토큰 암호화가 필요한지 또는 proof-of-possession 스타일 토큰이 요구되거나 발급될 것인지 등, 관련 당사자와 신뢰의 구체적인 성격에 관한 더 상세한 요구사항을 제공할 수 있다. 그러나 이러한 세부 사항은 개별 배포의 특정 요구에 따라 내려지는 정책 결정인 경우가 많으며, 그에 따라 구성되거나 구현될 것이다.

획득한 보안 토큰은 여러 맥락에서 사용될 수 있으며, 그 구체적인 사항 역시 이 명세의 범위를 벗어난다.

1.1. 위임과 가장의 의미론

STS의 일반적인 사용 사례(이전 절에서 암시한 것처럼) 중 하나는 리소스 서버 A가 요청 사용자 B를 대신하여 백엔드 서비스 C를 호출할 수 있게 하는 것이다. 로컬 사이트 정책과 인가 인프라에 따라, A가 자신의 자격 증명을 사용해 C에 액세스하면서 A가 B를 대신하여 행동한다는 어떤 형태의 주석("위임")을 함께 두는 것이 바람직할 수도 있고, A에게 C에 대한 제한된 액세스 자격 증명을 부여하되 그 자격 증명이 계속 B를 인가된 엔티티로 식별하게 하는 것("가장")이 바람직할 수도 있다. 위임과 가장은 여러 참여자가 관련된 다른 시나리오에서도 유용한 개념일 수 있다.

주체 A가 주체 B를 가장하면, A는 어떤 정의된 권리 맥락 안에서 B가 가진 모든 권리를 부여받으며 그 맥락에서 B와 구별되지 않는다. 따라서 주체 A가 주체 B를 가장하는 경우, 그러한 토큰을 받는 어떤 엔티티의 관점에서도 그들은 실제로 B와 상대하고 있는 것이다. 신원 시스템의 일부 구성원이 가장이 이루어지고 있음을 인지할 수도 있지만, 그것은 요구사항이 아니다. 모든 의도와 목적에서, A가 B를 가장할 때 A는 토큰이 인가한 권리의 맥락 안에서 B이다. A가 B를 가장할 수 있는 능력은 토큰의 내용이나 대역 외 메커니즘을 통해 범위나 시간, 심지어 일회성 사용 제한으로 제한될 수 있다.

위임 의미론은 가장 의미론과 다르지만, 둘은 밀접하게 관련되어 있다. 위임 의미론에서는 주체 A가 여전히 B와 별개의 자신의 신원을 가지며, B가 자신의 권리 일부를 A에게 위임했을 수 있지만 수행되는 모든 행위는 B를 대표하는 A에 의해 이루어진다는 점이 명시적으로 이해된다. 어떤 의미에서 A는 B의 대리인이다.

위임과 가장이 모든 상황을 포괄하는 것은 아니다. 예를 들어 어떤 주체가 직접 자신을 위해 행동하는 경우, 위임도 가장도 적용되지 않는다. 그러나 이들은 토큰 교환에서 작동하는 더 일반적인 의미론이므로, 이 명세에서 더 직접적으로 다룬다.

위임 의미론은 일반적으로 토큰 안에 토큰의 기본 주체와 그 주체가 자신의 일부 권리를 위임한 행위자에 대한 정보를 모두 포함함으로써 표현된다. 그러한 토큰은 여러 주체에 대한 정보로 구성되어 있으므로 복합 토큰이라고 불리기도 한다. 일반적으로 요청에서 subject_token은 토큰이 요청되는 대상 당사자의 신원을 나타내며, actor_token은 발급된 토큰의 액세스 권리가 위임되는 당사자의 신원을 나타낸다. 인가 서버가 발급한 복합 토큰은 두 당사자 모두에 대한 정보를 포함한다. 복합 토큰을 언제, 그리고 발급할지 여부는 인가 서버와 적용 가능한 정책 및 구성의 재량이다.

복합 토큰을 표현하는 구체적인 방식과 그러한 토큰이 발급될지 여부조차도 구현의 세부 사항과 토큰의 종류에 따라 달라진다. JWT가 아닌 복합 토큰의 표현은 이 명세의 범위를 벗어난다. 그러나 actor_token 요청 매개변수는 원하는 행위자에 대한 정보를 제공하는 수단을 제공하며, JWT act 클레임은 위임 체인의 표현을 제공할 수 있다.

1.2. 요구사항 표기와 규약

이 문서에서 키워드 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석된다.

1.3. 용어

이 명세는 OAuth 2.0 [RFC6749]에서 정의한 "access token type", "authorization server", "client", "client identifier", "resource server", "token endpoint", "token request", 및 "token response"라는 용어와, JSON Web Token (JWT) [JWT]에서 정의한 "Base64url Encoding", "Claim", 및 "JWT Claims Set"라는 용어를 사용한다.

2. 토큰 교환 요청 및 응답

2.1. 요청

클라이언트는 [RFC6749]의 섹션 4.5에 정의된 extension grant type 메커니즘을 사용하여 인가 서버의 토큰 엔드포인트에 토큰 요청을 보냄으로써 보안 토큰을 요청한다.

인가 서버에 대한 클라이언트 인증은 OAuth 2.0이 제공하는 일반적인 메커니즘을 사용하여 수행된다. [RFC6749]의 섹션 2.3.1은 클라이언트의 비밀번호 기반 인증을 정의하지만, 클라이언트 인증은 확장 가능하며 다른 메커니즘도 가능하다. 예를 들어, [RFC7523]은 bearer JSON Web Token (JWT) [JWT]을 사용한 클라이언트 인증을 정의한다. 지원되는 클라이언트 인증 방법과 인증되지 않았거나 식별되지 않은 클라이언트를 허용할지 여부는 인가 서버의 재량에 따르는 배포 결정이다. 클라이언트 인증을 생략하면 손상된 토큰을 보유한 누구든지 STS를 통해 그 손상된 토큰을 다른 토큰으로 활용할 수 있다는 점에 유의한다. 따라서 클라이언트 인증은 어떤 엔티티가 다른 엔티티를 가장하거나 다른 엔티티로부터 위임을 받을 수 있는지에 관해 STS가 추가 인가 검사를 수행할 수 있게 한다.

클라이언트는 HTTP POST 메서드를 사용하여 extension grant type과 함께 토큰 엔드포인트로 토큰 교환 요청을 보낸다. 다음 매개변수는 [RFC6749]의 부록 B에 설명된 대로 UTF-8 문자 인코딩을 사용한 application/x-www-form-urlencoded 형식으로 HTTP 요청 entity-body에 포함된다.

grant_type
REQUIRED. 값 urn:ietf:params:oauth:grant-type:token-exchange는 토큰 교환이 수행되고 있음을 나타낸다.
resource
OPTIONAL. 클라이언트가 요청한 보안 토큰을 사용하려는 대상 서비스 또는 리소스를 나타내는 URI이다. 이는 인가 서버가 대상에 맞게 적절한 정책을 적용할 수 있게 한다. 예를 들어 발급할 토큰의 유형과 내용을 결정하거나, 토큰을 암호화할지 여부와 암호화 방법을 결정할 수 있다. 많은 경우 클라이언트는 상호 작용하는 시스템의 논리적 조직을 알지 못하며, 토큰을 사용하려는 서비스의 URI만 알게 된다. resource 매개변수는 클라이언트가 토큰 교환 요청에서 보통 https URL로 위치를 제공함으로써, 해당 리소스에 접근할 때 사용될 것과 동일한 형식으로 발급된 토큰을 어디에서 사용하려는지 인가 서버에 표시할 수 있게 한다. 인가 서버는 일반적으로 resource URI 값에서 적절한 정책으로 매핑하는 기능을 가진다. resource 매개변수의 값은 [RFC3986]의 섹션 4.3에 명시된 절대 URI여야 MUST 하며, 쿼리 구성요소를 포함할 수 MAY 있지만 프래그먼트 구성요소를 포함해서는 MUST NOT 안 된다. 여러 resource 매개변수를 사용하여 발급된 토큰이 나열된 여러 리소스에서 사용될 예정임을 나타낼 수 있다. resource 매개변수에 관한 추가 배경과 사용은 [OAUTH-RESOURCE]를 참조한다.
audience
OPTIONAL. 클라이언트가 요청한 보안 토큰을 사용하려는 대상 서비스의 논리적 이름이다. 이는 resource 매개변수와 유사한 목적을 수행하지만, 클라이언트가 대상 서비스에 대한 논리적 이름을 제공한다. 이름의 해석은 그 값이 클라이언트와 인가 서버 모두가 이해하는 것이어야 함을 요구한다. OAuth 클라이언트 식별자, SAML 엔티티 식별자 [OASIS.saml-core-2.0-os], 및 OpenID Connect Issuer Identifier [OpenID.Core]audience 매개변수 값으로 사용될 수 있는 것의 예이다. 그러나 주어진 인가 서버와 함께 사용되는 audience 값은 해당 서버 안에서 고유해야 하며, 이는 그것들이 의도한 값 유형으로 올바르게 해석되도록 보장하기 위함이다. 여러 audience 매개변수를 사용하여 발급된 토큰이 나열된 여러 대상에서 사용될 예정임을 나타낼 수 있다. audienceresource 매개변수를 함께 사용하여 논리적 이름과 리소스 URI가 섞인 여러 대상 서비스를 나타낼 수 있다.
scope
OPTIONAL. [RFC6749]의 섹션 3.3에 정의된 대로, 공백으로 구분되고 대소문자를 구분하는 문자열 목록으로, 클라이언트가 토큰이 사용될 서비스 또는 리소스의 맥락에서 요청한 보안 토큰의 원하는 범위를 지정할 수 있게 한다. scope의 값과 관련 의미론은 서비스별로 다르며, 관련 서비스 문서에 설명될 것으로 예상된다.
requested_token_type
OPTIONAL. 요청한 보안 토큰의 유형에 대한 섹션 3에 설명된 식별자이다. 요청한 유형이 지정되지 않은 경우, 발급되는 토큰 유형은 인가 서버의 재량이며, resource 또는 audience 매개변수가 나타내는 서비스 또는 리소스의 요구사항에 대한 지식에 의해 결정될 수 있다.
subject_token
REQUIRED. 요청이 이루어지는 대상 당사자의 신원을 나타내는 보안 토큰이다. 일반적으로 이 토큰의 주체는 요청에 대한 응답으로 발급되는 보안 토큰의 주체가 된다.
subject_token_type
REQUIRED. subject_token 매개변수 안의 보안 토큰 유형을 나타내는 섹션 3에 설명된 식별자이다.
actor_token
OPTIONAL. 행동하는 당사자의 신원을 나타내는 보안 토큰이다. 일반적으로 이는 요청한 보안 토큰을 사용하고 주체를 대신하여 행동하도록 인가된 당사자가 된다.
actor_token_type
actor_token 매개변수 안의 보안 토큰 유형을 나타내는 섹션 3에 설명된 식별자이다. 이는 요청에 actor_token 매개변수가 존재할 때 REQUIRED이지만, 그렇지 않은 경우 포함되어서는 MUST NOT 안 된다.

요청을 처리할 때, 인가 서버는 표시된 토큰 유형에 대해 적절한 검증 절차를 수행해야 MUST 하며, actor token이 존재하는 경우 그 표시된 토큰 유형에 대해서도 적절한 검증 절차를 수행해야 한다. 특정 토큰의 유효성 기준과 세부 사항은 이 문서의 범위를 벗어나며 해당 토큰 유형과 그 내용에 특화되어 있다.

토큰 유형에 특화된 일회성 사용 또는 기타 의미론이 없는 경우, 토큰 교환을 수행하는 행위는 subject token 또는 actor token의 유효성에 아무런 영향을 주지 않는다. 또한 교환은 일회성 이벤트이며 입력 토큰과 출력 토큰 사이에 긴밀한 연결을 만들지 않는다. 따라서 예를 들어 출력 토큰의 만료 시간이 입력 토큰의 만료 시간에 영향을 받을 수는 있지만, 입력 토큰의 갱신 또는 연장이 출력 토큰의 속성에 반영될 것으로 기대되지는 않는다. 토큰 폐기 이벤트를 전파하는 것이 여전히 적절하거나 바람직할 수 있다. 그러나 그렇게 하는 것은 STS 프로토콜의 일반적인 속성이 아니며, 특정 구현, 토큰 유형 또는 배포에 특화될 것이다.

2.1.1. 리소스, 대상, 범위 간의 관계

토큰을 요청할 때 클라이언트는 audienceresource 매개변수를 통해 해당 토큰을 사용하려는 원하는 대상 서비스(들)를 나타낼 수 있으며, scope 매개변수를 사용하여 요청한 토큰의 원하는 범위를 나타낼 수도 있다. 그러한 요청의 의미론은 클라이언트가 요청한 모든 대상 서비스에서 사용 가능한 요청 범위의 토큰을 요청한다는 것이다. 사실상 토큰의 요청된 액세스 권리는 모든 대상 서비스에 대한 모든 범위의 데카르트 곱이다.

인가 서버는 어떤 토큰 요청도 이행하기를 꺼리거나 이행할 수 없을 수 있지만, 매우 광범위한 액세스 권리가 요청될 때는 이행 불가능한 요청일 가능성이 훨씬 더 높다. 따라서 배포 내 시스템 간 관계에 대한 구체적인 지식이 없는 경우, 클라이언트는 요청하는 액세스의 폭, 특히 대상 서비스의 수에 신중해야 한다. 인가 서버는 섹션 2.2.2에서 정의한 invalid_target 오류 코드를 사용하여 클라이언트가 동시에 너무 많은 대상 서비스에 대한 액세스를 요청했음을 알릴 수 있다.

2.2. 응답

인가 서버는 토큰 교환 요청에 대해 [RFC6749]의 섹션 5에 명시된 것처럼 토큰 엔드포인트에서 오는 일반적인 OAuth 2.0 응답으로 응답한다. 추가 세부 사항과 설명은 다음 하위 절에서 제공된다.

2.2.1. 성공 응답

요청이 유효하고 인가 서버의 모든 정책 및 기타 기준을 충족하는 경우, 성공 토큰 응답은 [RFC8259]에 명시된 "application/json" 미디어 유형과 HTTP 200 상태 코드를 사용하여 다음 매개변수를 HTTP 응답의 entity-body에 추가함으로써 구성된다. 매개변수는 각 매개변수를 최상위 수준에 추가하여 JavaScript Object Notation (JSON) 구조로 직렬화된다. 매개변수 이름과 문자열 값은 JSON 문자열로 포함된다. 숫자 값은 JSON 숫자로 포함된다. 매개변수의 순서는 중요하지 않으며 달라질 수 있다.

access_token
REQUIRED. 토큰 교환 요청에 대한 응답으로 인가 서버가 발급한 보안 토큰이다. [RFC6749]의 섹션 5.1access_token 매개변수는 여기서 요청된 토큰을 전달하는 데 사용되며, 이는 이 토큰 교환 프로토콜이 토큰 엔드포인트에 대해 정의된 기존 OAuth 2.0 요청 및 응답 구조를 사용할 수 있게 한다. 식별자 access_token은 역사적 이유로 사용되며, 발급된 토큰이 OAuth 액세스 토큰일 필요는 없다.
issued_token_type
REQUIRED. 발급된 보안 토큰의 표현에 대한 섹션 3에 설명된 식별자이다.
token_type
REQUIRED. [RFC6749]의 섹션 7.1에 명시된 대로, 발급된 액세스 토큰을 사용하는 방법을 지정하는 대소문자를 구분하지 않는 값이다. 이는 보호된 리소스에 액세스하기 위해 액세스 토큰을 어떻게 활용할지에 관한 정보를 클라이언트에 제공한다. 예를 들어 [RFC6750]에 명시된 Bearer 값은 발급된 보안 토큰이 bearer token이며, 클라이언트가 토큰 자체의 내용 이외에 추가적인 자격 증명 없이 그대로 제시할 수 있음을 나타낸다. 이 매개변수의 의미는 issued_token_type 매개변수의 의미와 다르다는 점에 유의한다. 후자는 발급된 보안 토큰의 표현을 선언한다. "token type"이라는 용어는 일반적으로 이 명세의 모든 *_token_type 매개변수에서처럼 보안 토큰의 구조적 또는 구문적 표현을 의미하는 데 더 자주 사용된다. 발급된 토큰이 액세스 토큰이 아니거나 액세스 토큰으로 사용할 수 없는 경우, 해당 맥락에서 OAuth 2.0 token_type 식별자가 적용되지 않음을 나타내기 위해 token_typeN_A가 사용된다.
expires_in
RECOMMENDED. 인가 서버가 발급한 토큰의 유효 수명을 초 단위로 나타낸다. 클라이언트는 종종 토큰의 내용을 검사할 의향이나 기능이 없으며, 이 매개변수는 토큰 유형에 구애받지 않는 일관된 방식으로 토큰이 얼마나 오래 유효할 것으로 기대할 수 있는지를 나타낸다. 예를 들어 값 1800은 응답이 생성된 시점부터 30분 후에 토큰이 만료됨을 의미한다.
scope
발급된 보안 토큰의 범위가 클라이언트가 요청한 범위와 동일한 경우 OPTIONAL이며, 그렇지 않으면 REQUIRED이다.
refresh_token
OPTIONAL. 교환이 하나의 임시 자격 증명(subject_token)을 다른 맥락에서 사용하기 위한 다른 임시 자격 증명(발급된 토큰)으로 바꾸는 것일 때는 일반적으로 refresh token이 발급되지 않는다. refresh token은 토큰 교환의 클라이언트가 원래 자격 증명이 더 이상 유효하지 않은 경우에도 리소스에 액세스할 수 있는 능력이 필요한 경우에 발급될 수 있다. (예: 사용자 부재 또는 오프라인 시나리오로, 클라이언트와 활성 세션을 유지하는 사용자가 더 이상 없는 경우). 이 명세의 프로파일 또는 배포는 클라이언트가 urn:ietf:params:oauth:grant-type:token-exchange grant type 요청에 대한 응답으로 refresh token을 기대해야 하는 조건을 명확히 문서화해야 한다.

2.2.2. 오류 응답

요청 자체가 유효하지 않거나 subject_token 또는 actor_token 중 하나가 어떤 이유로든 유효하지 않거나 정책상 허용되지 않는 경우, 인가 서버는 [RFC6749]의 섹션 5.2에 명시된 대로 오류 응답을 구성해야 MUST 한다. error 매개변수의 값은 invalid_request 오류 코드여야 MUST 한다.

인가 서버가 resource 또는 audience 매개변수로 표시된 어떤 대상 서비스에 대해서도 토큰을 발급하기를 꺼리거나 발급할 수 없는 경우, 오류 응답에는 invalid_target 오류 코드를 사용해야 SHOULD 한다.

인가 서버는 [RFC6749]의 섹션 5.2에서 논의한 것처럼 error_description을 사용하여 오류 사유에 관한 추가 정보를 포함할 수 MAY 있다.

다른 오류 코드도 적절한 경우 사용할 수 있다.

2.3. 토큰 교환 예

다음 예는 OAuth 리소스 서버가 교환 중 클라이언트 역할을 맡는 가상의 토큰 교환을 보여 준다. 리소스 서버는 보호된 리소스 요청에서 받은 액세스 토큰을, 백엔드 서비스를 호출하는 데 사용할 새 토큰으로 교환한다 (예제의 추가 줄바꿈과 들여쓰기는 표시 목적일 뿐이다).

그림 1[RFC6750]의 섹션 2.1에 명시된 대로, Authorization 헤더에 OAuth 액세스 토큰을 포함한 보호된 리소스 요청을 리소스 서버가 수신하는 모습을 보여 준다.

 GET /resource HTTP/1.1
 Host: frontend.example.com
 Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC
그림 1: 보호된 리소스 요청

그림 2에서 리소스 서버는 토큰 교환을 위한 클라이언트 역할을 맡으며, 그림 1의 요청에서 가져온 액세스 토큰은 섹션 2.1에 명시된 요청을 사용하여 인가 서버로 전송된다. subject_token 매개변수의 값은 액세스 토큰을 전달하고, subject_token_type 매개변수의 값은 그것이 OAuth 2.0 액세스 토큰임을 나타낸다. 클라이언트 역할을 하는 리소스 서버는 HTTP Basic 인증 스킴을 사용하여 자신의 식별자와 비밀값으로 인가 서버에 인증한다. resource 매개변수는 발급된 토큰이 사용될 백엔드 서비스의 위치인 <https://backend.example.com/api>를 나타낸다.

 POST /as/token.oauth2 HTTP/1.1
 Host: as.example.com
 Authorization: Basic cnMwODpsb25nLXNlY3VyZS1yYW5kb20tc2VjcmV0
 Content-Type: application/x-www-form-urlencoded

 grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
 &resource=https%3A%2F%2Fbackend.example.com%2Fapi
 &subject_token=accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC
 &subject_token_type=
  urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
그림 2: 토큰 교환 요청

인가 서버는 토큰 교환 요청에 제시된 클라이언트 자격 증명과 subject_token을 검증한다. resource 매개변수로부터 인가 서버는 요청에 적용할 적절한 정책을 결정할 수 있으며 <https://backend.example.com>에서 사용하기에 적합한 토큰을 발급한다. 그림 3에 표시된 응답의 access_token 매개변수는 새 토큰을 포함하며, 이 토큰 자체는 1분 동안 유효한 bearer OAuth 액세스 토큰이다. 그 토큰은 우연히 JWT이지만, 클라이언트에게는 그 구조와 형식이 불투명하므로 issued_token_type은 그것이 액세스 토큰임만 나타낸다.

 HTTP/1.1 200 OK
 Content-Type: application/json
 Cache-Control: no-cache, no-store

 {
  "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQiOiJo
    dHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2FzLmV
    4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1MzMsIn
    N1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQedw6rx
    f59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIWvmDCM
    y5-kdXjwhw",
  "issued_token_type":
      "urn:ietf:params:oauth:token-type:access_token",
  "token_type":"Bearer",
  "expires_in":60
 }
그림 3: 토큰 교환 응답

그런 다음 리소스 서버는 그림 4에 예시된 것처럼 새로 획득한 액세스 토큰을 사용하여 백엔드 서버에 요청을 보낼 수 있다.

 GET /api HTTP/1.1
 Host: backend.example.com
 Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQ
    iOiJodHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2
    FzLmV4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1M
    zMsInN1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQe
    dw6rxf59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIW
    vmDCMy5-kdXjwhw
그림 4: 백엔드 보호 리소스 요청

추가 예는 부록 A에서 확인할 수 있다.

3. 토큰 유형 식별자

이 명세의 여러 매개변수는 해당 토큰을 설명하기 위한 값으로 식별자를 사용한다. 구체적으로, 이들은 요청의 requested_token_type, subject_token_type, 및 actor_token_type 매개변수와 응답의 issued_token_type 멤버이다. 토큰 유형 식별자는 URI이다. 토큰 교환은 다른 당사자가 발급한 토큰과 주어진 인가 서버의 토큰 모두와 함께 작동할 수 있다. 전자의 경우 토큰 유형 식별자는 인가 서버가 파싱할 수 있도록 구문(예: JWT 또는 SAML 2.0)을 나타낸다. 후자의 경우에는 주어진 인가 서버가 그것을 무엇으로 발급했는지 (예: access_token 또는 refresh_token)를 나타낸다.

다음 토큰 유형 식별자는 이 명세에서 정의한다. 다른 토큰 유형을 나타내기 위해 다른 URI를 사용할 수 MAY 있다.

urn:ietf:params:oauth:token-type:access_token
토큰이 주어진 인가 서버가 발급한 OAuth 2.0 액세스 토큰임을 나타낸다.
urn:ietf:params:oauth:token-type:refresh_token
토큰이 주어진 인가 서버가 발급한 OAuth 2.0 refresh token임을 나타낸다.
urn:ietf:params:oauth:token-type:id_token
토큰이 [OpenID.Core]의 섹션 2에 정의된 ID Token임을 나타낸다.
urn:ietf:params:oauth:token-type:saml1
토큰이 base64url로 인코딩된 SAML 1.1 [OASIS.saml-core-1.1] 어서션임을 나타낸다.
urn:ietf:params:oauth:token-type:saml2
토큰이 base64url로 인코딩된 SAML 2.0 [OASIS.saml-core-2.0-os] 어서션임을 나타낸다.

[JWT]의 섹션 9에서 정의한 값 urn:ietf:params:oauth:token-type:jwt는 토큰이 JWT임을 나타낸다.

액세스 토큰과 JWT 사이의 구분은 미묘하다. 액세스 토큰은 위임된 인가 결정을 나타내지만, JWT는 토큰 형식이다. 액세스 토큰은 JWT로 형식화될 수 있지만 반드시 그래야 하는 것은 아니다. 그리고 JWT가 액세스 토큰일 수도 있지만, 모든 JWT가 액세스 토큰인 것은 아니다. 이 명세의 의도는 urn:ietf:params:oauth:token-type:access_token이 해당 인가 서버가 발급한 전형적인 OAuth 액세스 토큰임을 나타내는 지표로서, 클라이언트에게 불투명하며, 해당 인가 서버에서 얻은 다른 액세스 토큰과 같은 방식으로 사용 가능하다는 것이다. (그것이 JWT일 수도 있지만, 클라이언트는 그 사실을 알지 못하고 알 필요도 없다.) 반면 urn:ietf:params:oauth:token-type:jwt는 JWT가 구체적으로 요청되거나 전송되고 있음을 나타내기 위한 것이다 (예컨대 [RFC7523]이 가능하게 하는 것처럼, 다른 인가 서버에서 액세스 토큰을 얻기 위한 인가 grant로 JWT가 사용되는 교차 도메인 사용 사례일 수 있다).

이진 성격의 토큰의 경우, 그것을 전달하는 데 사용되는 URI는 HTTP 및 OAuth와 함께 사용하기에 적합한 base64 또는 기타 인코딩의 의미론과 연결되어야 한다는 점에 유의한다.

4. JSON Web Token 클레임 및 검사 응답 매개변수

토큰 안에서 위임을 표현하고, 위임 또는 가장에 대한 인가를 표현하기 위한 정의된 메커니즘을 갖는 것은 유용하다. 여기에 설명된 토큰 교환 프로토콜은 어떤 유형의 토큰과도 함께 사용할 수 있지만, 이 절은 이러한 의미론을 JWT와 OAuth 2.0 Token Introspection [RFC7662] 응답에서 구체적으로 표현하기 위한 클레임을 정의한다. 다른 유형의 토큰에 대한 유사한 정의도 가능하지만 이 명세의 범위를 벗어난다.

여기에 설정되지 않았지만 예제와 설명에서 사용되는 클레임, 예컨대 iss, sub, exp 등은 [JWT]에서 정의한다는 점에 유의한다.

4.1. "act" (행위자) 클레임

act (actor) 클레임은 JWT 안에서 위임이 발생했음을 표현하고 권한이 위임된 행동 당사자를 식별하는 수단을 제공한다. act 클레임 값은 JSON 객체이며, 그 JSON 객체의 멤버는 행위자를 식별하는 클레임이다. act 클레임을 구성하는 클레임은 행위자를 식별하고, 가능하면 행위자에 대한 추가 정보를 제공한다. 예를 들어, 두 클레임 isssub의 조합이 행위자를 고유하게 식별하는 데 필요할 수 있다.

그러나 act 클레임 안의 클레임은 행위자의 신원에만 관련되며, 최상위 클레임과 같은 방식으로 포함하는 JWT의 유효성과는 관련되지 않는다. 따라서 비신원 클레임(예: exp, nbf, 및 aud)은 act 클레임 안에서 사용될 때 의미가 없으므로 사용되지 않는다.

그림 5는 JWT Claims Set 안의 act (actor) 클레임을 보여 준다. 토큰 자체의 클레임은 user@example.com에 관한 것이고, act 클레임은 admin@example.com이 현재 행위자임을 나타낸다.

 {
   "aud":"https://consumer.example.com",
   "iss":"https://issuer.example.com",
   "exp":1443904177,
   "nbf":1443904077,
   "sub":"user@example.com",
   "act":
   {
     "sub":"admin@example.com"
   }
 }
그림 5: 행위자 클레임

위임 체인은 하나의 act 클레임을 다른 act 클레임 안에 중첩하여 표현할 수 있다. 가장 바깥쪽 act 클레임은 현재 행위자를 나타내며, 중첩된 act 클레임은 이전 행위자를 나타낸다. 가장 오래된 행위자는 가장 깊게 중첩된다. 중첩된 act 클레임은 최초 요청 및 주체를 현재 행위자에 도달하기 전에 수행된 다양한 위임 단계와 연결하는 이력 추적 역할을 한다. 이러한 의미에서 현재 행위자는 전체 인가/위임 이력을 포함하는 것으로 간주되며, 여기에서 설명하는 중첩 구조로 자연스럽게 이어진다.

액세스 제어 정책을 적용할 목적으로, 토큰의 소비자는 토큰의 최상위 클레임과 act 클레임이 현재 행위자로 식별한 당사자만 고려해야 MUST 한다. 중첩된 act 클레임이 식별한 이전 행위자는 정보 제공용일 뿐이며 액세스 제어 결정에서 고려되어서는 안 된다.

그림 6의 다음 예는 JWT Claims Set 안의 중첩된 act (actor) 클레임을 보여 준다. 토큰 자체의 클레임은 user@example.com에 관한 것이고, act 클레임은 시스템 <https://service16.example.com>이 현재 행위자이며 <https://service77.example.com>가 이전 행위자였음을 나타낸다. 그러한 토큰은 service16이 service77의 호출에서 토큰을 수신하고, 인가 서버가 새로 발급된 토큰에 그 상황을 기록하면서 service26을 호출하기에 적합한 토큰으로 교환한 결과로 생성될 수 있다.

 {
   "aud":"https://service26.example.com",
   "iss":"https://issuer.example.com",
   "exp":1443904100,
   "nbf":1443904000,
   "sub":"user@example.com",
   "act":
   {
     "sub":"https://service16.example.com",
     "act":
     {
       "sub":"https://service77.example.com"
     }
   }
 }
그림 6: 중첩된 행위자 클레임

OAuth 토큰 검사 응답의 최상위 멤버로 포함될 때, act는 같은 이름의 클레임과 동일한 의미론 및 형식을 가진다.

4.2. "scope" (범위) 클레임

scope 클레임의 값은 [RFC6749]의 섹션 3.3에 설명된 형식으로, 토큰과 관련된 범위의 공백으로 구분된 목록을 포함하는 JSON 문자열이다.

그림 7은 JWT Claims Set 안의 scope 클레임을 보여 준다.

 {
   "aud":"https://consumer.example.com",
   "iss":"https://issuer.example.com",
   "exp":1443904177,
   "nbf":1443904077,
   "sub":"dgaf4mvfs75Fci_FL3heQA",
   "scope":"email profile phone address"
 }
그림 7: 범위 클레임

OAuth 2.0 Token Introspection [RFC7662]는 이미 토큰과 관련된 범위를 전달하기 위해 scope 매개변수를 정의한다.

4.3. "client_id" (클라이언트 식별자) 클레임

client_id 클레임은 토큰을 요청한 OAuth 2.0 [RFC6749] 클라이언트의 클라이언트 식별자를 전달한다.

그림 8의 다음 예는 식별자가 "s6BhdRkqt3"인 OAuth 2.0 클라이언트를 나타내는 JWT Claims Set 안의 client_id 클레임을 보여 준다.

 {
   "aud":"https://consumer.example.com",
   "iss":"https://issuer.example.com",
   "exp":1443904177,
   "sub":"user@example.com",
   "client_id":"s6BhdRkqt3"
 }
그림 8: 클라이언트 식별자 클레임

OAuth 2.0 Token Introspection [RFC7662]는 이미 토큰을 요청한 OAuth 2.0 클라이언트의 클라이언트 식별자로 client_id 매개변수를 정의한다.

4.4. "may_act" (인가된 행위자) 클레임

may_act 클레임은 한 당사자가 행위자가 되어 다른 당사자를 대신하여 행동하도록 인가되었다는 진술을 만든다. 예를 들어 subject_token이 토큰 교환 요청에서 토큰 엔드포인트에 제시될 때, subject token 안의 may_act 클레임은 클라이언트(또는 actor_token에서 식별된 당사자)가 요청된 위임 또는 가장에 참여하도록 인가되었는지를 인가 서버가 결정하는 데 사용될 수 있다. 클레임 값은 JSON 객체이며, JSON 객체의 멤버는 클레임을 포함한 JWT가 식별하는 당사자를 위해 행동할 자격이 있다고 주장되는 당사자를 식별하는 클레임이다. may_act 클레임을 구성하는 클레임은 인가된 행위자를 식별하고 가능하면 그에 관한 추가 정보를 제공한다. 예를 들어 두 클레임 isssub의 조합은 인가된 행위자를 고유하게 식별하는 데 때때로 필요하며, email 클레임은 해당 당사자에 관한 추가로 유용한 정보를 제공하는 데 사용될 수 있다.

그러나 may_act 클레임 안의 클레임은 그 당사자의 신원에만 관련되며, 최상위 클레임과 같은 방식으로 포함하는 JWT의 유효성과는 관련되지 않는다. 따라서 exp, nbf, 및 aud와 같은 클레임은 may_act 클레임 안에서 사용될 때 의미가 없으므로 사용되지 않는다.

그림 9는 JWT Claims Set 안의 may_act 클레임을 보여 준다. 토큰 자체의 클레임은 user@example.com에 관한 것이고, may_act 클레임은 admin@example.com이 user@example.com을 대신하여 행동하도록 인가되었음을 나타낸다.

 {
   "aud":"https://consumer.example.com",
   "iss":"https://issuer.example.com",
   "exp":1443904177,
   "nbf":1443904077,
   "sub":"user@example.com",
   "may_act":
   {
     "sub":"admin@example.com"
   }
 }
그림 9: 인가된 행위자 클레임

OAuth 토큰 검사 응답의 최상위 멤버로 포함될 때, may_act는 같은 이름의 클레임과 동일한 의미론 및 형식을 가진다.

5. 보안 고려사항

[RFC6749]의 섹션 10, 즉 The OAuth 2.0 Authorization Framework의 보안 고려사항에 있는 많은 지침도 여기에서 적용된다. 또한 [RFC6819]는 OAuth에 대한 추가 보안 고려사항을 제공하며, [OAUTH-SECURITY]는 OAuth 2.0이 원래 게시된 이후 배포 경험과 새로 등장한 위협에 기반한 최신 보안 지침을 제공한다.

[JWT]에서 논의되는 일반적인 보안 문제, 특히 URI 비교 및 인식되지 않은 값 처리와 관련된 문제도 모두 여기에 적용된다.

또한 위임과 가장은 고유한 보안 문제를 도입한다. 한 주체에게 다른 주체의 권리가 위임될 때마다 남용 가능성은 우려 사항이다. scope 클레임의 사용은 (제한된 토큰 수명과 같은 다른 일반적인 제약과 더불어) 그러한 남용 가능성을 완화하기 위해 제안된다. 이는 위임된 권리가 행사될 수 있는 맥락을 제한하기 때문이다.

6. 개인정보 보호 고려사항

여기에 설명된 기능의 맥락에서 사용되는 토큰은 개인정보에 민감한 정보를 포함할 수 있으며, 그러한 정보가 의도하지 않은 당사자에게 공개되는 것을 방지하기 위해, Transport Layer Security (TLS)와 같은 암호화된 채널을 통해서만 전송되어야 MUST 한다. 특정 정보가 클라이언트에게 공개되는 것을 방지하는 것이 바람직한 경우, 토큰은 의도한 수신자를 위해 암호화되어야 MUST 한다. 배포는 필요한 최소한의 데이터 양을 결정하고, 그러한 정보만 발급된 토큰에 포함해야 SHOULD 한다. 일부 경우 데이터 최소화에는 익명 또는 가명 사용자를 나타내는 것만 포함될 수 있다.

7. IANA 고려사항

7.1. OAuth URI 등록

IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth URI" 하위 레지스트리에 다음 값을 등록했다. "OAuth URI" 하위 레지스트리는 [RFC6755]에 의해 설정되었다.

  • URN: urn:ietf:params:oauth:grant-type:token-exchange
  • 일반 이름: OAuth 2.0용 토큰 교환 grant type
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.1
  • URN: urn:ietf:params:oauth:token-type:access_token
  • 일반 이름: OAuth 2.0 액세스 토큰의 토큰 유형 URI
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 3
  • URN: urn:ietf:params:oauth:token-type:refresh_token
  • 일반 이름: OAuth 2.0 refresh token의 토큰 유형 URI
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 3
  • URN: urn:ietf:params:oauth:token-type:id_token
  • 일반 이름: ID Token의 토큰 유형 URI
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 3
  • URN: urn:ietf:params:oauth:token-type:saml1
  • 일반 이름: base64url로 인코딩된 SAML 1.1 어서션의 토큰 유형 URI
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 3
  • URN: urn:ietf:params:oauth:token-type:saml2
  • 일반 이름: base64url로 인코딩된 SAML 2.0 어서션의 토큰 유형 URI
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 3

7.2. OAuth 매개변수 등록

IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth Parameters" 하위 레지스트리에 다음 값을 등록했다. "OAuth Parameters" 하위 레지스트리는 [RFC6749]에 의해 설정되었다.

  • 매개변수 이름: audience
  • 매개변수 사용 위치: 토큰 요청
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.1
  • 매개변수 이름: requested_token_type
  • 매개변수 사용 위치: 토큰 요청
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.1
  • 매개변수 이름: subject_token
  • 매개변수 사용 위치: 토큰 요청
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.1
  • 매개변수 이름: subject_token_type
  • 매개변수 사용 위치: 토큰 요청
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.1
  • 매개변수 이름: actor_token
  • 매개변수 사용 위치: 토큰 요청
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.1
  • 매개변수 이름: actor_token_type
  • 매개변수 사용 위치: 토큰 요청
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.1
  • 매개변수 이름: issued_token_type
  • 매개변수 사용 위치: 토큰 응답
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.2.1

7.3. OAuth 액세스 토큰 유형 등록

IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth Access Token Types" 하위 레지스트리에 다음 액세스 토큰 유형을 등록했다. "OAuth Access Token Types" 하위 레지스트리는 [RFC6749]에 의해 설정되었다.

  • 유형 이름: N_A
  • 추가 토큰 엔드포인트 응답 매개변수: 없음
  • HTTP 인증 스킴: 없음
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 2.2.1

7.4. JSON Web Token 클레임 등록

IANA는 "JSON Web Token (JWT)" 레지스트리 [IANA.JWT]의 "JSON Web Token Claims" 하위 레지스트리에 다음 클레임을 등록했다. "JSON Web Token Claims" 하위 레지스트리는 [JWT]에 의해 설정되었다.

  • 클레임 이름: act
  • 클레임 설명: 행위자
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 4.1
  • 클레임 이름: scope
  • 클레임 설명: 범위 값
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 4.2
  • 클레임 이름: client_id
  • 클레임 설명: 클라이언트 식별자
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 4.3
  • 클레임 이름: may_act
  • 클레임 설명: 인가된 행위자 - 행위자가 되도록 인가된 당사자
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 4.4

7.5. OAuth 토큰 검사 응답 등록

IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth Token Introspection Response" 레지스트리에 다음 값을 등록했다. "OAuth Token Introspection Response" 레지스트리는 [RFC7662]에 의해 설정되었다.

  • 이름: act
  • 설명: 행위자
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 4.1
  • 이름: may_act
  • 설명: 인가된 행위자 - 행위자가 되도록 인가된 당사자
  • 변경 관리자: IESG
  • 명세 문서: RFC 8693의 섹션 4.4

8. 참고문헌

8.1. 규범 참고문헌

[IANA.JWT]
IANA, "JSON Web Token (JWT)", <https://www.iana.org/assignments/jwt>.
[IANA.OAuth.Parameters]
IANA, "OAuth Parameters", <https://www.iana.org/assignments/oauth-parameters>.
[JWT]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/info/rfc7519>.
[RFC2119]
Bradner, S., "RFC에서 요구 수준을 나타내기 위한 핵심 단어", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC3986]
Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, DOI 10.17487/RFC3986, , <https://www.rfc-editor.org/info/rfc3986>.
[RFC6749]
Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", RFC 6749, DOI 10.17487/RFC6749, , <https://www.rfc-editor.org/info/rfc6749>.
[RFC7662]
Richer, J., Ed., "OAuth 2.0 Token Introspection", RFC 7662, DOI 10.17487/RFC7662, , <https://www.rfc-editor.org/info/rfc7662>.
[RFC8174]
Leiba, B., "RFC 2119 핵심 단어에서 대문자와 소문자의 모호성", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC8259]
Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/info/rfc8259>.

8.2. 정보 참고문헌

[OASIS.saml-core-1.1]
Maler, E., Mishra, P., and R. Philpott, "Assertions and Protocol for the OASIS Security Assertion Markup Language (SAML) V1.1", OASIS Standard oasis-sstc-saml-core-1.1, , <https://www.oasis-open.org/committees/download.php/3406/oasis-sstc-saml-core-1.1.pdf>.
[OASIS.saml-core-2.0-os]
Cantor, S., Kemp, J., Philpott, R., and E. Maler, "Assertions and Protocol for the OASIS Security Assertion Markup Language (SAML) V2.0", OASIS Standard saml-core-2.0-os, , <http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf>.
[OAUTH-RESOURCE]
Campbell, B., Bradley, J., and H. Tschofenig, "Resource Indicators for OAuth 2.0", 진행 중 작업, Internet-Draft, draft-ietf-oauth-resource-indicators-08, , <https://tools.ietf.org/html/draft-ietf-oauth-resource-indicators-08>.
[OAUTH-SECURITY]
Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett, "OAuth 2.0 Security Best Current Practice", 진행 중 작업, Internet-Draft, draft-ietf-oauth-security-topics-13, , <https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13>.
[OpenID.Core]
Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore, "OpenID Connect Core 1.0", , <https://openid.net/specs/openid-connect-core-1_0.html>.
[RFC6750]
Jones, M. and D. Hardt, "The OAuth 2.0 Authorization Framework: Bearer Token Usage", RFC 6750, DOI 10.17487/RFC6750, , <https://www.rfc-editor.org/info/rfc6750>.
[RFC6755]
Campbell, B. and H. Tschofenig, "OAuth용 IETF URN 하위 네임스페이스", RFC 6755, DOI 10.17487/RFC6755, , <https://www.rfc-editor.org/info/rfc6755>.
[RFC6819]
Lodderstedt, T., Ed., McGloin, M., and P. Hunt, "OAuth 2.0 위협 모델 및 보안 고려사항", RFC 6819, DOI 10.17487/RFC6819, , <https://www.rfc-editor.org/info/rfc6819>.
[RFC7521]
Campbell, B., Mortimore, C., Jones, M., and Y. Goland, "OAuth 2.0 클라이언트 인증 및 인가 grant를 위한 어서션 프레임워크", RFC 7521, DOI 10.17487/RFC7521, , <https://www.rfc-editor.org/info/rfc7521>.
[RFC7523]
Jones, M., Campbell, B., and C. Mortimore, "OAuth 2.0 클라이언트 인증 및 인가 grant를 위한 JSON Web Token (JWT) 프로파일", RFC 7523, DOI 10.17487/RFC7523, , <https://www.rfc-editor.org/info/rfc7523>.
[WS-Trust]
Nadalin, A., Ed., Goodner, M., Ed., Gudgin, M., Ed., Barbir, A., Ed., and H. Granqvist, Ed., "WS-Trust 1.4", , <https://docs.oasis-open.org/ws-sx/ws-trust/v1.4/ws-trust.html>.

부록 A. 추가 토큰 교환 예

다음 절에서는 각각 가장과 위임을 보여 주는 두 가지 토큰 교환 예가 제공된다 (추가 줄바꿈과 들여쓰기는 표시 목적일 뿐이다).

A.1. 가장 토큰 교환 예

A.1.1. 토큰 교환 요청

다음 토큰 교환 요청에서 클라이언트는 가장 의미론을 가진 토큰을 요청한다 (subject_token만 있고 actor_token이 없으면 위임은 불가능하다). 클라이언트는 인가 서버에 논리적 이름이 urn:example:cooperation-context인 대상 서비스에서 사용할 토큰이 필요하다고 알린다.

 POST /as/token.oauth2 HTTP/1.1
 Host: as.example.com
 Content-Type: application/x-www-form-urlencoded

 grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
 &audience=urn%3Aexample%3Acooperation-context
 &subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc
   zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI
   uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTA2MDAsIm5iZiI6MTQ0MTkwOTAwMCwic
   3ViIjoiYmRjQGV4YW1wbGUubmV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN
   0b3J5In0.PRBg-jXn4cJuj1gmYXFiGkZzRuzbXZ_sDxdE98ddW44ufsbWLKd3JJ1VZ
   hF64pbTtfjy4VXFVBDaQpKjn5JzAw
 &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
그림 10: 토큰 교환 요청

A.1.2. 주체 토큰 클레임

이전 요청의 subject_token은 JWT이며, 디코딩된 JWT Claims Set은 여기에 표시된다. JWT는 특정 시간 창 안에서 인가 서버가 소비하도록 의도되어 있다. JWT의 주체(bdc@example.net)는 새 토큰이 대신 요청되는 당사자이다.

  {
    "aud":"https://as.example.com",
    "iss":"https://original-issuer.example.net",
    "exp":1441910600,
    "nbf":1441909000,
    "sub":"bdc@example.net",
    "scope":"orders profile history"
  }
그림 11: 주체 토큰 클레임

A.1.3. 토큰 교환 응답

아래에 표시된 토큰 교환 응답의 access_token 매개변수는 클라이언트가 요청한 새 토큰을 포함한다. 응답의 다른 매개변수는 그 토큰이 한 시간 후 만료되는 bearer access token임을 나타낸다.

 HTTP/1.1 200 OK
 Content-Type: application/json
 Cache-Control: no-cache, no-store

 {
  "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4
    6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l
    eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic3ViIjoiYmRjQGV4YW1wbGUub
    mV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN0b3J5In0.rMdWpSGNACTvnF
    uOL74sYZ6MVuld2Z2WkGLmQeR9ztj6w2OXraQlkJmGjyiCq24kcB7AI2VqVxl3wSW
    nVKh85A",
  "issued_token_type":
    "urn:ietf:params:oauth:token-type:access_token",
  "token_type":"Bearer",
  "expires_in":3600
 }
그림 12: 토큰 교환 응답

A.1.4. 발급된 토큰 클레임

발급된 토큰의 디코딩된 JWT Claims Set은 아래에 표시된다. 새 JWT는 인가 서버가 발급하며, 논리적 이름 urn:example:cooperation-context로 알려진 시스템 엔티티가 만료 전 언제든 소비하도록 의도되어 있다. JWT의 주체(sub)는 요청을 수행하는 데 사용된 토큰의 주체와 동일하며, 이는 클라이언트가 그 토큰을 사용하여 urn:example:cooperation-context라는 논리적 이름으로 알려진 시스템 엔티티에서 해당 주체를 효과적으로 가장할 수 있게 한다.

  {
    "aud":"urn:example:cooperation-context",
    "iss":"https://as.example.com",
    "exp":1441913610,
    "sub":"bdc@example.net",
    "scope":"orders profile history"
  }
그림 13: 발급된 토큰 클레임

A.2. 위임 토큰 교환 예

A.2.1. 토큰 교환 요청

다음 토큰 교환 요청에서 클라이언트는 토큰을 요청하면서 subject_tokenactor_token을 모두 제공한다. 클라이언트는 인가 서버에 논리적 이름이 urn:example:cooperation-context인 대상 서비스에서 사용할 토큰이 필요하다고 알린다. 인가 서버의 정책은 발급된 토큰이 복합 토큰이어야 한다고 규정한다.

 POST /as/token.oauth2 HTTP/1.1
 Host: as.example.com
 Content-Type: application/x-www-form-urlencoded

 grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
 &audience=urn%3Aexample%3Acooperation-context
 &subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc
   zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI
   uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInNjb3BlIjoic3RhdHVzIGZlZ
   WQiLCJzdWIiOiJ1c2VyQGV4YW1wbGUubmV0IiwibWF5X2FjdCI6eyJzdWIiOiJhZG1
   pbkBleGFtcGxlLm5ldCJ9fQ.4rPRSWihQbpMIgAmAoqaJojAxj-p2X8_fAtAGTXrvM
   xU-eEZHnXqY0_AOZgLdxw5DyLzua8H_I10MCcckF-Q_g
 &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
 &actor_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwczo
   vL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXIuZ
   XhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInN1YiI6ImFkbWluQGV4YW1wbGU
   ubmV0In0.7YQ-3zPfhUvzje5oqw8COCvN5uP6NsKik9CVV6cAOf4QKgM-tKfiOwcgZ
   oUuDL2tEs6tqPlcBlMjiSzEjm3yBg
 &actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
그림 14: 토큰 교환 요청

A.2.2. 주체 토큰 클레임

이전 요청의 subject_token은 JWT이며, 디코딩된 JWT Claims Set은 여기에 표시된다. JWT는 특정 만료 시간 전에 인가 서버가 소비하도록 의도되어 있다. JWT의 주체 (user@example.net)는 새 토큰이 대신 요청되는 당사자이다.

  {
    "aud":"https://as.example.com",
    "iss":"https://original-issuer.example.net",
    "exp":1441910060,
    "scope":"status feed",
    "sub":"user@example.net",
    "may_act":
    {
      "sub":"admin@example.net"
    }
  }
그림 15: 주체 토큰 클레임

A.2.3. 행위자 토큰 클레임

이전 요청의 actor_token은 JWT이며, 디코딩된 JWT Claims Set은 여기에 표시된다. 이 JWT 역시 특정 만료 시간 전에 인가 서버가 소비하도록 의도되어 있다. JWT의 주체 (admin@example.net)는 요청 중인 보안 토큰을 행사할 행위자이다.

  {
    "aud":"https://as.example.com",
    "iss":"https://original-issuer.example.net",
    "exp":1441910060,
    "sub":"admin@example.net"
  }
그림 16: 행위자 토큰 클레임

A.2.4. 토큰 교환 응답

아래에 표시된 토큰 교환 응답의 access_token 매개변수는 클라이언트가 요청한 새 토큰을 포함한다. 응답의 다른 매개변수는 토큰이 한 시간 후 만료되는 JWT이며, 발급된 토큰이 액세스 토큰이 아니므로 access token type이 적용되지 않음을 나타낸다.

 HTTP/1.1 200 OK
 Content-Type: application/json
 Cache-Control: no-cache, no-store

 {
  "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4
    6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l
    eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic2NvcGUiOiJzdGF0dXMgZmVlZ
    CIsInN1YiI6InVzZXJAZXhhbXBsZS5uZXQiLCJhY3QiOnsic3ViIjoiYWRtaW5AZX
    hhbXBsZS5uZXQifX0.3paKl9UySKYB5ng6_cUtQ2qlO8Rc_y7Mea7IwEXTcYbNdwG
    9-G1EKCFe5fW3H0hwX-MSZ49Wpcb1SiAZaOQBtw",
  "issued_token_type":"urn:ietf:params:oauth:token-type:jwt",
  "token_type":"N_A",
  "expires_in":3600
 }
그림 17: 토큰 교환 응답

A.2.5. 발급된 토큰 클레임

발급된 토큰의 디코딩된 JWT Claims Set은 아래에 표시된다. 새 JWT는 인가 서버가 발급하며, 논리적 이름 urn:example:cooperation-context로 알려진 시스템 엔티티가 만료 전 언제든 소비하도록 의도되어 있다. JWT의 주체(sub)는 요청을 수행하는 데 사용된 subject_token의 주체와 동일하다. JWT의 행위자(act)는 요청을 수행하는 데 사용된 actor_token의 주체와 동일하다. 이는 위임을 나타내며, admin@example.netuser@example.net을 대신하여 행동하도록 권한이 위임된 현재 행위자로 식별한다.

  {
    "aud":"urn:example:cooperation-context",
    "iss":"https://as.example.com",
    "exp":1441913610,
    "scope":"status feed",
    "sub":"user@example.net",
    "act":
    {
      "sub":"admin@example.net"
    }
  }
그림 18: 발급된 토큰 클레임

감사의 말

이 명세는 수십 명의 적극적이고 헌신적인 참여자를 포함한 OAuth Working Group 안에서 개발되었다. 이는 Hannes Tschofenig, Derek Atkins, 및 Rifaat Shekh-Yusef의 의장직 아래에서 작성되었으며, Kathleen Moriarty, Stephen Farrell, Eric Rescorla, Roman Danyliw, 및 Benjamin Kaduk가 Security Area Directors로 활동했다.

다음 개인들은 이 명세에 아이디어, 피드백 및 문구를 기여했다: Caleb Baker, Vittorio Bertocci, Mike Brown, Thomas Broyer, Roman Danyliw, William Denniss, Vladimir Dzhuvinov, Eric Fazendin, Phil Hunt, Benjamin Kaduk, Jason Keglovitz, Torsten Lodderstedt, Barry Leiba, Adam Lewis, James Manger, Nov Matake, Matt Miller, Hilarie Orman, Matthew Perry, Eric Rescorla, Justin Richer, Adam Roach, Rifaat Shekh-Yusef, Scott Tomilson, 그리고 Hannes Tschofenig.

저자 주소

Michael B. Jones
Microsoft
Anthony Nadalin
Microsoft
Brian Campbell (편집자)
Ping Identity
John Bradley
Yubico
Chuck Mortimore
Visa