GET /resource HTTP/1.1 Host: frontend.example.com Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC
| RFC 8693 | OAuth 2.0 토큰 교환 | 2020년 1월 |
| Jones 외. | 표준 트랙 | [페이지] |
이 명세는 HTTP 및 JSON 기반의 보안 토큰 서비스(STS)를 위한 프로토콜을 정의하며, OAuth 2.0 인가 서버에서 보안 토큰을 요청하고 획득하는 방법을 정의합니다. 가장 및 위임을 사용하는 보안 토큰도 포함합니다.¶
이 문서는 인터넷 표준 트랙 문서입니다.¶
이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물입니다. 이는 IETF 커뮤니티의 합의를 나타냅니다. 공개 검토를 받았으며 인터넷 엔지니어링 운영 그룹(IESG)에 의해 출판 승인을 받았습니다. 인터넷 표준에 관한 추가 정보는 RFC 7841의 섹션 2에서 확인할 수 있습니다.¶
이 문서의 현재 상태, 모든 정오표 및 이에 대한 피드백 제공 방법에 관한 정보는 다음에서 확인할 수 있습니다. https://www.rfc-editor.org/info/rfc8693.¶
Copyright (c) 2020 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.¶
보안 토큰은 이기종 환경 또는 보안 도메인 간에 신원 및 보안 정보를 공유하는 데 도움이 되는 정보의 집합이다. 보안 토큰의 예로는 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 스타일 토큰이 요구되거나 발급될 것인지 등, 관련 당사자와 신뢰의 구체적인 성격에 관한 더 상세한 요구사항을 제공할 수 있다. 그러나 이러한 세부 사항은 개별 배포의 특정 요구에 따라 내려지는 정책 결정인 경우가 많으며, 그에 따라 구성되거나 구현될 것이다.¶
획득한 보안 토큰은 여러 맥락에서 사용될 수 있으며, 그 구체적인 사항 역시 이 명세의 범위를 벗어난다.¶
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 클레임은
위임 체인의 표현을 제공할 수 있다.¶
이 문서에서 키워드 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석된다.¶
클라이언트는 [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에 포함된다.¶
urn:ietf:params:oauth:grant-type:token-exchange는
토큰 교환이 수행되고 있음을 나타낸다.¶
resource 매개변수는 클라이언트가
토큰 교환 요청에서 보통 https URL로 위치를 제공함으로써,
해당 리소스에 접근할 때 사용될 것과 동일한 형식으로
발급된 토큰을 어디에서 사용하려는지 인가 서버에
표시할 수 있게 한다.
인가 서버는 일반적으로 resource URI 값에서
적절한 정책으로 매핑하는 기능을 가진다. resource 매개변수의 값은
[RFC3986]의
섹션 4.3에 명시된
절대 URI여야 MUST 하며,
쿼리 구성요소를 포함할 수 MAY 있지만
프래그먼트 구성요소를 포함해서는 MUST
NOT 안 된다.
여러 resource 매개변수를 사용하여
발급된 토큰이 나열된 여러 리소스에서 사용될 예정임을 나타낼 수 있다.
resource 매개변수에 관한 추가
배경과 사용은 [OAUTH-RESOURCE]를 참조한다.¶
resource 매개변수와 유사한 목적을 수행하지만,
클라이언트가 대상 서비스에 대한 논리적 이름을
제공한다. 이름의 해석은 그 값이 클라이언트와
인가 서버 모두가 이해하는 것이어야 함을 요구한다.
OAuth 클라이언트 식별자, SAML 엔티티
식별자 [OASIS.saml-core-2.0-os], 및 OpenID Connect
Issuer Identifier [OpenID.Core]는
audience 매개변수 값으로
사용될 수 있는 것의 예이다.
그러나 주어진 인가 서버와 함께 사용되는 audience 값은
해당 서버 안에서 고유해야 하며, 이는 그것들이
의도한 값 유형으로 올바르게 해석되도록 보장하기 위함이다.
여러 audience 매개변수를 사용하여
발급된 토큰이 나열된 여러 대상에서 사용될 예정임을 나타낼 수 있다.
audience와 resource 매개변수를 함께 사용하여
논리적 이름과 리소스 URI가 섞인 여러 대상 서비스를 나타낼 수 있다.¶
resource 또는
audience 매개변수가 나타내는
서비스 또는 리소스의 요구사항에 대한 지식에 의해
결정될 수 있다.¶
subject_token 매개변수 안의
보안 토큰 유형을 나타내는
섹션 3에 설명된 식별자이다.¶
actor_token 매개변수 안의
보안 토큰 유형을 나타내는
섹션 3에 설명된 식별자이다.
이는 요청에 actor_token 매개변수가
존재할 때 REQUIRED이지만,
그렇지 않은 경우 포함되어서는 MUST NOT 안 된다.¶
요청을 처리할 때, 인가 서버는 표시된 토큰 유형에 대해 적절한 검증 절차를 수행해야 MUST 하며, actor token이 존재하는 경우 그 표시된 토큰 유형에 대해서도 적절한 검증 절차를 수행해야 한다. 특정 토큰의 유효성 기준과 세부 사항은 이 문서의 범위를 벗어나며 해당 토큰 유형과 그 내용에 특화되어 있다.¶
토큰 유형에 특화된 일회성 사용 또는 기타 의미론이 없는 경우, 토큰 교환을 수행하는 행위는 subject token 또는 actor token의 유효성에 아무런 영향을 주지 않는다. 또한 교환은 일회성 이벤트이며 입력 토큰과 출력 토큰 사이에 긴밀한 연결을 만들지 않는다. 따라서 예를 들어 출력 토큰의 만료 시간이 입력 토큰의 만료 시간에 영향을 받을 수는 있지만, 입력 토큰의 갱신 또는 연장이 출력 토큰의 속성에 반영될 것으로 기대되지는 않는다. 토큰 폐기 이벤트를 전파하는 것이 여전히 적절하거나 바람직할 수 있다. 그러나 그렇게 하는 것은 STS 프로토콜의 일반적인 속성이 아니며, 특정 구현, 토큰 유형 또는 배포에 특화될 것이다.¶
토큰을 요청할 때 클라이언트는 audience 및
resource 매개변수를 통해 해당 토큰을 사용하려는
원하는 대상 서비스(들)를 나타낼 수 있으며,
scope 매개변수를 사용하여 요청한 토큰의
원하는 범위를 나타낼 수도 있다.
그러한 요청의 의미론은 클라이언트가 요청한 모든 대상 서비스에서
사용 가능한 요청 범위의 토큰을 요청한다는 것이다. 사실상 토큰의
요청된 액세스 권리는 모든 대상 서비스에 대한 모든 범위의
데카르트 곱이다.¶
인가 서버는 어떤 토큰 요청도 이행하기를 꺼리거나 이행할 수 없을 수 있지만,
매우 광범위한 액세스 권리가 요청될 때는
이행 불가능한 요청일 가능성이 훨씬 더 높다.
따라서 배포 내 시스템 간 관계에 대한 구체적인 지식이 없는 경우,
클라이언트는 요청하는 액세스의 폭, 특히 대상 서비스의 수에
신중해야 한다. 인가 서버는 섹션 2.2.2에서 정의한
invalid_target 오류 코드를 사용하여
클라이언트가 동시에 너무 많은 대상 서비스에 대한 액세스를
요청했음을 알릴 수 있다.¶
인가 서버는 토큰 교환 요청에 대해 [RFC6749]의 섹션 5에 명시된 것처럼 토큰 엔드포인트에서 오는 일반적인 OAuth 2.0 응답으로 응답한다. 추가 세부 사항과 설명은 다음 하위 절에서 제공된다.¶
요청이 유효하고 인가 서버의 모든 정책 및 기타 기준을 충족하는 경우, 성공 토큰 응답은 [RFC8259]에 명시된 "application/json" 미디어 유형과 HTTP 200 상태 코드를 사용하여 다음 매개변수를 HTTP 응답의 entity-body에 추가함으로써 구성된다. 매개변수는 각 매개변수를 최상위 수준에 추가하여 JavaScript Object Notation (JSON) 구조로 직렬화된다. 매개변수 이름과 문자열 값은 JSON 문자열로 포함된다. 숫자 값은 JSON 숫자로 포함된다. 매개변수의 순서는 중요하지 않으며 달라질 수 있다.¶
access_token 매개변수는 여기서 요청된
토큰을 전달하는 데 사용되며, 이는 이 토큰 교환 프로토콜이 토큰 엔드포인트에 대해 정의된
기존 OAuth 2.0 요청
및 응답 구조를 사용할 수 있게 한다.
식별자 access_token은 역사적
이유로 사용되며, 발급된 토큰이 OAuth 액세스 토큰일 필요는 없다.¶
Bearer 값은
발급된 보안 토큰이 bearer token이며, 클라이언트가
토큰 자체의 내용 이외에 추가적인 자격 증명 없이 그대로
제시할 수 있음을 나타낸다. 이
매개변수의 의미는 issued_token_type
매개변수의 의미와 다르다는 점에 유의한다. 후자는
발급된 보안 토큰의 표현을 선언한다. "token type"이라는 용어는
일반적으로 이 명세의 모든 *_token_type 매개변수에서처럼
보안 토큰의 구조적 또는 구문적 표현을 의미하는 데
더 자주 사용된다.
발급된 토큰이 액세스 토큰이 아니거나 액세스 토큰으로 사용할 수 없는 경우,
해당 맥락에서 OAuth 2.0 token_type
식별자가 적용되지 않음을 나타내기 위해
token_type 값 N_A가 사용된다.¶
urn:ietf:params:oauth:grant-type:token-exchange
grant type 요청에 대한 응답으로 refresh token을 기대해야 하는 조건을
명확히 문서화해야 한다.¶
요청 자체가 유효하지 않거나 subject_token 또는
actor_token 중 하나가 어떤 이유로든 유효하지 않거나
정책상 허용되지 않는 경우, 인가 서버는
[RFC6749]의
섹션 5.2에 명시된 대로
오류 응답을 구성해야 MUST 한다.
error 매개변수의 값은
invalid_request 오류 코드여야 MUST 한다.¶
인가 서버가 resource 또는 audience 매개변수로
표시된 어떤 대상 서비스에 대해서도 토큰을 발급하기를 꺼리거나 발급할 수 없는 경우,
오류 응답에는 invalid_target 오류 코드를 사용해야 SHOULD 한다.¶
인가 서버는
[RFC6749]의
섹션 5.2에서 논의한 것처럼 error_description을 사용하여
오류 사유에 관한 추가 정보를 포함할 수 MAY 있다.¶
다른 오류 코드도 적절한 경우 사용할 수 있다.¶
다음 예는 OAuth 리소스 서버가 교환 중 클라이언트 역할을 맡는 가상의 토큰 교환을 보여 준다. 리소스 서버는 보호된 리소스 요청에서 받은 액세스 토큰을, 백엔드 서비스를 호출하는 데 사용할 새 토큰으로 교환한다 (예제의 추가 줄바꿈과 들여쓰기는 표시 목적일 뿐이다).¶
그림 1은 [RFC6750]의 섹션 2.1에 명시된 대로, Authorization 헤더에 OAuth 액세스 토큰을 포함한 보호된 리소스 요청을 리소스 서버가 수신하는 모습을 보여 준다.¶
GET /resource HTTP/1.1 Host: frontend.example.com Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC
그림 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
인가 서버는 토큰 교환 요청에 제시된 클라이언트 자격 증명과
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
}
그런 다음 리소스 서버는 그림 4에 예시된 것처럼 새로 획득한 액세스 토큰을 사용하여 백엔드 서버에 요청을 보낼 수 있다.¶
GET /api HTTP/1.1
Host: backend.example.com
Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQ
iOiJodHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2
FzLmV4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1M
zMsInN1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQe
dw6rxf59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIW
vmDCMy5-kdXjwhw
이 명세의 여러 매개변수는
해당 토큰을 설명하기 위한 값으로 식별자를 사용한다.
구체적으로, 이들은 요청의
requested_token_type,
subject_token_type, 및 actor_token_type
매개변수와 응답의 issued_token_type 멤버이다.
토큰 유형 식별자는 URI이다.
토큰 교환은 다른 당사자가 발급한 토큰과
주어진 인가 서버의 토큰 모두와 함께 작동할 수 있다. 전자의 경우
토큰 유형 식별자는 인가 서버가 파싱할 수 있도록 구문(예: JWT 또는 SAML 2.0)을
나타낸다. 후자의 경우에는
주어진 인가 서버가 그것을 무엇으로 발급했는지
(예: access_token 또는 refresh_token)를 나타낸다.¶
다음 토큰 유형 식별자는 이 명세에서 정의한다. 다른 토큰 유형을 나타내기 위해 다른 URI를 사용할 수 MAY 있다.¶
[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 또는 기타 인코딩의 의미론과 연결되어야 한다는 점에 유의한다.¶
토큰 안에서 위임을 표현하고, 위임 또는 가장에 대한 인가를 표현하기 위한 정의된 메커니즘을 갖는 것은 유용하다. 여기에 설명된 토큰 교환 프로토콜은 어떤 유형의 토큰과도 함께 사용할 수 있지만, 이 절은 이러한 의미론을 JWT와 OAuth 2.0 Token Introspection [RFC7662] 응답에서 구체적으로 표현하기 위한 클레임을 정의한다. 다른 유형의 토큰에 대한 유사한 정의도 가능하지만 이 명세의 범위를 벗어난다.¶
여기에 설정되지 않았지만 예제와 설명에서 사용되는 클레임,
예컨대 iss, sub,
exp 등은 [JWT]에서 정의한다는 점에 유의한다.¶
act (actor) 클레임은
JWT 안에서 위임이 발생했음을 표현하고 권한이 위임된
행동 당사자를 식별하는 수단을 제공한다. act 클레임 값은 JSON
객체이며, 그 JSON 객체의 멤버는 행위자를 식별하는 클레임이다.
act 클레임을 구성하는 클레임은 행위자를 식별하고,
가능하면 행위자에 대한 추가 정보를
제공한다. 예를 들어,
두 클레임 iss와 sub의 조합이
행위자를 고유하게 식별하는 데 필요할 수 있다.¶
그러나 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"
}
}
위임 체인은 하나의 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"
}
}
}
OAuth 토큰 검사 응답의 최상위 멤버로 포함될 때, act는
같은 이름의 클레임과 동일한 의미론 및 형식을 가진다.¶
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"
}
OAuth 2.0 Token Introspection [RFC7662]는 이미 토큰과 관련된 범위를 전달하기 위해
scope 매개변수를 정의한다.¶
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"
}
OAuth 2.0 Token Introspection [RFC7662]는 이미 토큰을 요청한 OAuth 2.0 클라이언트의
클라이언트 식별자로 client_id
매개변수를 정의한다.¶
may_act 클레임은 한 당사자가
행위자가 되어 다른 당사자를 대신하여 행동하도록 인가되었다는 진술을 만든다.
예를 들어 subject_token이
토큰 교환 요청에서 토큰 엔드포인트에 제시될 때,
subject token 안의 may_act 클레임은
클라이언트(또는 actor_token에서 식별된 당사자)가
요청된 위임 또는 가장에 참여하도록 인가되었는지를
인가 서버가 결정하는 데 사용될 수 있다.
클레임 값은 JSON 객체이며, JSON 객체의 멤버는
클레임을 포함한 JWT가 식별하는 당사자를 위해
행동할 자격이 있다고 주장되는 당사자를 식별하는 클레임이다.
may_act
클레임을 구성하는 클레임은 인가된 행위자를 식별하고
가능하면 그에 관한 추가 정보를 제공한다.
예를 들어 두 클레임 iss와
sub의 조합은 인가된 행위자를 고유하게 식별하는 데
때때로 필요하며,
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"
}
}
OAuth 토큰 검사 응답의 최상위 멤버로 포함될 때,
may_act는
같은 이름의 클레임과 동일한 의미론 및 형식을 가진다.¶
[RFC6749]의 섹션 10, 즉 The OAuth 2.0 Authorization Framework의 보안 고려사항에 있는 많은 지침도 여기에서 적용된다. 또한 [RFC6819]는 OAuth에 대한 추가 보안 고려사항을 제공하며, [OAUTH-SECURITY]는 OAuth 2.0이 원래 게시된 이후 배포 경험과 새로 등장한 위협에 기반한 최신 보안 지침을 제공한다.¶
[JWT]에서 논의되는 일반적인 보안 문제, 특히 URI 비교 및 인식되지 않은 값 처리와 관련된 문제도 모두 여기에 적용된다.¶
또한 위임과 가장은 고유한
보안 문제를 도입한다. 한 주체에게 다른 주체의 권리가 위임될 때마다
남용 가능성은 우려 사항이다.
scope 클레임의 사용은
(제한된 토큰 수명과 같은 다른 일반적인 제약과 더불어)
그러한 남용 가능성을 완화하기 위해 제안된다. 이는
위임된 권리가 행사될 수 있는 맥락을 제한하기 때문이다.¶
여기에 설명된 기능의 맥락에서 사용되는 토큰은 개인정보에 민감한 정보를 포함할 수 있으며, 그러한 정보가 의도하지 않은 당사자에게 공개되는 것을 방지하기 위해, Transport Layer Security (TLS)와 같은 암호화된 채널을 통해서만 전송되어야 MUST 한다. 특정 정보가 클라이언트에게 공개되는 것을 방지하는 것이 바람직한 경우, 토큰은 의도한 수신자를 위해 암호화되어야 MUST 한다. 배포는 필요한 최소한의 데이터 양을 결정하고, 그러한 정보만 발급된 토큰에 포함해야 SHOULD 한다. 일부 경우 데이터 최소화에는 익명 또는 가명 사용자를 나타내는 것만 포함될 수 있다.¶
IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth URI" 하위 레지스트리에 다음 값을 등록했다. "OAuth URI" 하위 레지스트리는 [RFC6755]에 의해 설정되었다.¶
IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth Parameters" 하위 레지스트리에 다음 값을 등록했다. "OAuth Parameters" 하위 레지스트리는 [RFC6749]에 의해 설정되었다.¶
IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth Access Token Types" 하위 레지스트리에 다음 액세스 토큰 유형을 등록했다. "OAuth Access Token Types" 하위 레지스트리는 [RFC6749]에 의해 설정되었다.¶
IANA는 "JSON Web Token (JWT)" 레지스트리 [IANA.JWT]의 "JSON Web Token Claims" 하위 레지스트리에 다음 클레임을 등록했다. "JSON Web Token Claims" 하위 레지스트리는 [JWT]에 의해 설정되었다.¶
IANA는 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]의 "OAuth Token Introspection Response" 레지스트리에 다음 값을 등록했다. "OAuth Token Introspection Response" 레지스트리는 [RFC7662]에 의해 설정되었다.¶
다음 절에서는 각각 가장과 위임을 보여 주는 두 가지 토큰 교환 예가 제공된다 (추가 줄바꿈과 들여쓰기는 표시 목적일 뿐이다).¶
다음 토큰 교환 요청에서 클라이언트는
가장 의미론을 가진 토큰을 요청한다
(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
이전 요청의 subject_token은 JWT이며,
디코딩된 JWT Claims Set은 여기에 표시된다. JWT는
특정 시간 창 안에서 인가 서버가 소비하도록 의도되어 있다.
JWT의 주체(bdc@example.net)는
새 토큰이 대신 요청되는 당사자이다.¶
아래에 표시된 토큰 교환 응답의 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
}
발급된 토큰의 디코딩된 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"
}
다음 토큰 교환 요청에서 클라이언트는 토큰을 요청하면서
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 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
이전 요청의 subject_token은 JWT이며,
디코딩된 JWT Claims Set은 여기에 표시된다. JWT는
특정 만료 시간 전에 인가 서버가
소비하도록 의도되어 있다.
JWT의 주체
(user@example.net)는
새 토큰이 대신 요청되는 당사자이다.¶
이전 요청의 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"
}
아래에 표시된 토큰 교환 응답의 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
}
발급된 토큰의 디코딩된 JWT Claims Set은 아래에 표시된다. 새 JWT는
인가 서버가 발급하며,
논리적 이름
urn:example:cooperation-context로 알려진
시스템 엔티티가 만료 전 언제든
소비하도록 의도되어 있다.
JWT의 주체(sub)는
요청을 수행하는 데 사용된 subject_token의
주체와 동일하다.
JWT의 행위자(act)는 요청을 수행하는 데 사용된
actor_token의 주체와 동일하다.
이는 위임을 나타내며,
admin@example.net을
user@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"
}
}
이 명세는 수십 명의 적극적이고 헌신적인 참여자를 포함한 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.¶