| RFC 9126 | OAuth PAR | 2021년 9월 |
| Lodderstedt 외 | 표준 트랙 | [페이지] |
이 문서는 푸시된 인가 요청(PAR) 엔드포인트를 정의하며, 이를 통해 클라이언트는 OAuth 2.0 인가 요청의 페이로드를 직접 요청을 통해 인가 서버로 푸시할 수 있고, 이후 인가 엔드포인트 호출에서 해당 데이터에 대한 참조로 사용되는 요청 URI를 제공받는다.¶
이 문서는 인터넷 표준 트랙 문서이다.¶
이 문서는 인터넷 엔지니어링 태스크 포스 (IETF)의 산출물이다. 이는 IETF 커뮤니티의 합의를 나타낸다. 공개 검토를 거쳤으며, 인터넷 엔지니어링 운영 그룹 (IESG)에 의해 게시가 승인되었다. 인터넷 표준에 대한 추가 정보는 RFC 7841의 섹션 2에서 확인할 수 있다.¶
이 문서의 현재 상태, 정오표, 그리고 이에 대한 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc9126에서 확인할 수 있다.¶
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.¶
이 문서는 푸시된 인가 요청(PAR) 엔드포인트를 정의하며, 이는 OAuth [RFC6749] 클라이언트가 인가 요청의 페이로드를 인가 서버로 직접 푸시할 수 있게 한다. 교환 결과로 요청 URI 값이 수신되며, 이는 이후 사용자 에이전트를 통한 인가 엔드포인트 호출에서 인가 요청 페이로드 데이터에 대한 참조로 사용된다.¶
OAuth [RFC6749]에서 인가 요청 매개변수는 일반적으로 사용자 에이전트에서 리디렉션을 통해 URI 쿼리 매개변수로 전송된다. 이는 단순하지만 다음과 같은 문제도 발생시킨다:¶
JWT-Secured Authorization Request (JAR) [RFC9101]는 OAuth 클라이언트가 인가 요청 매개변수를
Request Object로 감쌀 수 있게 하여 보안 문제에 대한 해결책을 제공한다. Request Object는
서명되고 선택적으로 암호화된 JSON Web Token (JWT) [RFC7519]이다.
크기 제한에 대처하기 위해 JAR는 request_uri 매개변수를 도입하며, 이를 통해
클라이언트는 Request Object 자체 대신 Request Object에 대한 참조를 전송할 수 있다.¶
이 문서는 인가 요청의 페이로드를 인가 서버로 직접 푸시하고, 이후 인가 요청에서
인가 서버에서 사용할 수 있는 request_uri 값으로 교환하는 상호운용 가능한 방법을
제공함으로써 JAR를 보완한다.¶
PAR는 클라이언트에 기밀성과 무결성이 보호되는 인가 요청을 위한 간단한 수단을 제공함으로써 OAuth 보안을 증진한다. 특히 암호학적으로 확인된 부인 방지와 같이 더 높은 보안 수준을 요구하는 클라이언트는 [RFC9101]에서 정의한 JWT 기반 Request Object를 PAR와 함께 사용할 수 있다.¶
PAR는 사용자 상호작용이 발생하기 전에 인가 서버가 클라이언트를 인증할 수 있게 한다. 인가 프로세스 중 클라이언트의 신원에 대한 신뢰도가 높아지면 인가 서버가 프로세스 훨씬 초기 단계에서 불법 요청을 거부할 수 있으므로, 클라이언트를 스푸핑하거나 인가 요청을 변조 또는 오용하려는 시도를 방지할 수 있다.¶
위에서 설명한 요청 크기 제한에 대처하기 위해, 섹션 3.1 of [RFC6749] 및
[OIDC]의 섹션 3.1.2.1에서 설명한 바와 같이
사용자 에이전트를 통한 인가 엔드포인트로의 HTTP POST 요청도 사용할 수 있음에
유의하라. 그러나 이는 [RFC6749]에 따라 선택 사항일 뿐이며, 지원되는 경우에도
전통적인 웹 애플리케이션에는 실현 가능한 선택지이지만 설치형 모바일 애플리케이션에서
사용하기에는 지나치게 어렵다. [RFC8252]에서
설명한 것처럼, 이러한 앱은 플랫폼별 API를 사용하여 시스템 브라우저에서 인가 요청 URI를
연다. 하지만 모바일 앱이 브라우저를 실행하면 그 결과 최초 요청은 GET 메서드
사용으로 제한된다. 인가 요청에 POST를 사용하려면, 앱은 먼저 상당한 크기의
인가 요청 페이로드를 어떻게든 전달하면서 GET을 통해 앱이 제어하는 URI를
열도록 브라우저를 지시한 다음, 그 결과 응답이 인가 서버를 향한 교차 사이트 양식
POST를 시작할 콘텐츠와 스크립트를 포함하게 해야 한다. PAR는 사용하기 더
간단하고 위에서 설명한 추가 보안 이점이 있다.¶
전통적인 OAuth 2.0에서, 클라이언트는 일반적으로 사용자 에이전트가 다음과 같은 HTTP 요청을 인가 서버의 인가 엔드포인트로 보내도록 지시하여 인가 요청을 시작한다(추가 줄바꿈과 들여쓰기는 표시 목적만을 위한 것임):¶
이러한 요청은 다음 예제에서 보이듯이 클라이언트가 PAR 엔드포인트로
POST 요청을 보내 인가 서버로 직접 푸시할 수도 있다
(추가 줄바꿈과 공백은 표시 목적만을 위한 것임).
요청이 인가 서버로 직접 이루어지므로 클라이언트는 인증할 수 있다
(예: 표시된 것처럼 JWT 클라이언트 assertion 기반 인증 사용).¶
인가 서버는 요청 URI로 응답한다:¶
클라이언트는 요청 URI 값을 사용하여, 사용자 에이전트가 다음과 같은 HTTP 요청을 인가 서버의 인가 엔드포인트로 보내도록 지시함으로써 이후의 인가 요청을 생성한다(추가 줄바꿈과 들여쓰기는 표시 목적만을 위한 것임):¶
이 문서의 핵심 단어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" 및 "OPTIONAL"은 여기에 보이는 것처럼 모두 대문자로 나타날 때에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 한다.¶
이 명세는 "The OAuth 2.0 Authorization Framework" [RFC6749]에서 정의한 "access token", "authorization server", "authorization endpoint", "authorization request", "token endpoint", 및 "client"라는 용어를 사용한다.¶
클라이언트는 JAR [RFC9101]에서
정의한 request 매개변수를 사용하여 Request Object JWT를 인가 서버로 푸시할 수
있다(MAY). JAR [RFC9101]에서
정의한 Request Object의 처리, 서명, 암호화 규칙이 적용된다. 특정 클라이언트 인증 방법에서
요구되는 요청 매개변수는 application/x-www-form-urlencoded 요청에 직접 포함되며,
폼 본문에서 request 이외의 유일한 매개변수이다(예: 상호 TLS 클라이언트 인증
[RFC8705]은 client_id HTTP 요청
매개변수를 사용하고, JWT assertion 기반 클라이언트 인증 [RFC7523]은
client_assertion 및
client_assertion_type을 사용한다). 그 밖의 모든 요청 매개변수, 즉 인가 요청
자체와 관련된 매개변수는 인가 요청을 나타내는 JWT의 claim으로 나타나야 한다(MUST).¶
다음은 섹션 2.1의 예제와 동일한 인가 요청 페이로드를 가진 서명된 Request Object를 사용한 푸시된 인가 요청의 예이다. 클라이언트는 JWT 클라이언트 assertion 기반 인증 [RFC7523]으로 인증된다 (추가 줄바꿈과 공백은 표시 목적만을 위한 것임):¶
인가 서버는 섹션 2.1에 정의된 처리 규칙에 더해 다음 단계를 수행해야 한다(MUST):¶
client_id가 Request Object의 client_id claim과 일치하지 않으면
요청을 거부한다. 또한 iss claim이 client_id와 일치하도록 요구할지는
인가 서버의 재량이다.¶
JSON Web Key (JWK) 형식 [RFC7517]으로 표현된 다음 RSA 키 쌍은 위 예제의 Request Object 서명을 검증하거나 재생성하는 데 사용할 수 있다(값 내부의 추가 줄바꿈과 들여쓰기는 표시 목적만을 위한 것임):¶
{
"kty": "RSA",
"kid":"k2bdc",
"n": "y9Lqv4fCp6Ei-u2-ZCKq83YvbFEk6JMs_pSj76eMkddWRuWX2aBKGHAtKlE
5P7_vn__PCKZWePt3vGkB6ePgzAFu08NmKemwE5bQI0e6kIChtt_6KzT5Oa
aXDFI6qCLJmk51Cc4VYFaxgqevMncYrzaW_50mZ1yGSFIQzLYP8bijAHGVj
dEFgZaZEN9lsn_GdWLaJpHrB3ROlS50E45wxrlg9xMncVb8qDPuXZarvghL
L0HzOuYRadBJVoWZowDNTpKpk2RklZ7QaBO7XDv3uR7s_sf2g-bAjSYxYUG
sqkNA9b3xVW53am_UZZ3tZbFTIh557JICWKHlWj5uzeJXaw",
"e": "AQAB",
"d": "LNwG_pCKrwowALpCpRdcOKlSVqylSurZhE6CpkRiE9cpDgGKIkO9CxPlXOL
zjqxXuQc8MdMqRQZTnAwgd7HH0B6gncrruV3NewI-XQV0ckldTjqNfOTz1V
Rs-jE-57KAXI3YBIhu-_0YpIDzdk_wBuAk661Svn0GsPQe7m9DoxdzenQu9
O_soewUhlPzRrTH0EeIqYI715rwI3TYaSzoWBmEPD2fICyj18FF0MPy_SQz
k3noVUUIzfzLnnJiWy_p63QBCMqjRoSHHdMnI4z9iVpIwJWQ3jO5n_2lC2-
cSgwjmKsFzDBbQNJc7qMG1N6EssJUwgGJxz1eAUFf0w4YAQ",
"qi": "J-mG0swR4FTy3atrcQ7dd0hhYn1E9QndN-
-sDG4EQO0RnFj6wIefCvwIc4
7hCtVeFnCTPYJNc_JyV-mU-9vlzS5GSNuyR5qdpsMZXUMpEvQcwKt23ffPZ
YGaqfKyEesmf_Wi8fFcE68H9REQjnniKrXm7w2-IuG_IrVJA9Ox-uU",
"q": "4hlMYAGa0dvogdK1jnxQ7J_Lqpqi99e-AeoFvoYpMPhthChTzwFZO9lQmUo
BpMqVQTws_s7vWGmt7ZAB3ywkurf0pV7BD0fweJiUzrWk4KJjxtmP_auuxr
jvm3s2FUGn6f0wRY9Z8Hj9A7C72DnYCjuZiJQMYCWDsZ8-d-L1a-s",
"p": "5sd9Er3I2FFT9R-gy84_oakEyCmgw036B_nfYEEOCwpSvi2z7UcIVK3bSEL
5WCW6BNgB3HDWhq8aYPirwQnqm0K9mX1E-4xM10WWZ-rP3XjYpQeS0Snru5
LFVWsAzi-FX7BOqBibSAXLdEGXcXa44l08iec_bPD3xduq5V_1YoE",
"dq": "Nz2PF3XM6bEc4XsluKZO70ErdYdKgdtIJReUR7Rno_tOZpejwlPGBYVW19
zpAeYtCT82jxroB2XqhLxGeMxEPQpsz2qTKLSe4BgHY2ml2uxSDGdjcsrbb
NoKUKaN1CuyZszhWl1n0AT_bENl4bJgQj_Fh0UEsQj5YBBUJt5gr_k",
"dp": "Zc877jirkkLOtyTs2vxyNe9KnMNAmOidlUc2tE_-0gAL4Lpo1hSwKCtKwe
ZJ-gkqt1hT-dwNx_0Xtg_-NXsadMRMwJnzBMYwYAfjApUkfqABc0yUCJJl3
KozRCugf1WXkU9GZAH2_x8PUopdNUEa70ISowPRh04HANKX4fkjWAE"
}
¶
다음 인가 서버 메타데이터 매개변수 [RFC8414]는 PAR와 관련한 서버의 기능 및 정책을 신호하기 위해 도입된다.¶
request_uri 값으로 교환할 수 있는 푸시된 인가 요청
엔드포인트의 URL.¶
false이다.¶
pushed_authorization_request_endpoint가 존재하는 것만으로도
클라이언트는 PAR 흐름을 사용할 수 있음을 판단하기에 충분하다는 점에 유의하라. PAR
엔드포인트에서 얻은 request_uri 값은 request_uri_parameter_supported
또는 require_request_uri_registration [OIDC.Disco]와 같은 다른 인가 서버 메타데이터와 관계없이 인가
엔드포인트에서 사용할 수 있다.¶
Dynamic Client Registration Protocol [RFC7591]은 OAuth 2.0 클라이언트 메타데이터를 인가 서버에 동적으로 등록하기 위한 API를 정의한다. [RFC7591]에서 정의한 메타데이터 및 그에 등록된 확장은 Dynamic Client Registration Protocol이 사용되지 않는 경우에도 인가 서버 구현에 유용한 클라이언트에 대한 일반 데이터 모델을 암시한다. 그러한 구현은 일반적으로 클라이언트 구성을 관리할 수 있는 일종의 사용자 인터페이스를 갖는다. 다음 클라이언트 메타데이터 매개변수는 해당 클라이언트에 대해 푸시된 인가 요청이 요구되는지 나타내기 위해 이 문서에서 도입된다.¶
false이다.¶
공격자는 유효한 요청 URI 값을 추측하여 재생하고 해당 클라이언트를 사칭하려고 시도할 수 있다. 인가 서버는 JAR [RFC9101], 섹션 10.2의 요청 URI 엔트로피에 관한 조항 (d)에 제시된 고려사항을 반영해야 한다(MUST).¶
공격자는 인가 코드를 얻거나 사용자를 향한 다른 공격을 시작하기 위해 자신이 제어하는 사이트를 가리키는 redirect URI를 등록하려고 시도할 수 있다. 인가 서버는 인증된 클라이언트로부터 푸시된 인가 요청에 있는 새로운 redirect URI만 수락해야 한다(MUST).¶
공격자는 합법적인 인가 요청에서 캡처한 요청 URI를 재생할 수 있다. 이러한 공격에 대처하기 위해, 인가 서버는 요청 URI를 일회용으로 만드는 것이 좋다 (SHOULD).¶
Request Object의 등록과 특정 Request Object를 사용하는 인가 요청 사이에 클라이언트 정책이 변경될 수 있다. 따라서 인가 요청을 처리할 때 인가 서버가 요청 매개변수를 클라이언트 정책과 대조하여 확인하는 것이 권장된다.¶
OAuth 2.0은 한 엔터티가 두 다른 엔터티 사이에서 데이터 접근에 대한 사용자 인가를 중개하는 본질 때문에 광범위한 개인정보 영향을 가진 복잡하고 유연한 프레임워크이다. OAuth 전체의 개인정보 고려사항은 이 문서의 범위를 벗어나며, 이 문서는 더 큰 프레임워크 안에서 하나의 메시지 시퀀스를 시작하는 대안적 방법만 정의한다. 그러나 PAR를 사용하면 인가 요청 데이터가 평문으로 사용자 에이전트를 통과하는 URL의 쿼리 구성요소가 아니라, HTTP 요청의 메시지 본문에서 보안 연결을 통해 클라이언트와 인가 서버 사이에 직접 전달되므로 부주의한 정보 공개 가능성을 줄여 개인정보 보호를 개선할 수 있다.¶
IANA는 [RFC7591]에 의해 설정된 [IANA.OAuth.Parameters]의 IANA "OAuth Dynamic Client Registration Metadata" 레지스트리에 다음 값을 등록했다.¶
IANA는 [RFC6755]에 의해 설정된 [IANA.OAuth.Parameters]의 "OAuth URI" 레지스트리에 다음 값을 등록했다.¶
이 명세는 OpenID Foundation의 Financial-grade API Working Group에서 수행한 Pushed Request Object 작업을 기반으로 한다. 귀중한 기여를 해 준 WG 구성원들에게 감사한다.¶
이 문서에 대한 귀중한 피드백을 제공해 준 Vladimir Dzhuvinov, Aaron Parecki, Justin Richer, Sascha Preibisch, Daniel Fett, Michael B. Jones, Annabelle Backman, Joseph Heenan, Sean Glencross, Maggie Hung, Neil Madden, Karsten Meyer zu Selhausen, Roman Danyliw, Meral Shirazipour, 및 Takahiko Kawasaki 에게 감사한다.¶