RFC 9126 OAuth PAR 2021년 9월
Lodderstedt 외 표준 트랙 [페이지]
스트림:
인터넷 엔지니어링 태스크 포스(IETF)
RFC:
9126
분류:
표준 트랙
발행:
ISSN:
2070-1721
저자:
T. Lodderstedt
yes.com
B. Campbell
Ping Identity
N. Sakimura
NAT.Consulting
D. Tonge
Moneyhub Financial Technology
F. Skokan
Auth0

RFC 9126

OAuth 2.0 푸시된 인가 요청

초록

이 문서는 푸시된 인가 요청(PAR) 엔드포인트를 정의하며, 이를 통해 클라이언트는 OAuth 2.0 인가 요청의 페이로드를 직접 요청을 통해 인가 서버로 푸시할 수 있고, 이후 인가 엔드포인트 호출에서 해당 데이터에 대한 참조로 사용되는 요청 URI를 제공받는다.

이 메모의 상태

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

이 문서는 인터넷 엔지니어링 태스크 포스 (IETF)의 산출물이다. 이는 IETF 커뮤니티의 합의를 나타낸다. 공개 검토를 거쳤으며, 인터넷 엔지니어링 운영 그룹 (IESG)에 의해 게시가 승인되었다. 인터넷 표준에 대한 추가 정보는 RFC 7841의 섹션 2에서 확인할 수 있다.

이 문서의 현재 상태, 정오표, 그리고 이에 대한 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc9126에서 확인할 수 있다.

목차

1. 소개

이 문서는 푸시된 인가 요청(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는 사용하기 더 간단하고 위에서 설명한 추가 보안 이점이 있다.

1.1. 도입 예제

전통적인 OAuth 2.0에서, 클라이언트는 일반적으로 사용자 에이전트가 다음과 같은 HTTP 요청을 인가 서버의 인가 엔드포인트로 보내도록 지시하여 인가 요청을 시작한다(추가 줄바꿈과 들여쓰기는 표시 목적만을 위한 것임):

 GET /authorize?response_type=code
  &client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen
  &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1
 Host: as.example.com

이러한 요청은 다음 예제에서 보이듯이 클라이언트가 PAR 엔드포인트로 POST 요청을 보내 인가 서버로 직접 푸시할 수도 있다 (추가 줄바꿈과 공백은 표시 목적만을 위한 것임). 요청이 인가 서버로 직접 이루어지므로 클라이언트는 인증할 수 있다 (예: 표시된 것처럼 JWT 클라이언트 assertion 기반 인증 사용).

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

 &response_type=code
 &client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen
 &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
 &client_assertion_type=
  urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
 &client_assertion=eyJraWQiOiI0MiIsImFsZyI6IkVTMjU2In0.eyJpc3MiOiJDTE
  lFTlQxMjM0Iiwic3ViIjoiQ0xJRU5UMTIzNCIsImF1ZCI6Imh0dHBzOi8vc2VydmVyL
  mV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY4ODc4fQ.Igw8QrpAWRNPDGoWGRmJumLBM
  wbLjeIYwqWUu-ywgvvufl_0sQJftNs3bzjIrP0BV9rRG-3eI1Ksh0kQ1CwvzA

인가 서버는 요청 URI로 응답한다:

 HTTP/1.1 201 Created
 Cache-Control: no-cache, no-store
 Content-Type: application/json

 {
   "request_uri": "urn:example:bwc4JK-ESC0w8acc191e-Y1LTC2",
   "expires_in": 90
 }

클라이언트는 요청 URI 값을 사용하여, 사용자 에이전트가 다음과 같은 HTTP 요청을 인가 서버의 인가 엔드포인트로 보내도록 지시함으로써 이후의 인가 요청을 생성한다(추가 줄바꿈과 들여쓰기는 표시 목적만을 위한 것임):

 GET /authorize?client_id=CLIENT1234
  &request_uri=urn%3Aexample%3Abwc4JK-ESC0w8acc191e-Y1LTC2 HTTP/1.1
 Host: as.example.com

1.2. 규약 및 용어

이 문서의 핵심 단어 "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"라는 용어를 사용한다.

2. 푸시된 인가 요청 엔드포인트

푸시된 인가 요청 엔드포인트는 인가 서버의 HTTP API로, HTTP 요청 메시지 본문에서 application/x-www-form-urlencoded 형식을 사용하여 매개변수를 포함한 HTTP POST 요청을 수락한다. 이 형식은 부록 B of [RFC6749]에 설명된 것처럼 UTF-8의 문자 인코딩을 가진다. PAR 엔드포인트 URL은 "https" 스킴을 사용해야 한다(MUST).

PAR를 지원하는 인가 서버는 RFC8414]의 인가 서버 메타데이터 문서에 섹션 5에서 정의한 pushed_authorization_request_endpoint 매개변수를 사용하여 푸시된 인가 요청 엔드포인트의 URL을 포함하는 것이 좋다(SHOULD).

엔드포인트는 [RFC6749]에서 인가 엔드포인트용으로 정의한 인가 요청 매개변수와, 인가 엔드포인트에 대해 정의된 모든 적용 가능한 확장을 수락한다. 그러한 확장의 예에는 Proof Key for Code Exchange (PKCE) [RFC7636], Resource Indicators [RFC8707], 및 OpenID Connect (OIDC) [OIDC]가 포함된다. 엔드포인트는 또한 [RFC9101] 및 이 문서의 섹션 3에 따라 인가 요청 매개변수 집합을 Request Object로 전송하는 것을 지원할 수도 있다(MAY).

[RFC6749]에서 토큰 엔드포인트 요청에 대해 정의한 클라이언트 인증 규칙(적용 가능한 인증 방법 포함)은 PAR 엔드포인트에도 적용된다. 적용 가능한 경우, token_endpoint_auth_method 클라이언트 메타데이터 매개변수 [RFC7591]는 PAR 엔드포인트 요청을 포함하여 인가 서버로 직접 요청을 할 때 클라이언트가 사용할 등록된 인증 방법을 나타낸다. 마찬가지로, token_endpoint_auth_methods_supported 인가 서버 메타데이터 [RFC8414] 매개변수는 PAR 엔드포인트 요청을 포함하여 클라이언트로부터의 직접 요청을 수락할 때 인가 서버가 지원하는 클라이언트 인증 방법을 나열한다.

역사적인 이유로, JWT 클라이언트 assertion 기반 인증(섹션 2.2 of [RFC7523]에서 정의되며, [OIDC]의 섹션 9에 따른 private_key_jwt 또는 client_secret_jwt 인증 방법 이름을 사용함)를 사용할 때 적절한 audience 값에 대해 잠재적인 모호성이 있다. 그 모호성을 해결하기 위해, [RFC8414]에 따른 인가 서버의 issuer 식별자 URL을 audience 값으로 사용하는 것이 좋다(SHOULD). 상호운용성을 촉진하기 위해, 인가 서버는 자신을 의도된 audience로 식별하는 값으로 자신의 issuer 식별자, 토큰 엔드포인트 URL, 또는 푸시된 인가 요청 엔드포인트 URL을 수락해야 한다(MUST).

2.1. 요청

클라이언트는 인가 요청을 구성하는 매개변수를 PAR 엔드포인트로 직접 전송한다. 전형적인 매개변수 집합에는 아래 예제에 보이는 것처럼 client_id, response_type, redirect_uri, scope, state, code_challenge, 및 code_challenge_method가 포함될 수 있다. 그러나 푸시된 인가 요청은 [RFC6749]에서 정의한 것과 모든 적용 가능한 확장을 포함하여, 인가 엔드포인트에서 사용 가능한 모든 매개변수로 구성될 수 있다. request_uri 인가 요청 매개변수는 예외이며, 제공되어서는 안 된다(MUST NOT).

요청에는 또한 해당 클라이언트에 적합한 경우 클라이언트 인증에 필요한 추가 매개변수(예: client_secret 또는 client_assertionclient_assertion_type)가 포함된다. 이러한 매개변수는 토큰 엔드포인트에서 사용하도록 정의 및 등록되지만, 클라이언트 인증에만 적용된다. 푸시된 인가 요청에 존재할 때, 이들은 클라이언트 인증에만 의존되며 인가 요청 자체와는 관련이 없다. 클라이언트 인증과 관련되지 않은 토큰 엔드포인트 매개변수는 푸시된 인가 요청에 대해 정의된 의미가 없다. client_id 매개변수는 인가 요청과 토큰 엔드포인트 요청 모두에서 동일한 의미로 정의되며, 필수 인가 요청 매개변수로서 푸시된 인가 요청에서도 마찬가지로 요구된다.

클라이언트는 부록 B of [RFC6749]에 설명된 대로 UTF-8 문자 인코딩을 사용하여 x-www-form-urlencoded로 형식화된 매개변수로 HTTP POST 요청의 메시지 본문을 구성한다. 적용 가능한 경우, 클라이언트는 토큰 엔드포인트 요청과 동일한 규칙을 사용하여 요청 헤더 또는 요청 본문에 자신의 인증 자격 증명을 추가한다.

이는 다음 예제로 설명된다(메시지 본문의 추가 줄바꿈은 표시 목적만을 위한 것임):

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

 response_type=code&state=af0ifjsldkj&client_id=s6BhdRkqt3
 &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
 &code_challenge=K2-ltc83acc4h0c9w6ESC_rEMTJ3bww-uCHaoeK1t8U
 &code_challenge_method=S256&scope=account-information
 &client_assertion_type=
  urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
 &client_assertion=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3Mi
  OiJzNkJoZFJrcXQzIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc
  2VydmVyLmV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY5Njc3fQ.te4IdnP_DK4hWrh
  TWA6fyhy3fxlAQZAhfA4lmzRdpoP5uZb-E90R5YxzN1YDA8mnVdpgj_Bx1lG5r6se
  f5TlckApA3hahhC804dcqlE4naEmLISmN1pds2WxTMOUzZY8aKKSDzNTDqhyTgE-K
  dTb3RafRj7tdZb09zWs7c_moOvfVcQIoy5zz1BvLQKW1Y8JsYvdpu2AvpxRPbcP8W
  yeW9B6PL6_fy3pXYKG3e-qUcvPa9kan-mo9EoSgt-YTDQjK1nZMdXIqTluK9caVJE
  RWW0fD1Y11_tlOcJn-ya7v7d8YmFyJpkhZfm8x1FoeH0djEicXTixEkdRuzsgUCm6
  GQ

인가 서버는 요청을 다음과 같이 처리해야 한다(MUST):

  1. 토큰 엔드포인트에서와 같은 방식으로 클라이언트를 인증한다 (섹션 2.3 of [RFC6749]).
  2. request_uri 인가 요청 매개변수가 제공되면 요청을 거부한다.
  3. 푸시된 요청을 인가 엔드포인트로 전송된 인가 요청과 같이 검증한다. 예를 들어 인가 서버는 redirect URI가 클라이언트에 대해 구성된 redirect URI 중 하나와 일치하는지 확인하고, 또한 클라이언트가 접근을 요청하는 scope에 대해 권한이 있는지 확인한다. 이 검증을 통해 인가 서버는 승인되지 않았거나 사기성인 요청을 조기에 거부할 수 있다. 인가 서버는 푸시된 요청을 처리할 때 수행할 수 없는 검증 단계를 생략할 수 있다(MAY). 그러나 그러한 확인은 인가 엔드포인트에서 인가 요청을 처리할 때 수행되어야 한다 (MUST).

인가 서버는 인증 자격 증명이 있는 클라이언트가 각 푸시된 인가 요청마다 인가 요청별 redirect URI를 설정하도록 허용할 수 있다(MAY). 섹션 2.4에서 더 자세히 설명하듯이, 이는 [RFC6749]와 달리 이 명세가 실제 인가 요청이 수행되기 전에 인가 서버가 클라이언트를 인증하고 클라이언트 요청을 검증할 수 있는 능력을 제공하기 때문에 가능하다.

2.2. 성공 응답

검증이 성공하면, 서버는 요청 URI를 생성하고 201 HTTP 상태 코드와 함께 응답에 제공해야 한다(MUST). 다음 매개변수는 [RFC8259]에서 정의한 application/json 미디어 타입을 사용하여 HTTP 응답의 메시지 본문에 최상위 멤버로 포함된다.

request_uri
게시된 인가 요청에 대응하는 요청 URI. 이 URI는 이후 인가 요청에서 해당 요청 데이터에 대한 일회용 참조이다. 인가 프로세스가 인가 요청 데이터를 얻는 방식은 인가 서버의 재량이며, 이 명세의 범위를 벗어난다. 이 URI를 통해 다른 당사자에게 인가 요청 데이터를 제공할 필요는 없다.
expires_in
요청 URI의 수명을 초 단위의 양의 정수로 나타내는 JSON 숫자. 요청 URI 수명은 인가 서버의 재량이지만 일반적으로 비교적 짧다(예: 5초에서 600초 사이).

request_uri 값의 형식은 인가 서버의 재량이지만, 유효한 값을 예측하거나 추측하는 것이 계산상 불가능하도록 암호학적으로 강한 의사난수 알고리즘을 사용해 생성된 일부를 포함해야 한다(MUST) (구체적인 사항은 섹션 10.10 of [RFC6749] 참조). 인가 서버는 해당 인가 요청 데이터를 참조하는 URI의 무작위 부분으로 <reference-value>를 사용하여 urn:ietf:params:oauth:request_uri:<reference-value> 형식으로 request_uri 값을 구성할 수 있다(MAY).

request_uri 값은 인가 요청을 게시한 클라이언트에 바인딩되어야 한다(MUST).

다음은 그러한 응답의 예이다:

 HTTP/1.1 201 Created
 Content-Type: application/json
 Cache-Control: no-cache, no-store

 {
  "request_uri":
    "urn:ietf:params:oauth:request_uri:6esc_11ACC5bwc014ltc14eY22c",
  "expires_in": 60
 }

2.3. 오류 응답

인가 서버는 섹션 5.2 of [RFC6749]에서 토큰 엔드포인트의 오류 응답에 대해 지정한 것과 동일한 형식으로 오류 응답을 반환하며, 그 안의 적절한 오류 코드 또는 섹션 4.1.2.1 of [RFC6749]의 오류 코드를 사용한다. 섹션 4.1.2.1 of [RFC6749]이 요청 클라이언트로 오류를 자동 리디렉션하는 것을 금지하여 오류 코드를 정의하지 않는 경우(예: 요청이 누락, 유효하지 않음, 또는 불일치하는 리디렉션 URI 때문에 실패한 경우)에는 invalid_request 오류 코드를 기본 오류 코드로 사용할 수 있다. OAuth 확장이 푸시된 인가 요청의 초기 처리에 관련된 경우, 해당 확장에서 정의한 오류 코드도 사용할 수 있다. 푸시된 인가 요청의 초기 처리는 리소스 소유자 상호작용을 포함하지 않으므로, [OIDC]에서 정의한 consent_required와 같은 사용자 상호작용 관련 오류 코드는 절대 반환되지 않는다.

인가 서버 또는 클라이언트 정책([RFC9101], 섹션 10.5 참조)에 의해 클라이언트가 서명된 Request Object를 사용해야 하는 경우, 인가 서버는 섹션 3에 제시된 정의를 준수하는 요청만 수락해야 하며(MUST), 그 외의 모든 요청은 HTTP 상태 코드 400 및 오류 코드 invalid_request로 거부해야 한다(MUST).

위의 내용에 더하여, PAR 엔드포인트는 다음 HTTP 상태 코드도 사용할 수 있다:

405:
요청이 POST 메서드를 사용하지 않은 경우, 인가 서버는 HTTP 405 (Method Not Allowed) 상태 코드로 응답한다.
413:
요청 크기가 인가 서버가 허용하는 상한을 초과한 경우, 인가 서버는 HTTP 413 (Payload Too Large) 상태 코드로 응답한다.
429:
특정 기간 동안 클라이언트의 요청 수가 인가 서버가 허용하는 수를 초과한 경우, 인가 서버는 HTTP 429 (Too Many Requests) 상태 코드로 응답한다.

다음은 PAR 엔드포인트의 오류 응답 예이다:

 HTTP/1.1 400 Bad Request
 Content-Type: application/json
 Cache-Control: no-cache, no-store

 {
   "error": "invalid_request",
   "error_description":
     "The redirect_uri is not valid for the given client"
 }

2.4. 클라이언트 리디렉션 URI의 관리

OAuth 2.0 [RFC6749]은 특정 상황에서 클라이언트가 등록되지 않은 redirect_uri 값을 사용하거나, 인가 서버가 인가 엔드포인트에서 클라이언트가 제시한 redirect_uri 값에 자체 매칭 의미론을 적용할 수 있게 한다. 그러나 OAuth security BCP [OAUTH-SECURITY-TOPICS]와 OAuth 2.1 명세 [OAUTH-V2]는 인가 서버가 redirect_uri 매개변수를 특정 클라이언트에 대해 이전에 설정된 redirect URI 집합과 정확히 일치시킬 것을 요구한다. 이는 클라이언트 사칭 시도의 조기 탐지 수단이며, 토큰 유출과 오픈 리디렉션을 방지한다. 단점으로는 redirect URI가 일반적으로 클라이언트 정책에서 가장 변동성이 큰 부분이므로 클라이언트 관리를 더 번거롭게 만들 수 있다.

인가 서버와 인증 자격 증명을 설정한 클라이언트에 대해 PAR를 사용할 때는 정확한 매칭 요구사항을 완화할 수 있다(MAY). 이는 전통적인 인가 요청과 달리, 인가 프로세스가 시작되기 전에 인가 서버가 클라이언트를 인증하여 합법적인 클라이언트와 상호작용하고 있음을 보장하기 때문에 가능하다. 인가 서버는 그러한 클라이언트가 인가 서버에 이전에 등록되지 않은 redirect_uri 값을 지정하도록 허용할 수 있다(MAY). 이는 클라이언트에 더 많은 유연성(예: 런타임에 인가 서버별로 서로 다른 redirect_uri 값을 생성)을 제공하고 클라이언트 관리를 단순화할 수 있다. 제공된 redirect_uri 값에 제한을 적용할지는 인가 서버의 재량이다. 예를 들어, 인가 서버는 특정 URI 접두사를 요구하거나 런타임에 쿼리 매개변수만 달라지는 것을 허용할 수 있다(MAY).

3. "request" 요청 매개변수

클라이언트는 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_assertionclient_assertion_type을 사용한다). 그 밖의 모든 요청 매개변수, 즉 인가 요청 자체와 관련된 매개변수는 인가 요청을 나타내는 JWT의 claim으로 나타나야 한다(MUST).

다음은 섹션 2.1의 예제와 동일한 인가 요청 페이로드를 가진 서명된 Request Object를 사용한 푸시된 인가 요청의 예이다. 클라이언트는 JWT 클라이언트 assertion 기반 인증 [RFC7523]으로 인증된다 (추가 줄바꿈과 공백은 표시 목적만을 위한 것임):

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

 client_assertion_type=
  urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
 &client_assertion=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3Mi
  OiJzNkJoZFJrcXQzIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc
  2VydmVyLmV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY5Njc3fQ.te4IdnP_DK4hWrh
  TWA6fyhy3fxlAQZAhfA4lmzRdpoP5uZb-E90R5YxzN1YDA8mnVdpgj_Bx1lG5r6se
  f5TlckApA3hahhC804dcqlE4naEmLISmN1pds2WxTMOUzZY8aKKSDzNTDqhyTgE-K
  dTb3RafRj7tdZb09zWs7c_moOvfVcQIoy5zz1BvLQKW1Y8JsYvdpu2AvpxRPbcP8W
  yeW9B6PL6_fy3pXYKG3e-qUcvPa9kan-mo9EoSgt-YTDQjK1nZMdXIqTluK9caVJE
  RWW0fD1Y11_tlOcJn-ya7v7d8YmFyJpkhZfm8x1FoeH0djEicXTixEkdRuzsgUCm6
  GQ
 &request=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3MiOiJzNkJoZ
  FJrcXQzIiwiYXVkIjoiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLCJleHAiOj
  E2MjU4Njk2NzcsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY2xpZW50X2lkIjoiczZ
  CaGRSa3F0MyIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vY2xpZW50LmV4YW1wbGUu
  b3JnL2NiIiwic2NvcGUiOiJhY2NvdW50LWluZm9ybWF0aW9uIiwic3RhdGUiOiJhZ
  jBpZmpzbGRraiIsImNvZGVfY2hhbGxlbmdlIjoiSzItbHRjODNhY2M0aDBjOXc2RV
  NDX3JFTVRKM2J3dy11Q0hhb2VLMXQ4VSIsImNvZGVfY2hhbGxlbmdlX21ldGhvZCI
  6IlMyNTYifQ.l9R3RC9bFBHry_8acObQjEf4fX5yfJkWUPfak3J3iiBm0aaQznPw5
  BZ0B3VQZ9_KYdPt5bTkaflS5fSDklM3_7my9MyOSKFYmf46INk6ju_qUuC2crkOQX
  ZWYJB-0bnYEbdHpUjazFSUvN49cEGstNQeE-dKDWHNgEojgcuNA_pjKfL9VYp1dEA
  6-WjXZ_OlJ7R_mBWpjFAzc0UkQwqX5hfOJoGTqB2tE4a4aB2z8iYlUJp0DeeYp_hP
  N6svtmdvte73p5bLGDFpRIlmrBQIAQuxiS0skORpXlS0cBcgHimXVnXOJG7E-A_lS
  _5y54dVLQPA1jKYx-fxbYSG7dp2fw
 &client_id=s6BhdRkqt3

인가 서버는 섹션 2.1에 정의된 처리 규칙에 더해 다음 단계를 수행해야 한다(MUST):

  1. 적용 가능한 경우, JAR [RFC9101], 섹션 6.1에 명시된 대로 Request Object를 복호화한다.
  2. JAR [RFC9101], 섹션 6.2에 명시된 대로 Request Object 서명을 검증한다.
  3. 클라이언트가 인가 서버와 인증 자격 증명을 설정한 경우, 인증된 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"
  }

4. 인가 요청

클라이언트는 인가 서버가 반환한 request_uri 값을 사용하여 [RFC9101]에서 정의한 인가 요청을 작성한다. 이는 클라이언트가 사용자 에이전트에게 다음 HTTP 요청을 하도록 지시하는 다음 예제에 나타나 있다(추가 줄바꿈과 들여쓰기는 표시 목적만을 위한 것임):

 GET /authorize?client_id=s6BhdRkqt3&request_uri=urn%3Aietf%3Aparams
  %3Aoauth%3Arequest_uri%3A6esc_11ACC5bwc014ltc14eY22c HTTP/1.1
 Host: as.example.com

인가 요청 콘텐츠의 일부, 예를 들어 code_challenge 매개변수 값은 특정 인가 요청에 고유하므로, 클라이언트는 request_uri 값을 한 번만 사용해야 한다 (MUST). 인가 서버는 request_uri 값을 일회용으로 취급하는 것이 좋지만(SHOULD), 사용자가 자신의 사용자 에이전트를 다시 로드/새로고침하는 경우 중복 요청을 허용할 수 있다(MAY). 만료된 request_uri는 유효하지 않은 것으로 거부되어야 한다(MUST).

인가 서버는 푸시된 요청에서 발생한 인가 요청을 다른 인가 요청과 같이 검증해야 한다(MUST). 인가 서버는 요청이 푸시된 요청임을 검증할 수 있고, 요청 또는 인가 서버의 정책이 생략된 단계의 결과에 영향을 미칠 방식으로 수정되지 않았음을 검증할 수 있다면, 요청이 푸시되었을 때 수행한 검증 단계를 생략할 수 있다(MAY).

인가 서버 정책은 전역적으로 또는 클라이언트별로, PAR가 클라이언트가 인가 요청 데이터를 전달할 수 있는 유일한 수단이라고 규정할 수 있다(MAY). 이 경우 인가 서버는 PAR 엔드포인트에서 얻은 값을 가진 request_uri 매개변수가 없는 인가 엔드포인트 요청 처리를 invalid_request 오류 코드로 거부한다.

5. 인가 서버 메타데이터

다음 인가 서버 메타데이터 매개변수 [RFC8414]는 PAR와 관련한 서버의 기능 및 정책을 신호하기 위해 도입된다.

pushed_authorization_request_endpoint
클라이언트가 인가 요청을 게시하여 인가 서버에서 사용할 수 있는 request_uri 값으로 교환할 수 있는 푸시된 인가 요청 엔드포인트의 URL.
require_pushed_authorization_requests
인가 서버가 인가 요청 데이터를 PAR를 통해서만 수락하는지 여부를 나타내는 Boolean 매개변수. 생략된 경우 기본값은 false이다.

pushed_authorization_request_endpoint가 존재하는 것만으로도 클라이언트는 PAR 흐름을 사용할 수 있음을 판단하기에 충분하다는 점에 유의하라. PAR 엔드포인트에서 얻은 request_uri 값은 request_uri_parameter_supported 또는 require_request_uri_registration [OIDC.Disco]와 같은 다른 인가 서버 메타데이터와 관계없이 인가 엔드포인트에서 사용할 수 있다.

6. 클라이언트 메타데이터

Dynamic Client Registration Protocol [RFC7591]은 OAuth 2.0 클라이언트 메타데이터를 인가 서버에 동적으로 등록하기 위한 API를 정의한다. [RFC7591]에서 정의한 메타데이터 및 그에 등록된 확장은 Dynamic Client Registration Protocol이 사용되지 않는 경우에도 인가 서버 구현에 유용한 클라이언트에 대한 일반 데이터 모델을 암시한다. 그러한 구현은 일반적으로 클라이언트 구성을 관리할 수 있는 일종의 사용자 인터페이스를 갖는다. 다음 클라이언트 메타데이터 매개변수는 해당 클라이언트에 대해 푸시된 인가 요청이 요구되는지 나타내기 위해 이 문서에서 도입된다.

require_pushed_authorization_requests
클라이언트가 인가 요청을 시작하기 위해 사용할 수 있는 유일한 수단이 PAR인지 여부를 나타내는 Boolean 매개변수. 생략된 경우 기본값은 false이다.

7. 보안 고려사항

7.1. 요청 URI 추측

공격자는 유효한 요청 URI 값을 추측하여 재생하고 해당 클라이언트를 사칭하려고 시도할 수 있다. 인가 서버는 JAR [RFC9101], 섹션 10.2의 요청 URI 엔트로피에 관한 조항 (d)에 제시된 고려사항을 반영해야 한다(MUST).

7.2. 오픈 리디렉션

공격자는 인가 코드를 얻거나 사용자를 향한 다른 공격을 시작하기 위해 자신이 제어하는 사이트를 가리키는 redirect URI를 등록하려고 시도할 수 있다. 인가 서버는 인증된 클라이언트로부터 푸시된 인가 요청에 있는 새로운 redirect URI만 수락해야 한다(MUST).

7.3. Request Object 재생

공격자는 합법적인 인가 요청에서 캡처한 요청 URI를 재생할 수 있다. 이러한 공격에 대처하기 위해, 인가 서버는 요청 URI를 일회용으로 만드는 것이 좋다 (SHOULD).

7.4. 클라이언트 정책 변경

Request Object의 등록과 특정 Request Object를 사용하는 인가 요청 사이에 클라이언트 정책이 변경될 수 있다. 따라서 인가 요청을 처리할 때 인가 서버가 요청 매개변수를 클라이언트 정책과 대조하여 확인하는 것이 권장된다.

7.5. 요청 URI 바꾸기

공격자는 한 요청에서 요청 URI를 캡처한 다음 이를 다른 인가 요청에 대체할 수 있다. 예를 들어 OpenID Connect 컨텍스트에서, 공격자는 높은 수준의 인증 보증을 요구하는 요청 URI를 더 낮은 수준의 보증을 요구하는 것으로 교체할 수 있다. 클라이언트는 이 공격을 방지하기 위해 푸시된 Request Object에서 PKCE [RFC7636], 고유한 state 매개변수 [RFC6749], 또는 OIDC "nonce" 매개변수 [OIDC]를 사용하는 것이 좋다(SHOULD).

8. 개인정보 고려사항

OAuth 2.0은 한 엔터티가 두 다른 엔터티 사이에서 데이터 접근에 대한 사용자 인가를 중개하는 본질 때문에 광범위한 개인정보 영향을 가진 복잡하고 유연한 프레임워크이다. OAuth 전체의 개인정보 고려사항은 이 문서의 범위를 벗어나며, 이 문서는 더 큰 프레임워크 안에서 하나의 메시지 시퀀스를 시작하는 대안적 방법만 정의한다. 그러나 PAR를 사용하면 인가 요청 데이터가 평문으로 사용자 에이전트를 통과하는 URL의 쿼리 구성요소가 아니라, HTTP 요청의 메시지 본문에서 보안 연결을 통해 클라이언트와 인가 서버 사이에 직접 전달되므로 부주의한 정보 공개 가능성을 줄여 개인정보 보호를 개선할 수 있다.

9. IANA 고려사항

9.1. OAuth 인가 서버 메타데이터

IANA는 [RFC8414]에 의해 설정된 [IANA.OAuth.Parameters]의 IANA "OAuth Authorization Server Metadata" 레지스트리에 다음 값을 등록했다.

메타데이터 이름:
pushed_authorization_request_endpoint
메타데이터 설명:
인가 서버의 푸시된 인가 요청 엔드포인트의 URL.
변경 관리 주체:
IESG
명세 문서:
RFC 9126의 섹션 5
메타데이터 이름:
require_pushed_authorization_requests
메타데이터 설명:
인가 서버가 인가 요청을 PAR를 통해서만 수락하는지 여부를 나타낸다.
변경 관리 주체:
IESG
명세 문서:
RFC 9126의 섹션 5

9.2. OAuth 동적 클라이언트 등록 메타데이터

IANA는 [RFC7591]에 의해 설정된 [IANA.OAuth.Parameters]의 IANA "OAuth Dynamic Client Registration Metadata" 레지스트리에 다음 값을 등록했다.

클라이언트 메타데이터 이름:
require_pushed_authorization_requests
클라이언트 메타데이터 설명:
클라이언트가 인가 요청을 시작하기 위해 PAR를 사용해야 하는지 여부를 나타낸다.
변경 관리 주체:
IESG
명세 문서:
RFC 9126의 섹션 6

9.3. OAuth URI 등록

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

URN:
urn:ietf:params:oauth:request_uri:
일반 이름:
OAuth 요청 URI를 위한 URN 하위 네임스페이스.
변경 관리 주체:
IESG
명세 문서:
RFC 9126의 섹션 2.2

10. 참고문헌

10.1. 규범적 참고문헌

[RFC2119]
Bradner, S., "RFC에서 요구사항 수준을 나타내기 위해 사용하는 핵심 단어", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC6749]
Hardt, D., Ed., "OAuth 2.0 인가 프레임워크", RFC 6749, DOI 10.17487/RFC6749, , <https://www.rfc-editor.org/info/rfc6749>.
[RFC8174]
Leiba, B., "RFC 2119 핵심 단어에서 대문자와 소문자의 모호성", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC8259]
Bray, T., Ed., "JavaScript Object Notation (JSON) 데이터 교환 형식", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/info/rfc8259>.
[RFC8414]
Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 인가 서버 메타데이터", RFC 8414, DOI 10.17487/RFC8414, , <https://www.rfc-editor.org/info/rfc8414>.
[RFC9101]
Sakimura, N., Bradley, J., and M. Jones, "OAuth 2.0 인가 프레임워크: JWT-Secured Authorization Request (JAR)", RFC 9101, DOI 10.17487/RFC9101, , <https://www.rfc-editor.org/info/rfc9101>.

10.2. 정보성 참고문헌

[IANA.OAuth.Parameters]
IANA, "OAuth Parameters", <http://www.iana.org/assignments/oauth-parameters>.
[OAUTH-SECURITY-TOPICS]
Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett, "OAuth 2.0 Security Best Current Practice", 진행 중인 작업, Internet-Draft, draft-ietf-oauth-security-topics-18, , <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-18>.
[OAUTH-V2]
Hardt, D., Parecki, A., and T. Lodderstedt, "OAuth 2.1 인가 프레임워크", 진행 중인 작업, Internet-Draft, draft-ietf-oauth-v2-1-03, , <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-03>.
[OIDC]
Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore, "OpenID Connect Core 1.0 incorporating errata set 1", , <http://openid.net/specs/openid-connect-core-1_0.html>.
[OIDC.Disco]
Sakimura, N., Bradley, J., Jones, M., and E. Jay, "OpenID Connect Discovery 1.0 incorporating errata set 1", , <http://openid.net/specs/openid-connect-discovery-1_0.html>.
[RFC6755]
Campbell, B. and H. Tschofenig, "OAuth를 위한 IETF URN 하위 네임스페이스", RFC 6755, DOI 10.17487/RFC6755, , <https://www.rfc-editor.org/info/rfc6755>.
[RFC7517]
Jones, M., "JSON Web Key (JWK)", RFC 7517, DOI 10.17487/RFC7517, , <https://www.rfc-editor.org/info/rfc7517>.
[RFC7519]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/info/rfc7519>.
[RFC7523]
Jones, M., Campbell, B., and C. Mortimore, "OAuth 2.0 클라이언트 인증 및 인가 그랜트를 위한 JSON Web Token (JWT) 프로파일", RFC 7523, DOI 10.17487/RFC7523, , <https://www.rfc-editor.org/info/rfc7523>.
[RFC7591]
Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and P. Hunt, "OAuth 2.0 동적 클라이언트 등록 프로토콜", RFC 7591, DOI 10.17487/RFC7591, , <https://www.rfc-editor.org/info/rfc7591>.
[RFC7636]
Sakimura, N., Ed., Bradley, J., and N. Agarwal, "OAuth 공개 클라이언트를 위한 Proof Key for Code Exchange", RFC 7636, DOI 10.17487/RFC7636, , <https://www.rfc-editor.org/info/rfc7636>.
[RFC8252]
Denniss, W. and J. Bradley, "네이티브 앱을 위한 OAuth 2.0", BCP 212, RFC 8252, DOI 10.17487/RFC8252, , <https://www.rfc-editor.org/info/rfc8252>.
[RFC8705]
Campbell, B., Bradley, J., Sakimura, N., and T. Lodderstedt, "OAuth 2.0 상호 TLS 클라이언트 인증 및 인증서 바인딩 접근 토큰", RFC 8705, DOI 10.17487/RFC8705, , <https://www.rfc-editor.org/info/rfc8705>.
[RFC8707]
Campbell, B., Bradley, J., and H. Tschofenig, "OAuth 2.0을 위한 Resource Indicators", RFC 8707, DOI 10.17487/RFC8707, , <https://www.rfc-editor.org/info/rfc8707>.

감사의 말

이 명세는 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 에게 감사한다.

저자 주소

Torsten Lodderstedt
yes.com
Brian Campbell
Ping Identity
Nat Sakimura
NAT.Consulting
Dave Tonge
Moneyhub Financial Technology
Filip Skokan
Auth0