| RFC 9101 | OAuth JAR | 2021년 8월 |
| Sakimura 외 | 표준 트랙 | [페이지] |
RFC 6749에 설명된 OAuth 2.0의 인가 요청은 쿼리 매개변수 직렬화를 사용하며, 이는 인가 요청 매개변수가 요청의 URI에 인코딩되어 웹 브라우저와 같은 사용자 에이전트를 통해 전송됨을 의미한다. 구현하기는 쉽지만, 이는 a) 사용자 에이전트를 통한 통신이 무결성 보호를 받지 않으므로 매개변수가 변조될 수 있고, b) 통신의 출처가 인증되지 않으며, c) 사용자 에이전트를 통한 통신이 모니터링될 수 있음을 의미한다. 이러한 약점 때문에 이 프로토콜에 대한 여러 공격이 이제 제기되었다.¶
이 문서는 대신 요청 매개변수를 JSON Web Token (JWT)으로 전송할 수 있는 기능을 도입하며, 이를 통해 요청을 JSON Web Signature (JWS)로 서명하고 JSON Web Encryption (JWE)으로 암호화할 수 있으므로 인가 요청의 무결성, 출처 인증 및 기밀성 속성이 확보된다. 요청은 값으로 또는 참조로 전송될 수 있다.¶
이 문서는 인터넷 표준 트랙 문서이다.¶
이 문서는 인터넷 엔지니어링 태스크 포스 (IETF)의 산출물이다. 이는 IETF 커뮤니티의 합의를 나타낸다. 공개 검토를 받았으며 인터넷 엔지니어링 운영 그룹(IESG)에 의해 발행 승인을 받았다. 인터넷 표준에 관한 추가 정보는 RFC 7841의 섹션 2에서 확인할 수 있다.¶
이 문서의 현재 상태, 모든 정오표 및 이에 대한 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc9101에서 얻을 수 있다.¶
Copyright (c) 2021 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.¶
OAuth 2.0 [RFC6749]의 인가 요청은 쿼리 매개변수 직렬화를 사용하며, 일반적으로 웹 브라우저와 같은 사용자 에이전트를 통해 전송된다.¶
예를 들어, response_type, client_id, state 및
redirect_uri 매개변수는 요청의 URI에 인코딩된다:¶
구현하기는 쉽지만, URI 안의 인코딩은 기밀성 및 무결성 보호를 제공하기 위해 애플리케이션 계층 보안을 사용하는 것을 허용하지 않는다. TLS는 클라이언트와 사용자 에이전트 사이뿐 아니라 사용자 에이전트와 인가 서버 사이의 통신 보안을 제공하는 데 사용되지만, TLS 세션은 사용자 에이전트에서 종료된다. 또한, TLS 세션은 어떤 미들박스(예: 로드 밸런서)에서 조기에 종료될 수 있다.¶
그 결과, [RFC6749]의 인가 요청에는 다음과 같은 단점이 있다:¶
이러한 내재적인 약점 때문에 리디렉션 URI 재작성과 같은 프로토콜에 대한 여러 공격이 식별되었다.¶
애플리케이션 계층 보안을 사용하면 이러한 문제를 완화할 수 있다.¶
애플리케이션 계층 보안을 사용하면 신뢰할 수 있는 제3자가 요청을 준비하여 클라이언트 애플리케이션이 이전에 합의된 것보다 더 많은 권한을 요청하지 못하도록 할 수 있다.¶
또한, 요청을 참조로 전달하면 유선상 오버헤드를 줄일 수 있다.¶
JWT [RFC7519] 인코딩은 다음과 같은 이유로 선택되었다:¶
request 및 request_uri 매개변수는
OAuth 2.0 [RFC6749] 흐름을
위한
추가 인가 요청 매개변수로 도입된다. request 매개변수는
JSON으로 인코딩된 OAuth 2.0 인가 요청 매개변수를 JWT Claims
Set에 담는 JSON Web Token (JWT) [RFC7519]이다.
RFC 7519와 달리 Claims Set의 요소는 인코딩된 OAuth 요청
매개변수 [IANA.OAuth.Parameters]이며,
IANA가 관리하는 JSON Web Token Claims
[IANA.JWT.Claims] 중 일부, 특히 iss
및
aud만 보충된다는 점에 유의한다. request 매개변수 안의 JWT는 JWS를 사용하여
무결성 보호 및 출처 인증을 받는다.¶
JWT [RFC7519]는
참조로 인가 엔드포인트에 전달될 수 있으며,
이 경우 request 대신
request_uri 매개변수가 사용된다.¶
쿼리 매개변수 대신 요청 인코딩으로 JWT [RFC7519]를 사용하면 다음과 같은 여러 이점이 있다:¶
요청을 참조로 전달하는 것이 유용한 몇 가지 경우가 있다. 예를 들면 다음과 같다:¶
이 기능은 OpenID Connect [OpenID.Core]에서 사용되고 있다.¶
이 문서의 핵심 단어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"은 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그 경우에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 한다.¶
이 명세의 목적상, 다음 용어 및 정의는 OAuth 2.0 프레임워크 [RFC6749], JSON Web Signature [RFC7515] 및 JSON Web Encryption [RFC7516]에 정의된 것에 추가로 적용된다.¶
요청 객체는 JSON으로 인코딩된 OAuth 2.0 인가 요청 매개변수를 JWT Claims Set에 담는 JSON Web Token (JWT) [RFC7519]이다.¶
요청 객체 URI는 OAuth 2.0 인가 요청을 구성하는
매개변수 집합을 참조하는 절대 URI이다. URI가 참조하는
리소스의 내용은 요청
객체 (섹션 2.1)이다. 단,
해당 URI가 동일한 인가 서버에 의해 클라이언트에 제공된 경우,
그 내용은 인가 서버의 재량에 따른 구현 세부사항이다.
내용이 요청 객체라는 것은 request_uri의 제공자가
소비자와 별개의 엔티티인 경우, 예를 들어 클라이언트가
HTTPS를 통해 접근 가능하게 만든 클라이언트 백엔드 서비스에
저장된 요청 객체를 참조하는 URI를 제공하는 경우의 상호운용성을
보장하기 위한 것이다. 후자의 경우, 즉 인가 서버가 URI의
제공자이자 소비자인 경우, 예를 들어 요청 객체와 교환하여 URI를
제공하는 엔드포인트를 제공하는 경우에는 이러한 상호운용성
문제가 적용되지 않는다.¶
클라이언트는 application/x-www-form-urlencoded
형식을 사용하여 인가 엔드포인트 URI의 쿼리 구성요소에
다음 매개변수를 추가함으로써
인가 요청 URI를 구성한다:¶
request_uri가 지정되지 않은 경우 REQUIRED.
요청 객체 (섹션
2.1)로서,
[RFC6749]의 섹션 4 (OAuth 2.0)에 명시된
인가 요청 매개변수를 담는다.
이 매개변수가 인가 요청에 존재하는 경우,
request_uri는 존재해서는 안 된다 MUST NOT.¶
request가 지정되지 않은 경우 REQUIRED.
RFC 3986 [RFC3986]에 정의된 절대 URI로서,
[RFC6749]의 섹션 4 (OAuth
2.0)에 명시된 인가 요청 매개변수를 참조하는
요청 객체 URI (섹션
2.2)이다.
이 매개변수가 인가 요청에 존재하는 경우,
request는 존재해서는 안 된다 MUST NOT.¶
client_id. 값은 request 또는
request_uri
요청 객체의 (섹션
2.1)
client_id와 일치해야 MUST 한다.¶
클라이언트는 HTTP 리디렉션 응답 또는 사용자 에이전트를 통해 사용할 수 있는 다른 수단을 사용하여 리소스 소유자를 구성된 URI로 안내한다.¶
예를 들어, 클라이언트는 최종 사용자의 사용자 에이전트가 다음 HTTPS 요청을 하도록 안내한다:¶
request 매개변수의 값은 간결성을 위해 축약되어 있다.¶
인가 요청 객체는 다음 중 하나여야 MUST 한다:¶
클라이언트는 이전 버전과의 호환성 등을 위해 요청 객체에 포함된 매개변수를 쿼리 매개변수에도 중복하여 보낼 수 MAY 있다. 그러나 이 명세를 지원하는 인가 서버는 요청 객체에 포함된 매개변수만 사용해야 MUST 한다.¶
클라이언트는 인가 요청을
요청 객체로서 request 매개변수 값으로
인가 엔드포인트에 보낸다.¶
다음은 request
매개변수를 사용하는 인가 요청의 예이다
(표시 목적상 값 안에 줄바꿈이 포함됨):¶
https://server.example.com/authorize?client_id=s6BhdRkqt3&
request=eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6
ICJzNkJoZFJrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBs
ZS5jb20iLAogICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAg
ICAiY2xpZW50X2lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6
ICJodHRwczovL2NsaWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAi
b3BlbmlkIiwKICAgICJzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2Ui
OiAibi0wUzZfV3pBMk1qIiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VU
ElVaPjqW_ToI1yrEJ67BgKb5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC
0iQJwXu5YVY-vnW0_PLJb1C2HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKz
uKzqSb1wAZALo5f89B_p6QA6j6JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3E
YLYaCb4ik4I1zGXE4fvim9FIMs8OCMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W
9typPf846lGwA8h9G9oNTIuX8Ft2jfpnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3
j1i7tLR_5Nz-g
¶
request_uri 인가 요청 매개변수는
OAuth 인가 요청을 값이 아니라 참조로 전달할 수 있게 한다.
이 매개변수는 요청 객체 값이 값으로 전달되는 대신
지정된 URI로 식별되는 리소스에서 검색된다는 점을 제외하면
request 매개변수와 동일하게 사용된다.¶
전체 요청 URI는 512 ASCII 문자를 초과하지 않는 것이 좋다 SHOULD NOT. 이 제한에는 두 가지 이유가 있다:¶
request_uri가 참조하는 리소스의 내용은
요청 객체여야 MUST 하며, 해당 URI가 인가 서버에 의해
클라이언트에 제공된 경우가 아니라면 인가 서버가 접근할 수 있어야
MUST 한다.
첫 번째 경우, request_uri는
[RFC7230]의 섹션 2.7.2에 지정된
https URI여야 MUST 한다.
두 번째 경우, 이는
[RFC8141]에 지정된 URN이어야
MUST 한다.¶
다음은
request_uri에 의해 참조될 수 있는
요청 객체 리소스 내용의 예이다
(표시 목적상 값 안에 줄바꿈이 포함됨):¶
eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6ICJzNkJoZF JrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLAog ICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAgICAiY2xpZW50X2 lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6ICJodHRwczovL2Ns aWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAib3BlbmlkIiwKICAgIC JzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2UiOiAibi0wUzZfV3pBMk1q IiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VUElVaPjqW_ToI1yrEJ67BgK b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2 HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6 JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g¶
클라이언트는 요청 객체 리소스를 인가 서버가 접근할 수 있는
URI에 로컬 또는 원격으로 저장한다.
이러한 기능은 인가 서버 또는 신뢰할 수 있는 제3자가 제공할 수 있다.
예를 들어, 인가 서버는 클라이언트가 요청 객체를 POST하고
요청 URI를 얻는 URL을 제공할 수 있다.
이 URI가 요청 객체 URI, 즉 request_uri이다.¶
요청 객체가 인가 서버에만 공개되어야 하는 값을
포함할 수 있다.
따라서 request_uri는 공개적으로 검색 가능한 경우
해당 URI가 추측될 수 없도록 그 수명 동안
적절한 엔트로피를 가져야 MUST 한다.
지침은
[RFC6819]의 섹션
5.1.4.2.2 및
"Capability URL을 위한 모범 사례" [CapURLs]를 참조한다.
접근 제어 조치가 취해지지 않는 한, 합리적인 시간 제한 후
request_uri를 제거하는 것이 RECOMMENDED된다.¶
다음은 요청 객체 URI 값의 예이다 (표시 목적상 값 안에 줄바꿈이 포함됨). 이 예에서는 신뢰할 수 있는 제3자 서비스가 요청 객체를 호스팅한다.¶
https://tfp.example.org/request.jwt/
GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
¶
클라이언트는 인가 요청을 인가 엔드포인트에 보낸다.¶
다음은
request_uri 매개변수를 사용하는 인가 요청의 예이다
(표시 목적상 값 안에 줄바꿈이 포함됨):¶
https://server.example.com/authorize?
client_id=s6BhdRkqt3
&request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt
%2FGkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
¶
요청 객체가 암호화된 경우, 인가 서버는 JSON Web Encryption [RFC7516] 명세에 따라 JWT를 복호화해야 MUST 한다.¶
그 결과는 서명된 요청 객체이다.¶
복호화에 실패하면, 인가 서버는 인가 요청에 대한 응답으로
클라이언트에 invalid_request_object 오류를 반환해야
MUST 한다.¶
인가 서버는 JWS 서명된 [RFC7515] 요청
객체의 서명을 검증해야 MUST 한다.
kid 헤더 매개변수가 있는 경우, 식별된 키는
사용된 키여야 MUST 하며 클라이언트와 연결된
키여야 MUST 한다. 서명은 클라이언트와 연결된
키와 alg 헤더 매개변수에 지정된 알고리즘을 사용하여
검증되어야 MUST 한다. 알고리즘 검증은
[RFC8725]의 섹션 3.1 및 3.2에
지정된 대로 수행되어야 MUST 한다.¶
키가 클라이언트와 연결되어 있지 않거나 서명 검증에
실패하면, 인가 서버는 인가 요청에 대한 응답으로 클라이언트에
invalid_request_object 오류를 반환해야 MUST
한다.¶
인가 서버는 요청 객체 값에서
인가 요청 매개변수 집합을 추출해야
MUST 한다.
인가 서버는 동일한 매개변수가 쿼리 매개변수로 제공되더라도
요청 객체 안의 매개변수만 사용해야
MUST 한다.
client_id 요청 매개변수 안의 클라이언트 ID 값과
요청 객체 client_id Claim 안의 값은
동일해야 MUST 한다.
그런 다음 인가 서버는 OAuth 2.0 [RFC6749]에 지정된 대로 요청을 검증한다.¶
클라이언트 ID 확인 또는 요청 검증에 실패하면, 인가 서버는 [RFC6749]의 섹션 5.2 (OAuth 2.0)에 지정된 대로 인가 요청에 대한 응답으로 클라이언트에 오류를 반환해야 MUST 한다.¶
인가 서버 응답은 [RFC6749]의 섹션 4 (OAuth 2.0)와 같이 생성되어 클라이언트에 전송된다.¶
또한, 이 문서는 다음 추가 오류 값을 사용한다:¶
request_uri가
오류를 반환하거나 유효하지 않은 데이터를 포함한다.¶
request 매개변수의
사용을 지원하지 않는다.¶
request_uri 매개변수의
사용을 지원하지 않는다.¶
요청 객체 URI 방식을 지원하는 클라이언트 구현은 "Transport Layer Security (TLS) 및 Datagram Transport Layer Security (DTLS)의 안전한 사용을 위한 권고" [RFC7525]를 따라 TLS를 지원해야 MUST 한다.¶
정보 공개와 변조를 방지하기 위해, 기밀성과 무결성 보호를 제공하는 암호 스위트를 갖춘 TLS를 사용하여 기밀성 보호를 적용해야 MUST 한다.¶
HTTP 클라이언트는 중간자 공격을 피하기 위해 DNS-ID [RFC6125]를 사용하여 TLS 서버 인증서도 검증해야 MUST 한다. [RFC6125]에 정의된 규칙과 지침은 다음 고려사항과 함께 여기에도 적용된다:¶
*를 포함할 수 MAY 있다.¶
요청 객체는 JWT이므로, 핵심 JWT Claim은 JWT가 지시하는 목적 외에는 요청 객체에서 어떤 목적으로도 사용될 수 없다. 따라서 향후 OAuth 확장이 이들을 다른 의미로 사용하는 것을 피하기 위해 OAuth 인가 요청 매개변수로 등록되었다.¶
이 명세는 [RFC6749]에 의해 설정된 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가한다.¶
이 명세는 [RFC8414]에 의해 설정된 "OAuth Authorization Server Metadata" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가한다.¶
이 명세는 [RFC7591]에 의해 설정된 "OAuth Dynamic Client Registration Metadata" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가한다.¶
이 섹션은
application/oauth-authz-req+jwt
미디어 타입 [RFC2046]을
[RFC6838]에
설명된 방식으로 "Media Types"
레지스트리 [IANA.MediaTypes]에
등록한다. 이는 내용이 요청 객체 Claim을 포함하는
JWT임을 나타내는 데 사용할 수 있다.¶
.) 문자로 구분된
일련의 base64url 인코딩 값(그중 일부는 빈 문자열일 수 있음)으로
인코딩된다.¶
OAuth 2.0에서 논의된 보안 고려사항 [RFC6819] 전체에 더하여, [RFC7515], [RFC7516], [RFC7518] 및 [RFC8725]의 보안 고려사항도 고려해야 한다. 또한, OAuth와 같은 프로토콜의 보안 속성에 대한 유용한 통찰을 제공하는 [BASIN] 같은 여러 학술 논문도 있다.¶
위 사항을 고려하여, 이 문서는 다음 보안 고려사항을 감안할 것을 권고한다.¶
request 매개변수를 통해
인가 요청 객체를 전송할 때, 이는 당시 적절하다고 여겨지는
알고리즘을 사용하여
JWS [RFC7515]로 서명되거나,
또는 각각 JWS [RFC7515] 및
JWE [RFC7516]를 사용하여
서명된 다음 암호화되어야 MUST 한다.¶
인가 요청의 출처는 항상 검증되어야 MUST 한다. 이를 수행하는 방법은 여러 가지가 있다:¶
이 명세가 이를 요구하지는 않지만, [BASIN]과 같은 연구는 의도된 상호작용 엔드포인트와 시퀀스 내 메시지 위치를 변조가 드러나는 방식으로 명시하여 개시자의 의도가 모호하지 않도록 하는 것이 좋은 관행임을 지적한다. 이 명세는 [RFC6749], [RFC6750] 및 [RFC8414]에 정의된 다음 엔드포인트에 대해 이 관행을 사용할 것을 RECOMMENDED한다:¶
protected_resources)¶
authorization_endpoint)¶
redirect_uri)¶
token_endpoint)¶
또한 동적 탐색이 사용되는 경우, 이 관행은 탐색 관련 엔드포인트에도 적용된다.¶
[RFC6749]에서는 리디렉션 URI가 인가 요청에 포함되지만, 다른 것들은 포함되지 않는다. 그 결과, 인가 요청 객체에도 동일하게 적용된다.¶
request_uri의 도입은
여러 공격 가능성을 도입한다.
URI와 관련된 위험에 대한 자세한 정보는
[RFC3986]의 섹션 7의
보안 고려사항을 참조한다.¶
악의적인 클라이언트 집합은
request_uri를 매우 큰 콘텐츠를 반환하거나
응답이 매우 느린 URI로 지정함으로써
인가 서버에 DoS 공격을 시작할 수 있다.
이러한 공격에서는 서버가 리소스를 모두 사용해
실패하기 시작할 수 있다.¶
마찬가지로, 악의적인 클라이언트는
request_uri를 사용하는 인가 요청 URI 자체를
가리키는 request_uri 값을 지정하여
재귀적 조회를 유발할 수 있다.¶
이러한 공격의 성공을 방지하기 위해, 서버는
a) request_uri 매개변수의 값이 예상치 못한 위치를
가리키지 않는지 확인하고,
b) 응답의 미디어 타입이
application/oauth-authz-req+jwt인지 확인하며,
c) request_uri의 콘텐츠를 얻기 위한 시간 제한을
구현하고,
d) request_uri에 대해 재귀적 GET을 수행하지 않아야 한다.¶
request_uri의 값은 서명되지 않는다.
따라서 브라우저 내부의 중간자 공격자에 의해 변조될 수 있다.
이로 인해 여러 공격 가능성이 발생한다. 예를 들어,
a) 공격자가 재작성된 URI가 가리키는 다른 파일을 만들어
추가 scope를 요청할 수 있게 하거나,
b) 공격자가 request_uri의 값을 피해 사이트의 값으로
설정하여 피해 사이트에 DoS 공격을 시작할 수 있다.¶
이러한 공격의 성공을 방지하기 위해, 서버는
a) request_uri 매개변수의 값이 예상치 못한 위치를
가리키지 않는지 확인하고,
b) 응답의 미디어 타입이
application/oauth-authz-req+jwt인지 확인하며,
c) request_uri의 콘텐츠를 얻기 위한 시간 제한을
구현해야 한다.¶
클라이언트와 서버가 사용하는 프로토콜이 OAuth JWT-Secured Authorization Request (JAR)를 사용하도록 고정되어 있지 않으면, 공격자가 RFC 6749 요청을 사용하여 이 명세가 제공하는 모든 보호를 우회할 수 있다.¶
이러한 종류의 공격을 방지하기 위해, 이 명세는
require_signed_request_object라는 이름의 새로운
클라이언트 메타데이터 값과 서버 메타데이터 값을 정의하며,
두 값 모두 boolean이다.¶
클라이언트 메타데이터로서 이 값이 true이면,
서버는 이 명세를 따르지 않는 클라이언트의 인가 요청을
거부해야 MUST 한다. 또한 이 서버 메타데이터 값이
true일 때 요청 객체가 none의 alg 값을
사용하는 경우에도 요청을 거부해야 MUST 한다.
생략된 경우 기본값은 false이다.¶
서버 메타데이터로서 이 값이 true이면,
서버는 이 명세를 따르지 않는 모든 클라이언트의 인가 요청을
거부해야 MUST 한다. 또한 요청 객체가
none의 alg 값을 사용하는 경우에도
요청을 거부해야 MUST 한다. 생략된 경우,
기본값은 false이다.¶
require_signed_request_object 메타데이터
값이 없더라도, 클라이언트와 서버가 상호 지원하는 서명 알고리즘이
있다면 클라이언트는 서명된 요청 객체를 사용할 수
MAY 있다는 점에 유의한다.
서명 알고리즘 메타데이터의 사용은 섹션 4에 설명되어 있다.¶
현재의 보안 고려사항은 "Transport Layer Security (TLS) 및 Datagram Transport Layer Security (DTLS)의 안전한 사용을 위한 권고" [RFC7525]에서 확인할 수 있다. 이는 OAuth 2.0 [RFC6749]의 TLS 버전 권고를 대체한다.¶
OAuth 매개변수 값이 일반 OAuth 매개변수와 요청 객체 Claim이라는
두 위치에서 전송된다는 점을 고려할 때,
구현은 불일치하는 매개변수 값을 사용하여 의도하지 않은 결과를
얻을 수 있는 공격을 방지해야 한다.
이것이 두 클라이언트 ID 값이 일치해야 MUST 하는 이유,
요청 객체의 매개변수 값만 사용해야 하는 이유,
그리고 request도 request_uri도
요청 객체에 나타날 수 없는 이유이다.¶
[RFC8725]의 섹션 2.8에 설명된 것처럼, 공격자는 한 목적을 위해 발급된 JWT를 의도되지 않은 컨텍스트에서 사용하려고 시도할 수 있다. 이러한 공격에 대해 설명된 완화책은 요청 객체에도 적용할 수 있다.¶
공격자가 요청 객체를 다른 용도로 사용하려고 시도할 수 있는 한 가지 방법은
[RFC7523]의 섹션 2.2에
설명된 것처럼 이를 클라이언트 인증 JWT로 사용하려는 것이다.
이를 방지하는 간단한 방법은 요청 객체에서 클라이언트 ID를
sub 값으로 절대 사용하지 않는 것이다.¶
교차 JWT 혼동을 방지하는 또 다른 방법은
[RFC8725]의 섹션 3.11에
설명된 명시적 타입 지정 사용이다.
oauth-authz-req+jwt 값
(섹션 9.4.1에 등록됨)을 갖는
typ 헤더 매개변수를 포함하여 요청 객체의 타입을 명시할 수 있다.
그러나 기존 인가 서버에서 명시적으로 타입이 지정된 요청 객체를
요구하면 대부분의 기존 배포가 깨진다는 점에 유의한다.
기존 클라이언트는 특히 OpenID Connect [OpenID.Core]에서
타입이 지정되지 않은 요청 객체를
이미 일반적으로 사용하고 있기 때문이다.
그러나 기존 배포와의 호환성이 고려사항이 아닌 새로운 OAuth 배포
프로파일에서는 명시적 타입 지정을 요구하는 것이 좋은 생각일 것이다.¶
마지막으로, 교차 JWT 혼동을 방지하는 또 다른 방법은 요청 객체 서명에 사용되는 키가 다른 목적에 사용되는 키와 식별 가능하게 구별되는 키 관리 체계를 사용하는 것이다. 그러면 공격자가 요청 객체를 다른 컨텍스트에서 재사용하려고 시도할 경우 키 불일치가 발생하여 공격이 좌절된다.¶
클라이언트가 개인 데이터를 포함하는 보호된 리소스에 대한 접근 권한을 부여받는 경우, 클라이언트와 인가 서버 모두 프라이버시 원칙을 준수해야 한다. "인터넷 프로토콜을 위한 프라이버시 고려사항" [RFC6973]은 프로토콜 설계와 구현의 개선에 관한 훌륭한 지침을 제공한다. 그 안에 나열된 조항을 따라야 한다.¶
대부분의 조항은 "OAuth 2.0 인가 프레임워크" [RFC6749]와 "OAuth 2.0 인가 프레임워크: Bearer Token 사용" [RFC6750]에 적용되며, 이 명세에만 특정되는 것은 아니다. 이하에서는 이 명세에 특정되는 조항만 언급한다.¶
클라이언트가 개인 데이터를 포함하는 보호된 리소스에 대한 접근 권한을 부여받는 경우, 클라이언트는 개인 데이터 수집을 적용 가능한 법의 범위 안에 있고 지정된 목적에 엄격히 필요한 것으로 제한해야 SHOULD 한다.¶
사용자에게 요청된 개인 데이터가 엄격히 필요한지 알아내는 것은 종종 어렵다. 신뢰할 수 있는 제3자 서비스는 클라이언트 요청을 검토하고, 이를 클라이언트가 제안한 처리와 비교하며, 요청을 인증함으로써 사용자를 도울 수 있다. 인증 후 클라이언트는 인가 요청을 할 때, 요청 객체 URI를 얻기 위해 신뢰할 수 있는 제3자 서비스에 인가 요청을 제출할 수 있다. 이 절차는 두 단계로 이루어진다:¶
request_uri를 얻기 위해 인증할 수 있는
클라이언트 자격 증명이 발급된다.¶
request_uri를 얻는다. 신뢰할 수 있는 제3자 서비스는
또한 요청 객체가 이전 단계에 따라 클라이언트가 받을 자격이 있는
Claim과 일치하는지 검증한다.¶
인가 요청에서 이러한 요청 객체 URI를 수신하면,
인가 서버는 먼저 요청 객체 URI의 authority 부분이
신뢰할 수 있는 제3자 서비스에 대한 합법적인 것인지 검증한다.
그런 다음 인가 서버는 요청 객체 URI에 HTTP GET 요청을 보낸다.
연결 시, 인가 서버는 TLS 인증서에 표현된 서버 신원이
요청 객체 URI에 대해 합법적인지 검증해야 MUST 한다.
그런 다음 인가 서버는 클라이언트를 나타내는
client_id를 포함하는 요청 객체를 얻을 수 있다.¶
동의 화면은 클라이언트를 표시해야 MUST 하며, 요청이 신뢰할 수 있는 제3자 서비스에 의해 수집 제한 원칙 준수에 대해 검토되었음을 표시하는 것이 좋다 SHOULD.¶
이 명세는 확장 매개변수를 허용한다. 여기에는 잠재적으로 민감한 정보가 포함될 수 있다. URI 쿼리 매개변수는 다양한 수단, 특히 referrer와 브라우저 기록을 통해 유출될 수 있으므로, 인가 요청에 잠재적으로 민감한 매개변수가 포함된 경우, 클라이언트는 JWE [RFC7516]를 사용하여 요청 객체를 암호화해야 SHOULD 한다.¶
요청 객체 URI 방식이 사용되는 경우, 요청 객체가 개인 식별 가능
정보 또는 민감한 정보를 포함한다면,
request_uri는 일회용으로만 사용되고 짧은 유효 기간을
가져야 SHOULD 하며, 요청 객체 자체가
JWE
[RFC7516]를 사용하여 암호화되지 않는 한
적용 가능한 보안 정책에 대해 충분한 엔트로피를 가져야
MUST 한다. 유효성의 적절한 짧음과
요청 객체 URI의 엔트로피는 보호되는 리소스의 가치를 기반으로 한
위험 계산에 따라 달라진다. 유효 시간에 대한 일반적인 지침은
1분 미만이며, 요청 객체 URI는 이 명세 작성 시점에
128비트 이상의 암호학적 난수 값을 포함하는 것이다.¶
보호된 리소스가 개인 식별 정보를 포함하지 않더라도, 사용자별 지속적 정적 요청 객체 URI가 사용되는 경우 요청 객체 URI를 통해 사용자를 식별하는 것이 때때로 가능하다. 제3자가 브라우저 기록 등을 통해 이를 관찰하고 이를 사용해 사용자의 활동을 연관시키기 시작할 수 있다. 어떤 면에서는 이것도 데이터 공개이며 피해야 한다.¶
따라서 사용자별 지속적 요청 객체 URI는 피해야 한다. 일회용 요청 객체 URI가 하나의 대안이다.¶
다음 사람들은 OAuth 워킹 그룹 및 기타 IETF 역할에서 이 문서 작성에 기여했다. (기여 당시의 소속이 사용되었다.)¶
Annabelle Backman (Amazon), Dirk Balfanz (Google), Sergey Beryozkin, Ben Campbell (as AD), Brian Campbell (Ping Identity), Roman Danyliw (as AD), Martin Duke (as AD), Vladimir Dzhuvinov (Connect2id), Lars Eggert (as AD), Joel Halpern (as GENART), Benjamin Kaduk (as AD), Stephen Kent (as SECDIR), Murray Kucherawy (as AD), Warren Kumari (as OPSDIR), Watson Ladd (as SECDIR), Torsten Lodderstedt (yes.com), Jim Manico, James H. Manger (Telstra), Kathleen Moriarty (as AD), Axel Nennker (Deutsche Telecom), John Panzer (Google), Francesca Palombini (as AD), David Recordon (Facebook), Marius Scurtescu (Google), Luke Shepard (Facebook), Filip Skokan (Auth0), Hannes Tschofenig (ARM), Éric Vyncke (as AD), 및 Robert Wilton (as AD).¶
다음 사람들은 OpenID Connect Core 1.0 [OpenID.Core]을 통해 이 문서 작성에 기여했다.¶
Brian Campbell (Ping Identity), George Fletcher (AOL), Ryo Itou (Mixi), Edmund Jay (Illumila), Breno de Medeiros (Google), Hideki Nara (TACT), 및 Justin Richer (MITRE).¶