RFC 9101 OAuth JAR 2021년 8월
Sakimura 외 표준 트랙 [페이지]
스트림:
인터넷 엔지니어링 태스크 포스(IETF)
RFC:
9101
범주:
표준 트랙
발행:
ISSN:
2070-1721
저자:
N. Sakimura
NAT.Consulting
J. Bradley
Yubico
M. Jones
Microsoft

RFC 9101

OAuth 2.0 인가 프레임워크: JWT 보안 인가 요청(JAR)

초록

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에서 얻을 수 있다.

목차

1. 소개

OAuth 2.0 [RFC6749]의 인가 요청은 쿼리 매개변수 직렬화를 사용하며, 일반적으로 웹 브라우저와 같은 사용자 에이전트를 통해 전송된다.

예를 들어, response_type, client_id, stateredirect_uri 매개변수는 요청의 URI에 인코딩된다:

    GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

구현하기는 쉽지만, URI 안의 인코딩은 기밀성 및 무결성 보호를 제공하기 위해 애플리케이션 계층 보안을 사용하는 것을 허용하지 않는다. TLS는 클라이언트와 사용자 에이전트 사이뿐 아니라 사용자 에이전트와 인가 서버 사이의 통신 보안을 제공하는 데 사용되지만, TLS 세션은 사용자 에이전트에서 종료된다. 또한, TLS 세션은 어떤 미들박스(예: 로드 밸런서)에서 조기에 종료될 수 있다.

그 결과, [RFC6749]의 인가 요청에는 다음과 같은 단점이 있다:

(a)
사용자 에이전트를 통한 통신이 무결성 보호를 받지 않으므로 매개변수가 변조될 수 있다 (무결성 보호 실패);
(b)
통신의 출처가 인증되지 않는다 (출처 인증 실패);
(c)
사용자 에이전트를 통한 통신이 모니터링될 수 있다 (격리/기밀성 실패).

이러한 내재적인 약점 때문에 리디렉션 URI 재작성과 같은 프로토콜에 대한 여러 공격이 식별되었다.

애플리케이션 계층 보안을 사용하면 이러한 문제를 완화할 수 있다.

애플리케이션 계층 보안을 사용하면 신뢰할 수 있는 제3자가 요청을 준비하여 클라이언트 애플리케이션이 이전에 합의된 것보다 더 많은 권한을 요청하지 못하도록 할 수 있다.

또한, 요청을 참조로 전달하면 유선상 오버헤드를 줄일 수 있다.

JWT [RFC7519] 인코딩은 다음과 같은 이유로 선택되었다:

(1)
OAuth의 응답 형식으로 사용되는 JSON과 밀접한 관계가 있다는 점
(2)
텍스트 기반 특성으로 인한 개발자 친화성
(3)
XML과 비교한 상대적인 간결성
(4)
관련 서명 및 암호화 방법 [RFC7515] [RFC7516]과 함께 Proposed Standard로서의 개발 상태
(5)
XML Signature 및 Encryption과 비교한 JWS와 JWE의 상대적인 용이성.

requestrequest_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] 중 일부, 특히 issaud만 보충된다는 점에 유의한다. request 매개변수 안의 JWT는 JWS를 사용하여 무결성 보호 및 출처 인증을 받는다.

JWT [RFC7519]는 참조로 인가 엔드포인트에 전달될 수 있으며, 이 경우 request 대신 request_uri 매개변수가 사용된다.

쿼리 매개변수 대신 요청 인코딩으로 JWT [RFC7519]를 사용하면 다음과 같은 여러 이점이 있다:

(a)
무결성 보호. 요청을 서명하여 요청의 무결성을 확인할 수 있다.
(b)
출처 인증. 요청을 서명하여 서명자를 인증할 수 있다.
(c)
기밀성 보호. 요청을 암호화하여 TLS 연결이 한 지점 또는 다른 지점 (사용자 에이전트에서 및 그 이전을 포함)에서 종료되더라도 종단 간 기밀성을 제공할 수 있다.
(d)
수집 최소화. 요청은 신뢰할 수 있는 제3자가 서명하여 해당 인가 요청이 특정 정책을 준수함을 증명할 수 있다. 예를 들어, 최종 사용자가 요청한 절차를 수행하는 데 요청된 모든 개인 데이터가 엄격히 필요한지 확인하기 위해 신뢰할 수 있는 제3자가 요청을 사전 검토할 수 있으며, 그러면 그 신뢰할 수 있는 제3자가 해당 요청에 서명한다. 그런 다음 인가 서버는 서명을 검사하고 최종 사용자에게 준수 상태를 표시하여, 사용자가 이를 인가할 때 요청의 정당성에 대해 일정한 확신을 가질 수 있게 한다. 경우에 따라서는 이러한 상황에서 인가 대화상자를 건너뛰는 것이 바람직할 수도 있다.

요청을 참조로 전달하는 것이 유용한 몇 가지 경우가 있다. 예를 들면 다음과 같다:

  1. 전송되는 요청의 크기를 줄이는 것이 바람직한 경우. 애플리케이션 계층 보안을 사용하면 특히 공개 키 암호화가 사용될 때 요청의 크기가 증가한다.
  2. 클라이언트가 애플리케이션 수준 암호화를 수행하고 싶지 않은 경우. 인가 서버는 클라이언트와의 직접 통신을 통해 인가 요청을 수락하는 엔드포인트를 제공할 수 있으며, 이를 통해 클라이언트가 인증되고 채널은 TLS로 보호된다.

이 기능은 OpenID Connect [OpenID.Core]에서 사용되고 있다.

1.1. 요구사항 언어

이 문서의 핵심 단어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"은 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그 경우에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 한다.

2. 용어

이 명세의 목적상, 다음 용어 및 정의는 OAuth 2.0 프레임워크 [RFC6749], JSON Web Signature [RFC7515]JSON Web Encryption [RFC7516]에 정의된 것에 추가로 적용된다.

2.1. 요청 객체

요청 객체는 JSON으로 인코딩된 OAuth 2.0 인가 요청 매개변수를 JWT Claims Set에 담는 JSON Web Token (JWT) [RFC7519]이다.

2.2. 요청 객체 URI

요청 객체 URI는 OAuth 2.0 인가 요청을 구성하는 매개변수 집합을 참조하는 절대 URI이다. URI가 참조하는 리소스의 내용은 요청 객체 (섹션 2.1)이다. 단, 해당 URI가 동일한 인가 서버에 의해 클라이언트에 제공된 경우, 그 내용은 인가 서버의 재량에 따른 구현 세부사항이다. 내용이 요청 객체라는 것은 request_uri의 제공자가 소비자와 별개의 엔티티인 경우, 예를 들어 클라이언트가 HTTPS를 통해 접근 가능하게 만든 클라이언트 백엔드 서비스에 저장된 요청 객체를 참조하는 URI를 제공하는 경우의 상호운용성을 보장하기 위한 것이다. 후자의 경우, 즉 인가 서버가 URI의 제공자이자 소비자인 경우, 예를 들어 요청 객체와 교환하여 URI를 제공하는 엔드포인트를 제공하는 경우에는 이러한 상호운용성 문제가 적용되지 않는다.

3. 기호 및 약어

다음 약어는 이 명세에서 공통적으로 사용된다.

JSON:
JavaScript Object Notation
JWT:
JSON Web Token
JWS:
JSON Web Signature
JWE:
JSON Web Encryption
URI:
Uniform Resource Identifier
URL:
Uniform Resource Locator

4. 요청 객체

요청 객체 (섹션 2.1)는 OAuth 2.0 인가 요청을 위한 인가 요청 매개변수를 제공하는 데 사용된다. 이는 이 문서에서 정의되는 requestrequest_uri 매개변수를 제외하고, OAuth 2.0 [RFC6749] 인가 요청을 처리하는 데 사용되는 모든 매개변수(확장 매개변수 포함)를 MUST 포함한다. 매개변수는 객체의 JWT Claims로 표현된다. 매개변수 이름과 문자열 값은 JSON 문자열로 포함되어야 MUST 한다. 요청 객체는 여러 도메인에 걸쳐, 그리고 잠재적으로 폐쇄된 생태계 외부에서 처리되므로, [RFC8259]의 섹션 8.1에 따라, 이러한 JSON 문자열은 UTF-8 [RFC3629]을 사용하여 인코딩되어야 MUST 한다. 숫자 값은 JSON 숫자로 포함되어야 MUST 한다. 요청 객체는 임의의 확장 매개변수를 포함할 수 MAY 있다. 이 JSON [RFC8259] 객체는 JWT [RFC7519]에 정의된 JWT Claims Set을 구성한다. 그런 다음 JWT Claims Set은 서명되거나, 서명된 후 암호화된다.

서명에는 JSON Web Signature (JWS) [RFC7515]가 사용된다. 그 결과는 JWS 서명된 JWT [RFC7519]이다. 서명된 경우, 인가 요청 객체는 JWT [RFC7519] 명세에 정의된 것과 동일한 의미를 갖는 iss(issuer) 및 aud(audience) Claim을 멤버로 포함하는 것이 좋다 SHOULD. aud의 값은 RFC 8414 [RFC8414]에 정의된 인가 서버(AS) issuer 값이어야 한다.

암호화에는 JWE [RFC7516]가 사용된다. 서명과 암호화가 모두 적용되는 경우, JWT는 [RFC7519]의 섹션 11.2에 설명된 대로 먼저 서명된 다음 암호화되어야 MUST 한다. 그 결과는 [RFC7519]에 정의된 Nested JWT이다.

클라이언트는 요청 객체를 서명하고 암호화하는 데 사용되는 알고리즘을 결정한다. 선택된 알고리즘은 클라이언트와 인가 서버 모두에서 지원되어야 한다. 클라이언트는 동적 클라이언트 등록 메타데이터 [RFC7591], 특히 메타데이터 값 request_object_signing_alg, request_object_encryption_algrequest_object_encryption_enc를 통해 자신이 지원하는 알고리즘을 인가 서버에 알릴 수 있다. 마찬가지로, 인가 서버는 인가 서버 메타데이터 [RFC8414], 특히 메타데이터 값 request_object_signing_alg_values_supported, request_object_encryption_alg_values_supportedrequest_object_encryption_enc_values_supported를 통해 자신이 지원하는 알고리즘을 클라이언트에 알릴 수 있다.

요청 객체는 섹션 5.1에 설명된 대로 값으로 전송될 수 MAY 있고, 또는 섹션 5.2에 설명된 대로 참조로 전송될 수 있다. requestrequest_uri 매개변수는 요청 객체에 포함되어서는 안 된다 MUST NOT.

요청 객체 (섹션 2.1)는 미디어 타입 [RFC2046] application/oauth-authz-req+jwt를 가진다. 일부 기존 배포에서는 대안으로 application/jwt 타입을 사용할 수도 있다는 점에 유의한다.

다음은 base64url [RFC7515] 인코딩 및 서명 전 요청 객체 안의 Claim 예이다. 확장 매개변수 noncemax_age가 포함되어 있다는 점에 유의한다.

  {
   "iss": "s6BhdRkqt3",
   "aud": "https://server.example.com",
   "response_type": "code id_token",
   "client_id": "s6BhdRkqt3",
   "redirect_uri": "https://client.example.org/cb",
   "scope": "openid",
   "state": "af0ifjsldkj",
   "nonce": "n-0S6_WzA2Mj",
   "max_age": 86400
  }

이를 RS256 알고리즘 [RFC7518]으로 서명하면 다음 요청 객체 값이 생성된다 (표시 목적상 값 안에 줄바꿈이 포함됨):

  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

JSON Web Key (JWK) 형식으로 표현된 다음 RSA 공개 키는 이 예 및 이후 요청 객체 예에서 요청 객체 서명을 검증하는 데 사용할 수 있다(표시 목적상 값 안에 줄바꿈이 포함됨):

  {
   "kty":"RSA",
   "kid":"k2bdc",
   "n":"x5RbkAZkmpRxia65qRQ1wwSMSxQUnS7gcpVTV_cdHmfmG2ltd2yabEO9XadD8
        pJNZubINPpmgHh3J1aD9WRwS05ucmFq3CfFsluLt13_7oX5yDRSKX7poXmT_5
        ko8k4NJZPMAO8fPToDTH7kHYbONSE2FYa5GZ60CUsFhSonI-dcMDJ0Ary9lxI
        w5k2z4TAdARVWcS7sD07VhlMMshrwsPHBQgTatlkxyIHXbYdtak8fqvNAwr7O
        lVEvM_Ipf5OfmdB8Sd-wjzaBsyP4VhJKoi_qdgSzpC694XZeYPq45Sw-q51iF
        UlcOlTCI7z6jltUtnR6ySn6XDGFnzH5Fe5ypw",
   "e":"AQAB"
  }

5. 인가 요청

클라이언트는 application/x-www-form-urlencoded 형식을 사용하여 인가 엔드포인트 URI의 쿼리 구성요소에 다음 매개변수를 추가함으로써 인가 요청 URI를 구성한다:

request
request_uri가 지정되지 않은 경우 REQUIRED. 요청 객체 (섹션 2.1)로서, [RFC6749]의 섹션 4 (OAuth 2.0)에 명시된 인가 요청 매개변수를 담는다. 이 매개변수가 인가 요청에 존재하는 경우, request_uri는 존재해서는 안 된다 MUST NOT.
request_uri
request가 지정되지 않은 경우 REQUIRED. RFC 3986 [RFC3986]에 정의된 절대 URI로서, [RFC6749]의 섹션 4 (OAuth 2.0)에 명시된 인가 요청 매개변수를 참조하는 요청 객체 URI (섹션 2.2)이다. 이 매개변수가 인가 요청에 존재하는 경우, request는 존재해서는 안 된다 MUST NOT.
client_id
REQUIRED. OAuth 2.0 [RFC6749] client_id. 값은 request 또는 request_uri 요청 객체의 (섹션 2.1) client_id와 일치해야 MUST 한다.

클라이언트는 HTTP 리디렉션 응답 또는 사용자 에이전트를 통해 사용할 수 있는 다른 수단을 사용하여 리소스 소유자를 구성된 URI로 안내한다.

예를 들어, 클라이언트는 최종 사용자의 사용자 에이전트가 다음 HTTPS 요청을 하도록 안내한다:

GET /authz?client_id=s6BhdRkqt3&request=eyJhbG..AlMGzw HTTP/1.1
Host: server.example.com

request 매개변수의 값은 간결성을 위해 축약되어 있다.

인가 요청 객체는 다음 중 하나여야 MUST 한다:

(a)
JWS 서명됨
(b)
JWS 서명되고 JWE 암호화됨

클라이언트는 이전 버전과의 호환성 등을 위해 요청 객체에 포함된 매개변수를 쿼리 매개변수에도 중복하여 보낼 수 MAY 있다. 그러나 이 명세를 지원하는 인가 서버는 요청 객체에 포함된 매개변수만 사용해야 MUST 한다.

5.1. 요청 객체를 값으로 전달

클라이언트는 인가 요청을 요청 객체로서 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

5.2. 요청 객체를 참조로 전달

request_uri 인가 요청 매개변수는 OAuth 인가 요청을 값이 아니라 참조로 전달할 수 있게 한다. 이 매개변수는 요청 객체 값이 값으로 전달되는 대신 지정된 URI로 식별되는 리소스에서 검색된다는 점을 제외하면 request 매개변수와 동일하게 사용된다.

전체 요청 URI는 512 ASCII 문자를 초과하지 않는 것이 좋다 SHOULD NOT. 이 제한에는 두 가지 이유가 있다:

  1. 이 문서 작성 시점에 시장의 많은 휴대전화는 여전히 큰 페이로드를 수용하지 않는다. 제한은 일반적으로 512 또는 1024 ASCII 문자이다.
  2. 2G 모바일 연결과 같은 느린 연결에서는 큰 URL이 느린 응답을 유발하므로, 사용자 경험 관점에서 그러한 사용은 권장되지 않는다.

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

5.2.1. 요청 객체를 참조하는 URI

클라이언트는 요청 객체 리소스를 인가 서버가 접근할 수 있는 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

5.2.2. "request_uri" 요청 매개변수를 사용하는 요청

클라이언트는 인가 요청을 인가 엔드포인트에 보낸다.

다음은 request_uri 매개변수를 사용하는 인가 요청의 예이다 (표시 목적상 값 안에 줄바꿈이 포함됨):

  https://server.example.com/authorize?
    client_id=s6BhdRkqt3
    &request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt
    %2FGkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM

5.2.3. 인가 서버가 요청 객체를 가져옴

요청을 수신하면, 인가 서버는 요청 객체가 서버가 다른 메커니즘을 통해 안전하게 검색하고 파싱하여 인가 요청 매개변수를 재생성할 수 있는 방식으로 저장되어 있지 않은 한, 참조된 요청 객체를 검색하기 위해 request_uri에 HTTP GET 요청을 보내야 MUST 한다.

다음은 이 가져오기 과정의 예이다. 이 예에서는 신뢰할 수 있는 제3자 서비스가 요청 객체를 호스팅한다.

GET /request.jwt/GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM HTTP/1.1
Host: tfp.example.org

다음은 가져오기 응답의 예이다:

  HTTP/1.1 200 OK
  Date: Thu, 20 Aug 2020 23:52:39 GMT
  Server: Apache/2.4.43 (tfp.example.org)
  Content-type: application/oauth-authz-req+jwt
  Content-Length: 797
  Last-Modified: Wed, 19 Aug 2020 23:52:32 GMT

  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

6. JWT 기반 요청 검증

6.1. JWE 암호화된 요청 객체

요청 객체가 암호화된 경우, 인가 서버는 JSON Web Encryption [RFC7516] 명세에 따라 JWT를 복호화해야 MUST 한다.

그 결과는 서명된 요청 객체이다.

복호화에 실패하면, 인가 서버는 인가 요청에 대한 응답으로 클라이언트에 invalid_request_object 오류를 반환해야 MUST 한다.

6.2. JWS 서명된 요청 객체

인가 서버는 JWS 서명된 [RFC7515] 요청 객체의 서명을 검증해야 MUST 한다. kid 헤더 매개변수가 있는 경우, 식별된 키는 사용된 키여야 MUST 하며 클라이언트와 연결된 키여야 MUST 한다. 서명은 클라이언트와 연결된 키와 alg 헤더 매개변수에 지정된 알고리즘을 사용하여 검증되어야 MUST 한다. 알고리즘 검증은 [RFC8725]의 섹션 3.13.2에 지정된 대로 수행되어야 MUST 한다.

키가 클라이언트와 연결되어 있지 않거나 서명 검증에 실패하면, 인가 서버는 인가 요청에 대한 응답으로 클라이언트에 invalid_request_object 오류를 반환해야 MUST 한다.

6.3. 요청 매개변수 조립 및 검증

인가 서버는 요청 객체 값에서 인가 요청 매개변수 집합을 추출해야 MUST 한다. 인가 서버는 동일한 매개변수가 쿼리 매개변수로 제공되더라도 요청 객체 안의 매개변수만 사용해야 MUST 한다. client_id 요청 매개변수 안의 클라이언트 ID 값과 요청 객체 client_id Claim 안의 값은 동일해야 MUST 한다. 그런 다음 인가 서버는 OAuth 2.0 [RFC6749]에 지정된 대로 요청을 검증한다.

클라이언트 ID 확인 또는 요청 검증에 실패하면, 인가 서버는 [RFC6749]의 섹션 5.2 (OAuth 2.0)에 지정된 대로 인가 요청에 대한 응답으로 클라이언트에 오류를 반환해야 MUST 한다.

7. 인가 서버 응답

인가 서버 응답은 [RFC6749]의 섹션 4 (OAuth 2.0)와 같이 생성되어 클라이언트에 전송된다.

또한, 이 문서는 다음 추가 오류 값을 사용한다:

invalid_request_uri
인가 요청 안의 request_uri가 오류를 반환하거나 유효하지 않은 데이터를 포함한다.
invalid_request_object
request 매개변수가 유효하지 않은 요청 객체를 포함한다.
request_not_supported
인가 서버가 request 매개변수의 사용을 지원하지 않는다.
request_uri_not_supported
인가 서버가 request_uri 매개변수의 사용을 지원하지 않는다.

8. TLS 요구사항

요청 객체 URI 방식을 지원하는 클라이언트 구현은 "Transport Layer Security (TLS) 및 Datagram Transport Layer Security (DTLS)의 안전한 사용을 위한 권고" [RFC7525]를 따라 TLS를 지원해야 MUST 한다.

정보 공개와 변조를 방지하기 위해, 기밀성과 무결성 보호를 제공하는 암호 스위트를 갖춘 TLS를 사용하여 기밀성 보호를 적용해야 MUST 한다.

HTTP 클라이언트는 중간자 공격을 피하기 위해 DNS-ID [RFC6125]를 사용하여 TLS 서버 인증서도 검증해야 MUST 한다. [RFC6125]에 정의된 규칙과 지침은 다음 고려사항과 함께 여기에도 적용된다:

9. IANA 고려사항

9.1. OAuth 매개변수 등록

요청 객체는 JWT이므로, 핵심 JWT Claim은 JWT가 지시하는 목적 외에는 요청 객체에서 어떤 목적으로도 사용될 수 없다. 따라서 향후 OAuth 확장이 이들을 다른 의미로 사용하는 것을 피하기 위해 OAuth 인가 요청 매개변수로 등록되었다.

이 명세는 [RFC6749]에 의해 설정된 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가한다.

이름:
iss
매개변수 사용 위치:
인가 요청
변경 관리자:
IETF
명세 문서:
이 문서 및 [RFC7519]의 섹션 4.1.1.
이름:
sub
매개변수 사용 위치:
인가 요청
변경 관리자:
IETF
명세 문서:
이 문서 및 [RFC7519]의 섹션 4.1.2.
이름:
aud
매개변수 사용 위치:
인가 요청
변경 관리자:
IETF
명세 문서:
이 문서 및 [RFC7519]의 섹션 4.1.3.
이름:
exp
매개변수 사용 위치:
인가 요청
변경 관리자:
IETF
명세 문서:
이 문서 및 [RFC7519]의 섹션 4.1.4.
이름:
nbf
매개변수 사용 위치:
인가 요청
변경 관리자:
IETF
명세 문서:
이 문서 및 [RFC7519]의 섹션 4.1.5.
이름:
iat
매개변수 사용 위치:
인가 요청
변경 관리자:
IETF
명세 문서:
이 문서 및 [RFC7519]의 섹션 4.1.6.
이름:
jti
매개변수 사용 위치:
인가 요청
변경 관리자:
IETF
명세 문서:
이 문서 및 [RFC7519]의 섹션 4.1.7.

9.2. OAuth 인가 서버 메타데이터 레지스트리

이 명세는 [RFC8414]에 의해 설정된 "OAuth Authorization Server Metadata" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가한다.

메타데이터 이름:
require_signed_request_object
메타데이터 설명:
인가 요청이 요청 객체로 보호되어야 하며 request 또는 request_uri parameter를 통해 제공되어야 하는 위치를 나타낸다.
변경 관리자:
IETF
명세 문서:
이 문서의 섹션 10.5.

9.3. OAuth 동적 클라이언트 등록 메타데이터 레지스트리

이 명세는 [RFC7591]에 의해 설정된 "OAuth Dynamic Client Registration Metadata" 레지스트리 [IANA.OAuth.Parameters]에 다음 값을 추가한다.

메타데이터 이름:
require_signed_request_object
메타데이터 설명:
인가 요청이 요청 객체로 보호되어야 하며 request 또는 request_uri parameter를 통해 제공되어야 하는 위치를 나타낸다.
변경 관리자:
IETF
명세 문서:
이 문서의 섹션 10.5.

9.4. 미디어 타입 등록

9.4.1. 레지스트리 내용

이 섹션은 application/oauth-authz-req+jwt 미디어 타입 [RFC2046][RFC6838]에 설명된 방식으로 "Media Types" 레지스트리 [IANA.MediaTypes]에 등록한다. 이는 내용이 요청 객체 Claim을 포함하는 JWT임을 나타내는 데 사용할 수 있다.

타입 이름:
application
하위 타입 이름:
oauth-authz-req+jwt
필수 매개변수:
N/A
선택 매개변수:
N/A
인코딩 고려사항:
binary; 요청 객체는 JWT이다; JWT 값은 마침표(.) 문자로 구분된 일련의 base64url 인코딩 값(그중 일부는 빈 문자열일 수 있음)으로 인코딩된다.
보안 고려사항:
RFC 9101의 섹션 10 참조
상호운용성 고려사항:
N/A
공개된 명세:
RFC 9101의 섹션 4
이 미디어 타입을 사용하는 애플리케이션:
OAuth 2.0 인가 요청을 만들기 위해 요청 객체를 사용하는 애플리케이션
프래그먼트 식별자 고려사항:
N/A
추가 정보:


이 타입의 폐기된 별칭 이름:
N/A
매직 넘버:
N/A
파일 확장자:
N/A
Macintosh 파일 타입 코드:
N/A
추가 정보를 위한 담당자 및 이메일 주소:

Nat Sakimura <nat@nat.consulting>
의도된 사용:
COMMON
사용 제한:
없음
저자:
Nat Sakimura <nat@nat.consulting>
변경 관리자:
IETF
임시 등록인가?
아니오

10. 보안 고려사항

OAuth 2.0에서 논의된 보안 고려사항 [RFC6819] 전체에 더하여, [RFC7515], [RFC7516], [RFC7518][RFC8725]의 보안 고려사항도 고려해야 한다. 또한, OAuth와 같은 프로토콜의 보안 속성에 대한 유용한 통찰을 제공하는 [BASIN] 같은 여러 학술 논문도 있다.

위 사항을 고려하여, 이 문서는 다음 보안 고려사항을 감안할 것을 권고한다.

10.1. 알고리즘 선택

request 매개변수를 통해 인가 요청 객체를 전송할 때, 이는 당시 적절하다고 여겨지는 알고리즘을 사용하여 JWS [RFC7515]로 서명되거나, 또는 각각 JWS [RFC7515]JWE [RFC7516]를 사용하여 서명된 다음 암호화되어야 MUST 한다.

10.2. 요청 출처 인증

인가 요청의 출처는 항상 검증되어야 MUST 한다. 이를 수행하는 방법은 여러 가지가 있다:

(a)
요청 객체의 JWS 서명 검증.
(b)
JWE가 대칭 암호화를 사용하는 경우, JWE 암호화를 위한 대칭 키가 올바른 키인지 검증. 그러나 공개 키 암호화가 사용되는 경우, 누구나 공개 키로 암호화할 수 있으므로 암호화에 의해 출처 인증이 활성화되지는 않는다는 점에 유의한다.
(c)
요청 객체 URI의 TLS 서버 신원 검증. 이 경우, 인가 서버는 클라이언트가 요청 객체 URI를 사용하며 해당 TLS 인증서가 클라이언트만을 포함한다는 것을 대역 외로 알고 있어야 MUST 한다. 일반적으로 이는 신뢰할 수 있는 방법이 아니다.
(d)
인가 서버가 요청 객체와 교환하여 요청 객체 URI를 반환하는 서비스를 구현하는 경우, 인가 서버는 요청 객체를 수락하기 위해 클라이언트 인증을 수행하고, 자신이 제공하는 요청 객체 URI에 클라이언트 식별자를 바인딩해야 MUST 한다. 또한 (a)에 따라 서명을 검증해야 MUST 한다. 요청 객체 URI는 재사용될 수 있으므로, 요청 객체 URI의 수명은 짧아야 MUST 하며 가능하면 일회용이어야 한다. 요청 객체 URI의 엔트로피는 충분히 커야 MUST 한다. 유효성의 적절한 짧음과 요청 객체 URI의 엔트로피는 보호되는 리소스의 가치를 기반으로 한 위험 계산에 따라 달라진다. 유효 시간에 대한 일반적인 지침은 1분 미만이며, 요청 객체 URI는 이 명세 작성 시점에 128비트 이상의 암호학적 난수 값을 포함하는 것이다.
(e)
신뢰할 수 있는 제3자 서비스가 요청 객체와 교환하여 요청 객체 URI를 반환하는 경우, 해당 서비스는 (a)에 따라 서명을 검증해야 MUST 한다. 또한 인가 서버는 그 제3자 서비스에 의해 신뢰되어야 MUST 하며, 클라이언트도 그 서비스에 의해 신뢰된다는 것을 대역 외로 알고 있어야 MUST 한다.

10.3. 명시적 엔드포인트

이 명세가 이를 요구하지는 않지만, [BASIN]과 같은 연구는 의도된 상호작용 엔드포인트와 시퀀스 내 메시지 위치를 변조가 드러나는 방식으로 명시하여 개시자의 의도가 모호하지 않도록 하는 것이 좋은 관행임을 지적한다. 이 명세는 [RFC6749], [RFC6750][RFC8414]에 정의된 다음 엔드포인트에 대해 이 관행을 사용할 것을 RECOMMENDED한다:

(a)
보호된 리소스(protected_resources)
(b)
인가 엔드포인트(authorization_endpoint)
(c)
리디렉션 URI(redirect_uri)
(d)
토큰 엔드포인트(token_endpoint)

또한 동적 탐색이 사용되는 경우, 이 관행은 탐색 관련 엔드포인트에도 적용된다.

[RFC6749]에서는 리디렉션 URI가 인가 요청에 포함되지만, 다른 것들은 포함되지 않는다. 그 결과, 인가 요청 객체에도 동일하게 적용된다.

10.4. request_uri와 관련된 위험

request_uri의 도입은 여러 공격 가능성을 도입한다. URI와 관련된 위험에 대한 자세한 정보는 [RFC3986]의 섹션 7의 보안 고려사항을 참조한다.

10.4.1. 인가 서버에 대한 DDoS 공격

악의적인 클라이언트 집합은 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을 수행하지 않아야 한다.

10.4.2. 요청 URI 재작성

request_uri의 값은 서명되지 않는다. 따라서 브라우저 내부의 중간자 공격자에 의해 변조될 수 있다. 이로 인해 여러 공격 가능성이 발생한다. 예를 들어, a) 공격자가 재작성된 URI가 가리키는 다른 파일을 만들어 추가 scope를 요청할 수 있게 하거나, b) 공격자가 request_uri의 값을 피해 사이트의 값으로 설정하여 피해 사이트에 DoS 공격을 시작할 수 있다.

이러한 공격의 성공을 방지하기 위해, 서버는 a) request_uri 매개변수의 값이 예상치 못한 위치를 가리키지 않는지 확인하고, b) 응답의 미디어 타입이 application/oauth-authz-req+jwt인지 확인하며, c) request_uri의 콘텐츠를 얻기 위한 시간 제한을 구현해야 한다.

10.5. 다운그레이드 공격

클라이언트와 서버가 사용하는 프로토콜이 OAuth JWT-Secured Authorization Request (JAR)를 사용하도록 고정되어 있지 않으면, 공격자가 RFC 6749 요청을 사용하여 이 명세가 제공하는 모든 보호를 우회할 수 있다.

이러한 종류의 공격을 방지하기 위해, 이 명세는 require_signed_request_object라는 이름의 새로운 클라이언트 메타데이터 값과 서버 메타데이터 값을 정의하며, 두 값 모두 boolean이다.

클라이언트 메타데이터로서 이 값이 true이면, 서버는 이 명세를 따르지 않는 클라이언트의 인가 요청을 거부해야 MUST 한다. 또한 이 서버 메타데이터 값이 true일 때 요청 객체가 nonealg 값을 사용하는 경우에도 요청을 거부해야 MUST 한다. 생략된 경우 기본값은 false이다.

서버 메타데이터로서 이 값이 true이면, 서버는 이 명세를 따르지 않는 모든 클라이언트의 인가 요청을 거부해야 MUST 한다. 또한 요청 객체가 nonealg 값을 사용하는 경우에도 요청을 거부해야 MUST 한다. 생략된 경우, 기본값은 false이다.

require_signed_request_object 메타데이터 값이 없더라도, 클라이언트와 서버가 상호 지원하는 서명 알고리즘이 있다면 클라이언트는 서명된 요청 객체를 사용할 수 MAY 있다는 점에 유의한다. 서명 알고리즘 메타데이터의 사용은 섹션 4에 설명되어 있다.

10.6. TLS 보안 고려사항

현재의 보안 고려사항은 "Transport Layer Security (TLS) 및 Datagram Transport Layer Security (DTLS)의 안전한 사용을 위한 권고" [RFC7525]에서 확인할 수 있다. 이는 OAuth 2.0 [RFC6749]의 TLS 버전 권고를 대체한다.

10.7. 매개변수 불일치

OAuth 매개변수 값이 일반 OAuth 매개변수와 요청 객체 Claim이라는 두 위치에서 전송된다는 점을 고려할 때, 구현은 불일치하는 매개변수 값을 사용하여 의도하지 않은 결과를 얻을 수 있는 공격을 방지해야 한다. 이것이 두 클라이언트 ID 값이 일치해야 MUST 하는 이유, 요청 객체의 매개변수 값만 사용해야 하는 이유, 그리고 requestrequest_uri도 요청 객체에 나타날 수 없는 이유이다.

10.8. 교차 JWT 혼동

[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 혼동을 방지하는 또 다른 방법은 요청 객체 서명에 사용되는 키가 다른 목적에 사용되는 키와 식별 가능하게 구별되는 키 관리 체계를 사용하는 것이다. 그러면 공격자가 요청 객체를 다른 컨텍스트에서 재사용하려고 시도할 경우 키 불일치가 발생하여 공격이 좌절된다.

11. 프라이버시 고려사항

클라이언트가 개인 데이터를 포함하는 보호된 리소스에 대한 접근 권한을 부여받는 경우, 클라이언트와 인가 서버 모두 프라이버시 원칙을 준수해야 한다. "인터넷 프로토콜을 위한 프라이버시 고려사항" [RFC6973]은 프로토콜 설계와 구현의 개선에 관한 훌륭한 지침을 제공한다. 그 안에 나열된 조항을 따라야 한다.

대부분의 조항은 "OAuth 2.0 인가 프레임워크" [RFC6749]와 "OAuth 2.0 인가 프레임워크: Bearer Token 사용" [RFC6750]에 적용되며, 이 명세에만 특정되는 것은 아니다. 이하에서는 이 명세에 특정되는 조항만 언급한다.

11.1. 수집 제한

클라이언트가 개인 데이터를 포함하는 보호된 리소스에 대한 접근 권한을 부여받는 경우, 클라이언트는 개인 데이터 수집을 적용 가능한 법의 범위 안에 있고 지정된 목적에 엄격히 필요한 것으로 제한해야 SHOULD 한다.

사용자에게 요청된 개인 데이터가 엄격히 필요한지 알아내는 것은 종종 어렵다. 신뢰할 수 있는 제3자 서비스는 클라이언트 요청을 검토하고, 이를 클라이언트가 제안한 처리와 비교하며, 요청을 인증함으로써 사용자를 도울 수 있다. 인증 후 클라이언트는 인가 요청을 할 때, 요청 객체 URI를 얻기 위해 신뢰할 수 있는 제3자 서비스에 인가 요청을 제출할 수 있다. 이 절차는 두 단계로 이루어진다:

(1)
(인증 절차) 신뢰할 수 있는 제3자 서비스는 클라이언트의 비즈니스 절차를 검토하고 필요한 Claim을 결정한다; 이것이 인증 절차이다. 클라이언트가 인증되면, 신뢰할 수 있는 제3자 서비스에 요청 객체를 푸시하여 request_uri를 얻기 위해 인증할 수 있는 클라이언트 자격 증명이 발급된다.
(2)
(변환 절차) 클라이언트는 받은 클라이언트 자격 증명을 사용하여 신뢰할 수 있는 제3자 서비스에 요청 객체를 푸시하고 request_uri를 얻는다. 신뢰할 수 있는 제3자 서비스는 또한 요청 객체가 이전 단계에 따라 클라이언트가 받을 자격이 있는 Claim과 일치하는지 검증한다.

인가 요청에서 이러한 요청 객체 URI를 수신하면, 인가 서버는 먼저 요청 객체 URI의 authority 부분이 신뢰할 수 있는 제3자 서비스에 대한 합법적인 것인지 검증한다. 그런 다음 인가 서버는 요청 객체 URI에 HTTP GET 요청을 보낸다. 연결 시, 인가 서버는 TLS 인증서에 표현된 서버 신원이 요청 객체 URI에 대해 합법적인지 검증해야 MUST 한다. 그런 다음 인가 서버는 클라이언트를 나타내는 client_id를 포함하는 요청 객체를 얻을 수 있다.

동의 화면은 클라이언트를 표시해야 MUST 하며, 요청이 신뢰할 수 있는 제3자 서비스에 의해 수집 제한 원칙 준수에 대해 검토되었음을 표시하는 것이 좋다 SHOULD.

11.2. 공개 제한

11.2.1. 요청 공개

이 명세는 확장 매개변수를 허용한다. 여기에는 잠재적으로 민감한 정보가 포함될 수 있다. URI 쿼리 매개변수는 다양한 수단, 특히 referrer와 브라우저 기록을 통해 유출될 수 있으므로, 인가 요청에 잠재적으로 민감한 매개변수가 포함된 경우, 클라이언트는 JWE [RFC7516]를 사용하여 요청 객체를 암호화해야 SHOULD 한다.

요청 객체 URI 방식이 사용되는 경우, 요청 객체가 개인 식별 가능 정보 또는 민감한 정보를 포함한다면, request_uri는 일회용으로만 사용되고 짧은 유효 기간을 가져야 SHOULD 하며, 요청 객체 자체가 JWE [RFC7516]를 사용하여 암호화되지 않는 한 적용 가능한 보안 정책에 대해 충분한 엔트로피를 가져야 MUST 한다. 유효성의 적절한 짧음과 요청 객체 URI의 엔트로피는 보호되는 리소스의 가치를 기반으로 한 위험 계산에 따라 달라진다. 유효 시간에 대한 일반적인 지침은 1분 미만이며, 요청 객체 URI는 이 명세 작성 시점에 128비트 이상의 암호학적 난수 값을 포함하는 것이다.

11.2.2. 요청 객체 URI를 사용하는 추적

보호된 리소스가 개인 식별 정보를 포함하지 않더라도, 사용자별 지속적 정적 요청 객체 URI가 사용되는 경우 요청 객체 URI를 통해 사용자를 식별하는 것이 때때로 가능하다. 제3자가 브라우저 기록 등을 통해 이를 관찰하고 이를 사용해 사용자의 활동을 연관시키기 시작할 수 있다. 어떤 면에서는 이것도 데이터 공개이며 피해야 한다.

따라서 사용자별 지속적 요청 객체 URI는 피해야 한다. 일회용 요청 객체 URI가 하나의 대안이다.

12. 참고문헌

12.1. 규범 참고문헌

[RFC2119]
Bradner, S., "RFC에서 요구 수준을 나타내기 위해 사용하는 핵심 단어", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC3629]
Yergeau, F., "UTF-8, ISO 10646의 변환 형식", STD 63, RFC 3629, DOI 10.17487/RFC3629, , <https://www.rfc-editor.org/info/rfc3629>.
[RFC3986]
Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): 일반 구문", STD 66, RFC 3986, DOI 10.17487/RFC3986, , <https://www.rfc-editor.org/info/rfc3986>.
[RFC6125]
Saint-Andre, P. and J. Hodges, "Transport Layer Security (TLS)의 맥락에서 X.509 (PKIX) 인증서를 사용하는 인터넷 공개 키 기반 구조 내 도메인 기반 애플리케이션 서비스 신원의 표현 및 검증", RFC 6125, DOI 10.17487/RFC6125, , <https://www.rfc-editor.org/info/rfc6125>.
[RFC6749]
Hardt, D., Ed., "OAuth 2.0 인가 프레임워크", RFC 6749, DOI 10.17487/RFC6749, , <https://www.rfc-editor.org/info/rfc6749>.
[RFC6750]
Jones, M. and D. Hardt, "OAuth 2.0 인가 프레임워크: Bearer Token 사용", RFC 6750, DOI 10.17487/RFC6750, , <https://www.rfc-editor.org/info/rfc6750>.
[RFC7230]
Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): 메시지 구문 및 라우팅", RFC 7230, DOI 10.17487/RFC7230, , <https://www.rfc-editor.org/info/rfc7230>.
[RFC7515]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Signature (JWS)", RFC 7515, DOI 10.17487/RFC7515, , <https://www.rfc-editor.org/info/rfc7515>.
[RFC7516]
Jones, M. and J. Hildebrand, "JSON Web Encryption (JWE)", RFC 7516, DOI 10.17487/RFC7516, , <https://www.rfc-editor.org/info/rfc7516>.
[RFC7518]
Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, DOI 10.17487/RFC7518, , <https://www.rfc-editor.org/info/rfc7518>.
[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>.
[RFC7525]
Sheffer, Y., Holz, R., and P. Saint-Andre, "Transport Layer Security (TLS) 및 Datagram Transport Layer Security (DTLS)의 안전한 사용을 위한 권고", BCP 195, RFC 7525, DOI 10.17487/RFC7525, , <https://www.rfc-editor.org/info/rfc7525>.
[RFC8141]
Saint-Andre, P. and J. Klensin, "Uniform Resource Names (URNs)", RFC 8141, DOI 10.17487/RFC8141, , <https://www.rfc-editor.org/info/rfc8141>.
[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>.

12.2. 정보 참고문헌

[BASIN]
Basin, D., Cremers, C., and S. Meier, "엔티티 인증을 위한 ISO/IEC 9798 표준의 증명 가능한 복구", Journal of Computer Security - Security and Trust Principles, Volume 21, Issue 6, pp. 817-846, , <https://www.cs.ox.ac.uk/people/cas.cremers/downloads/papers/BCM2012-iso9798.pdf>.
[CapURLs]
Tennison, J., Ed., "Capability URL을 위한 모범 사례", W3C First Public Working Draft, , <https://www.w3.org/TR/capability-urls/>.
[IANA.JWT.Claims]
IANA, "JSON Web Token (JWT)", <https://www.iana.org/assignments/jwt>.
[IANA.MediaTypes]
IANA, "Media Types", <https://www.iana.org/assignments/media-types>.
[IANA.OAuth.Parameters]
IANA, "OAuth Parameters", <https://www.iana.org/assignments/oauth-parameters>.
[OpenID.Core]
Sakimura, N., Bradley, J., Jones, M.B., de Medeiros, B., and C. Mortimore, "정오표 세트 1을 포함한 OpenID Connect Core 1.0", OpenID Foundation Standards, , <http://openid.net/specs/openid-connect-core-1_0.html>.
[RFC2046]
Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types", RFC 2046, DOI 10.17487/RFC2046, , <https://www.rfc-editor.org/info/rfc2046>.
[RFC6819]
Lodderstedt, T., Ed., McGloin, M., and P. Hunt, "OAuth 2.0 위협 모델 및 보안 고려사항", RFC 6819, DOI 10.17487/RFC6819, , <https://www.rfc-editor.org/info/rfc6819>.
[RFC6838]
Freed, N., Klensin, J., and T. Hansen, "미디어 타입 명세 및 등록 절차", BCP 13, RFC 6838, DOI 10.17487/RFC6838, , <https://www.rfc-editor.org/info/rfc6838>.
[RFC6973]
Cooper, A., Tschofenig, H., Aboba, B., Peterson, J., Morris, J., Hansen, M., and R. Smith, "인터넷 프로토콜을 위한 프라이버시 고려사항", RFC 6973, DOI 10.17487/RFC6973, , <https://www.rfc-editor.org/info/rfc6973>.
[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>.
[RFC8725]
Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token 모범 현행 관행", BCP 225, RFC 8725, DOI 10.17487/RFC8725, , <https://www.rfc-editor.org/info/rfc8725>.

감사의 말

다음 사람들은 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).

저자 주소

Nat Sakimura
NAT.Consulting
2-22-17 Naka
Kunitachi, Tokyo 186-0004
Japan
전화: +81-42-580-7401
John Bradley
Yubico
Sucursal Talagante
Casilla 177
Talagante
RM
Chile
전화: +1.202.630.5272
Michael B. Jones
Microsoft
One Microsoft Way
Redmond, Washington 98052
United States of America