| 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가 지정되지 않은 경우 필수입니다.
요청 객체 (섹션
2.1)이며,
섹션 4 of [RFC6749] (OAuth 2.0)에 명시된 권한 부여 요청 매개변수를
포함합니다.
이 매개변수가 권한 부여 요청에 존재하는 경우,
request_uri는 존재해서는 안 됩니다.¶
request가 지정되지 않은 경우 필수입니다.
RFC 3986 [RFC3986]에서 정의한 절대 URI이며, 요청 객체 URI (섹션
2.2)로서
섹션 4 of [RFC6749] (OAuth
2.0)에 명시된 권한 부여 요청
매개변수를 참조합니다.
이 매개변수가 권한 부여 요청에 존재하는 경우,
request는 존재해서는 안 됩니다.¶
client_id입니다. 이 값은 반드시
request 또는 request_uri의
요청 객체 (섹션
2.1)에 있는
client_id와 일치해야 합니다.¶
클라이언트는 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가 참조하는 리소스의 내용은
요청 객체여야 하며, URI가 권한 부여 서버에 의해 클라이언트에 제공된 경우가 아니라면
권한 부여 서버에서 접근할 수 있어야 합니다.
첫 번째 경우, request_uri는
섹션 2.7.2
of [RFC7230]에 명시된 대로
https URI여야 합니다.
두 번째 경우, [RFC8141]에
명시된 대로 URN이어야 합니다.¶
다음은
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를
추측할 수 없도록 수명 동안 충분한 엔트로피를 반드시 가져야
합니다.
지침은
섹션 5.1.4.2.2 ([RFC6819]) 및
"기능 URL을 위한 모범 사례" [CapURLs]을 참조하십시오.
접근 제어 조치를 취하지 않는 한 적절한 제한 시간이 지난 후
request_uri를 제거하는 것이 권장됩니다
.¶
다음은 요청 객체 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 웹 암호화 [RFC7516] 명세에 따라 JWT를 반드시 복호화해야 합니다.¶
그 결과는 서명된 요청 객체입니다.¶
복호화에 실패하면 권한 부여 서버는 권한 부여 요청에 대한
응답으로 invalid_request_object 오류를 클라이언트에
반드시 반환해야 합니다.¶
인가 서버는 JWS 서명된 [RFC7515] 요청
객체의 서명을 검증해야 MUST 한다.
kid 헤더 매개변수가 있는 경우, 식별된 키는
사용된 키여야 MUST 하며 클라이언트와 연결된
키여야 MUST 한다. 서명은 클라이언트와 연결된
키와 alg 헤더 매개변수에 지정된 알고리즘을 사용하여
검증되어야 MUST 한다. 알고리즘 검증은
[RFC8725]의 섹션 3.1 및 3.2에
지정된 대로 수행되어야 MUST 한다.¶
키가 클라이언트와 연결되어 있지 않거나 서명 검증에
실패하면, 인가 서버는 인가 요청에 대한 응답으로 클라이언트에
invalid_request_object 오류를 반환해야 MUST
한다.¶
권한 부여 서버는 요청 객체 값에서
권한 부여 요청 매개변수 집합을
반드시 추출해야 합니다.
권한 부여 서버는 동일한 매개변수가
쿼리 매개변수에도 제공된 경우에도 요청 객체의
매개변수만 반드시 사용해야 합니다.
client_id 요청 매개변수의 클라이언트 ID 값과
요청 객체의 client_id 클레임 값은 반드시
동일해야 합니다.
그런 다음 권한 부여 서버는
OAuth 2.0 [RFC6749]에 명시된 대로 요청을 검증합니다.¶
클라이언트 ID 검사 또는 요청 검증에 실패하면 권한 부여 서버는 권한 부여 요청에 대한 응답으로 섹션 5.2 of [RFC6749] (OAuth 2.0)에 명시된 대로 클라이언트에 오류를 반드시 반환해야 합니다.¶
권한 부여 서버 응답은 섹션 4 of [RFC6749] (OAuth 2.0)에서와 같이 생성되어 클라이언트에 전송됩니다.¶
또한 이 문서에서는 다음과 같은 추가 오류 값을 사용합니다.¶
request_uri가
오류를 반환하거나 유효하지 않은 데이터를 포함합니다.¶
request 매개변수의 사용을 지원하지 않습니다.¶
request_uri 매개변수의 사용을 지원하지 않습니다.¶
요청 객체 URI 방식을 지원하는 클라이언트 구현은 "전송 계층 보안(TLS) 및 데이터그램 전송 계층 보안(DTLS)의 안전한 사용을 위한 권고사항" [RFC7525]을 따라 TLS를 반드시 지원해야 합니다.¶
정보 공개 및 변조로부터 보호하기 위해, 기밀성과 무결성 보호를 제공하는 암호 스위트와 함께 TLS를 사용하여 기밀성 보호를 반드시 적용해야 합니다.¶
HTTP 클라이언트는 중간자 공격을 방지하기 위해 DNS-ID [RFC6125]를 사용하여 TLS 서버 인증서도 반드시 검증해야 합니다. [RFC6125]에 정의된 규칙과 지침이 다음 사항을 고려하여 여기에 적용됩니다.¶
*가 포함될 수 있습니다.¶
요청 객체는 JWT이므로 핵심 JWT 클레임은 JWT에서 규정한 용도 이외의 목적으로 요청 객체에서 사용할 수 없습니다. 따라서 향후 OAuth 확장에서 이들을 다른 의미로 사용하는 것을 방지하기 위해 OAuth 권한 부여 요청 매개변수로 등록되었습니다.¶
이 명세는 [RFC6749]에서 설정한 "OAuth 매개변수" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가합니다.¶
이 명세는 [RFC8414]에서 설정한 "OAuth 권한 부여 서버 메타데이터" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가합니다.¶
이 명세는 [RFC7591]에서 설정한 "OAuth 동적 클라이언트 등록 메타데이터" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가합니다.¶
이 섹션에서는
application/oauth-authz-req+jwt
미디어 유형 [RFC2046]을 [RFC6838]에
설명된 방식으로 "미디어 유형"
레지스트리 [IANA.MediaTypes]에
등록합니다. 이는 콘텐츠가 요청 객체
클레임을 포함하는 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와 관련된 위험에 대한 자세한 내용은
섹션 7 of
[RFC3986]의 보안 고려 사항을
참조하십시오.¶
일련의 악의적인 클라이언트는
매우 큰 콘텐츠를 반환하거나 응답이 매우 느린 URI를
request_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도
요청 객체에 나타날 수 없는 이유이다.¶
섹션 2.8 of [RFC8725]에 설명된 대로, 공격자는 한 가지 목적으로 발급된 JWT를 의도되지 않은 컨텍스트에서 사용하려고 시도할 수 있습니다. 이러한 공격에 대해 설명된 완화 방법은 요청 객체에도 적용할 수 있습니다.¶
공격자가 요청 객체를 다른 용도로 사용하려고 시도할 수 있는 한 가지 방법은
섹션 2.2 of
[RFC7523]에 설명된 대로
이를 클라이언트 인증 JWT로 사용하려는 것입니다.
이를 방지하는 간단한 방법은 요청 객체에서 클라이언트 ID를
sub 값으로 절대 사용하지 않는 것입니다.¶
JWT 간 혼동을 방지하는 또 다른 방법은 명시적 유형 지정을 사용하는 것이며,
이는 섹션
3.11 of [RFC8725]에 설명되어 있습니다.
요청 객체는 값이
oauth-authz-req+jwt인
typ 헤더 매개변수를 포함하여 명시적으로 유형을 지정할 수 있습니다
(이는 섹션 9.4.1에 등록되어 있습니다).
그러나 기존 권한 부여 서버에서 명시적으로 유형이 지정된 요청 객체를
요구하면 대부분의 기존 배포가 중단된다는 점에 유의하십시오.
기존 클라이언트는 이미 유형이 지정되지 않은 요청 객체를 일반적으로 사용하고 있으며,
특히 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).¶