| RFC 9396 | OAuth-RAR | 2023년 5월 |
| Lodderstedt 외 | 표준 트랙 | [페이지] |
이 문서는 OAuth 메시지에서 세분화된 권한 부여 데이터를 전달하는 데 사용되는
새로운 매개변수 authorization_details를 명세한다.¶
이것은 인터넷 표준 트랙 문서이다.¶
이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산물이다. 이는 IETF 커뮤니티의 합의를 나타낸다. 공개 검토를 거쳤으며 인터넷 엔지니어링 운영 그룹(IESG)에 의해 발행이 승인되었다. 인터넷 표준에 대한 추가 정보는 RFC 7841의 섹션 2에서 확인할 수 있다.¶
이 문서의 현재 상태, 모든 정오표, 그리고 이에 대한 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc9396에서 얻을 수 있다.¶
Copyright (c) 2023 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 Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
"OAuth 2.0 Authorization Framework" [RFC6749]는 OAuth
클라이언트가 액세스 토큰의 요청된 범위, 즉 제한된 기능을
지정할 수 있게 하는 scope 매개변수를 정의한다.
이 메커니즘은 정적 시나리오와
"리소스 소유자의 프로필에 대한 읽기 액세스를 달라"와 같은
거친 단위의 권한 부여 요청을 구현하기에는 충분하다. 그러나
"Merchant A에게 45유로 금액을 이체할 수 있게 해 달라"
또는 "디렉터리 A에 대한 읽기 액세스와 파일 X에 대한 쓰기 액세스를 달라"와 같은
세분화된 권한 부여 요구 사항을 지정하기에는 충분하지 않다.¶
이 명세는 클라이언트가 JSON
[RFC8259] 데이터 구조의 표현력을 사용하여
세분화된 권한 부여 요구 사항을 지정할 수 있게 하는 새로운 매개변수
authorization_details를 도입한다.¶
예를 들어 신용 이체에 대한 권한 부여 요청(여러 오픈뱅킹 이니셔티브에서 "payment initiation"으로 지정됨)은 다음과 같은 JSON 객체를 사용하여 표현될 수 있다:¶
{
"type": "payment_initiation",
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"bic":"ABCIDEFFXXX",
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
이 객체는 금액, 통화, 채권자와 같이 의도된 결제에 대한 상세 정보를 포함하며, 이는 사용자에게 알리고 동의를 얻기 위해 필요하다. 권한 부여 서버(AS)와 해당 리소스 서버(RS) (결제 개시 API 제공)는 함께 이 동의를 시행한다.¶
오픈뱅킹 및 전자 서명 영역의 새로운 사용 사례에서 발생하는 과제에 대한 포괄적인 논의는 [Transaction-Auth]를 참조한다.¶
사용자 정의 권한 부여 요청을 용이하게 하는 것에 더해, 이 명세는 서로 다른 API에서 사용할 수 있는 공통 데이터 타입 필드 집합도 도입한다.¶
이 문서의 핵심 단어 "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", "refresh token", "authorization server" (AS), "resource server" (RS), "authorization endpoint", "authorization request", "authorization response", "token endpoint", "grant type", "access token request", "access token response", 및 "client"라는 용어를 사용한다.¶
요청 매개변수 authorization_details는 JSON 표기법으로
객체의 배열을 포함한다. 각 JSON 객체는 특정 유형의 리소스에 대한 권한 부여 요구 사항을
지정하는 데이터를 포함한다. 리소스의 유형 또는 액세스 요구 사항은
type 필드에 의해 결정되며, 이는 다음과 같이 정의된다:¶
type:
type 필드의 값은 그것을 포함하는 객체의 허용 가능한 내용을 결정한다.
이 값은 AS의 맥락에서 설명된 API에 대해 고유하다. 이 필드는
REQUIRED이다.¶
authorization_details 배열은 동일한 type의
여러 항목을 포함할 MAY 있다.¶
그림 2는 위에 표시된 예제 데이터를
사용한 payment_initiation 타입의
authorization_details를 보여준다:¶
[
{
"type": "payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
]
그림 3은 계정 정보에 대한 액세스와 결제 개시 권한을 요청하는 결합된 요청을 보여준다:¶
[
{
"type": "account_information",
"actions": [
"list_accounts",
"read_balances",
"read_transactions"
],
"locations": [
"https://example.com/accounts"
]
},
{
"type": "payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
]
account_information 및
payment_initiation의 type 필드를 가진 JSON 객체는
AS가 동의를 요청하는 데 사용할 서로 다른 authorization_details를 나타낸다.¶
이 명세는 서로 다른 타입의 API 전반에서 사용할 수 있도록 설계된 공통 데이터 필드 집합을 정의한다. 이 명세는 API 정의가 이러한 공통 필드를 사용하도록 요구하지 않으며, 대신 API 설계자가 활용할 수 있는 재사용 가능한 일반 구성 요소로 제공한다. 모든 필드의 허용 가능한 값은 특정 "type" 값으로 정의되는 보호 대상 API에 의해 결정된다.¶
locations:
actions:
datatypes:
identifier:
privileges:
서로 다른 공통 데이터 필드가 조합되어 사용될 때, 클라이언트가 요청하는
권한은 모든 값의 곱이다.
객체는 객체 내에 나열된 모든 actions 값을
객체 내에 나열된 모든 locations 값에서 객체 내에 나열된 모든
datatypes
값에 대해 사용하는 요청을 나타낸다. 다음 예에서 클라이언트는
customer_information API의 고객에 속한
contacts 및 photos 모두에 대해
read 및 write
액세스를 요청하고 있다.
이 요청이 승인되면 클라이언트는 API가 정의한 권한의 어떤 조합도 사용할 수 있다고
가정할 것이다. 예를 들어 사진에 대한 읽기 액세스와 연락처에 대한 쓰기 액세스가 이에 해당한다.¶
[
{
"type": "customer_information",
"locations": [
"https://example.com/customers"
],
"actions": [
"read",
"write"
],
"datatypes": [
"contacts",
"photos"
]
}
]
클라이언트가 액세스를 더 세밀하게 제어하려는 경우 여러 객체를
보낼 수 있다. 이 예에서 클라이언트는 동일한 API 엔드포인트의
contacts에 대한 read 액세스와
photos에 대한 write 액세스를 요청하고 있다.
이 요청이 승인되면 클라이언트는 연락처에 쓸 수 없다.¶
[
{
"type": "customer_information",
"locations": [
"https://example.com/customers"
],
"actions": [
"read"
],
"datatypes": [
"contacts"
]
},
{
"type": "customer_information",
"locations": [
"https://example.com/customers"
],
"actions": [
"write"
],
"datatypes": [
"photos"
]
}
]
API는 각각의 권한 부여 객체의 type에 따라 자체 확장을
정의할 MAY 있다.
API 설계자는 이 명세에서 정의한 공통 데이터 필드와 API 자체에 특화된 필드를
조합하여 사용할 것으로 예상된다. 다음 비규범적 예제는 두 개의 서로 다른 가상의 API
type 값의 일부로 공통 필드와 API별 필드를 모두 사용하는 것을 보여준다.
첫 번째 액세스 요청은 여기에 지정된 actions, locations, 및
datatypes
필드와 함께 API별 geolocation 필드를 포함하며, 이는 주어진 좌표에서 촬영된
사진에 대한 액세스를 나타낸다.
두 번째 액세스 요청은 여기에 지정된 actions 및
identifier 필드와 함께 API별
currency 필드를 포함한다.¶
[
{
"type":"photo-api",
"actions":[
"read",
"write"
],
"locations":[
"https://server.example.net/",
"https://resource.local/other"
],
"datatypes":[
"metadata",
"images"
],
"geolocation":[
{
"lat":-32.364,
"lng":153.207
},
{
"lat":-35.364,
"lng":158.207
}
]
},
{
"type":"financial-transaction",
"actions":[
"withdraw"
],
"identifier":"account-14-32-32-3",
"currency":"USD"
}
]
이 요청이 승인되면, 결과 액세스 토큰의 액세스 권한은 위와 마찬가지로 두 API 각각에 대해 요청된 액세스 타입의 합집합이 된다.¶
authorization_details 권한 부여 요청 매개변수는
scope 매개변수가 동일한 목적으로 사용되는 모든 위치에서 권한 부여 요구 사항을
지정하는 데 사용될 수 있으며, 예에는 다음이 포함된다:¶
[RFC6749]에 정의된 권한 부여 요청의 경우, 구현자는 흐름의 보안, 프라이버시 및 신뢰성을 개선하기 위해 pushed authorization requests [RFC9126] 사용을 고려할 MAY 있다. 자세한 내용은 섹션 12, 13, 및 11.4를 참조한다.¶
매개변수 인코딩은 각각의 맥락에 의해 결정된다.
[RFC6749]에 따른 권한 부여 요청의 맥락에서,
매개변수는 섹션 2의 예제를 사용하여
그림 8에 보인 것처럼 직렬화된 JSON의
application/x-www-form-urlencoded 형식을 사용하여 인코딩된다
(줄바꿈은 표시 목적으로만 사용됨):¶
authorization_details 매개변수에 제공된 데이터에 기반하여, AS는
요청된 액세스 권한에 대한 동의를 사용자에게 요청한다.¶
그림 9에서 클라이언트는 계정 정보에 대한 액세스와 결제 개시를 원한다:¶
[
{
"type": "account_information",
"actions": [
"list_accounts",
"read_balances",
"read_transactions"
],
"locations": [
"https://example.com/accounts"
]
},
{
"type": "payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
]
authorization_details 및 scope는 독립적인
권한 부여 요구 사항을 전달하기 위해 동일한 권한 부여 요청에서 사용될 수 있다.¶
authorization_details 및 scope의 결합 사용은
기존 OAuth 기반 애플리케이션이 authorization_details만 사용하는 방향으로
점진적으로 마이그레이션할 수 있도록 하기 위해 이 명세에서 부분적으로 지원된다.
주어진 API는 요구 사항 지정 형식 중 하나만 사용하는 것이
RECOMMENDED된다.¶
AS는 주어진 권한 부여 요청에 대해 두 요구 사항 집합을 서로 결합하여 처리해야 MUST 한다. AS가 이러한 매개변수를 결합하는 방법의 세부 사항은 보호 대상 API에 따라 다르며 이 명세의 범위를 벗어난다.¶
사용자 동의를 수집할 때, AS는 권한 부여 요청이 나타내는 병합된 요구 사항 집합을 제시해야 MUST 한다.¶
리소스 소유자가 클라이언트에게 요청된 액세스를 승인하면, AS는 해당
authorization_details(및 해당되는 경우 scope 값)와 연결된 토큰을
클라이언트에게 발급한다.¶
[RFC8707]에 정의된
resource 권한 부여 요청 매개변수는 요청된 scope가 적용될 수 있는 리소스를
추가로 결정하는 데 사용될 수 있다. resource
매개변수는 AS가 authorization_details 권한 부여 요청 매개변수를 처리하는
방식에 아무런 영향을 주지 않는다.¶
AS는 알 수 없는 권한 부여 세부 정보 타입 또는 각각의 타입 정의를 준수하지 않는
권한 부여 세부 정보의 처리를 거부해야 MUST 한다. AS는
authorization_details 구조의 객체에 대해 다음 중 하나라도 참이면 처리를 중단하고
invalid_authorization_details 오류로 클라이언트에 응답해야
MUST 한다:¶
authorization_details 토큰 요청 매개변수는 클라이언트가 AS에
액세스 토큰에 할당하도록 요청하는 권한 부여 세부 정보를 지정하는 데 사용될 수 있다. AS는
기본 grant(authorization_code, refresh_token 등의 grant type의 경우)
또는 클라이언트의 정책(client_credentials grant type의 경우)이 요청된 권한 부여
세부 정보를 가진 액세스 토큰 발급을 허용하는지 확인한다. 그렇지 않으면 AS는
invalid_authorization_details 오류 코드(invalid_scope와 유사)로
요청을 거부한다.¶
[RFC6749]에 정의된 토큰 응답 매개변수에 더해, AS는
리소스
소유자가 승인하고 각각의 액세스 토큰에 할당한 authorization_details도 반환해야
MUST 한다.¶
토큰 응답에서 발급된 액세스 토큰에 할당되는 권한 부여 세부 정보는 해당
토큰 요청의 authorization_details 매개변수에 의해 결정된다.
클라이언트가 authorization_details 토큰 요청 매개변수를 지정하지 않으면,
AS는 재량에 따라 결과 authorization_details를 결정한다.¶
AS는 클라이언트에 대한 authorization_details에서 값을 생략할
MAY 있다.¶
진행 중인 예에서는 다음과 같이 보인다:¶
RS가 권한 부여 과정에서 승인된 권한 부여 세부 정보를 시행할 수 있도록 하기 위해,
AS는 이 데이터를 RS가 사용할 수 있게 해야 MUST 한다. AS는
JSON Web Token (JWT) 형식의 액세스 토큰 또는 토큰 인트로스펙션 응답에
authorization_details 필드를 추가할 MAY 있다.¶
액세스 토큰이 JWT [RFC7519]인 경우, AS는 특정 audience에 맞게 필터링된 권한 부여 세부 정보 객체를 최상위 클레임으로 추가하는 것이 RECOMMENDED된다.¶
AS는 일반적으로 RS가 요청 처리를 위해 필요로 하는 추가 클레임도 JWT에 추가한다. 예를 들어 사용자 ID, 역할, 거래별 데이터가 있다. 특정 RS가 필요로 하는 클레임은 AS와의 RS별 정책에 의해 정의된다.¶
다음은 위의 결제 개시 예제에 대한 예제 JWT의 내용을 보여준다:¶
{
"iss": "https://as.example.com",
"sub": "24400320",
"aud": "a7AfcPcsl2",
"exp": 1311281970,
"acr": "psd2_sca",
"txn": "8b4729cc-32e4-4370-8cf0-5796154d1296",
"authorization_details": [
{
"type": "https://scheme.example.com/payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant A",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
],
"debtorAccount": {
"iban": "DE40100100103307118608",
"user_role": "owner"
}
}
이 경우 AS는 JWT 기반 액세스 토큰에 다음 예제 클레임을 추가했다:¶
토큰 인트로스펙션 [RFC7662]은 RS가
액세스 토큰에 대한 정보를 확인하기 위해
AS에 질의할 수 있는 수단을 제공한다. AS가 토큰에 대한 권한 부여 세부 정보 정보를 응답에
포함하는 경우, 이 정보는 인트로스펙션 응답 JSON 객체의 최상위 멤버인
authorization_details로 전달되어야 MUST 한다.
authorization_details 멤버는
섹션 2에 정의된 것과 동일한 구조를
포함해야 MUST 하며, 인트로스펙션 요청을 수행하는 RS에 맞게
필터링되고 확장될 수 있다.¶
다음은 결제 개시 예제에 대한 인트로스펙션 응답 예이다:¶
{
"active": true,
"sub": "24400320",
"aud": "s6BhdRkqt3",
"exp": 1311281970,
"acr": "psd2_sca",
"txn": "8b4729cc-32e4-4370-8cf0-5796154d1296",
"authorization_details": [
{
"type": "https://scheme.example.com/payment_initiation",
"actions": [
"initiate",
"status",
"cancel"
],
"locations": [
"https://example.com/payments"
],
"instructedAmount": {
"currency": "EUR",
"amount": "123.50"
},
"creditorName": "Merchant123",
"creditorAccount": {
"iban": "DE02100100109307118603"
},
"remittanceInformationUnstructured": "Ref Number Merchant"
}
],
"debtorAccount": {
"iban": "DE40100100103307118608",
"user_role": "owner"
}
}
이 기능에 대한 지원을 알리기 위해, 지원되는 권한 부여 세부 정보 타입 목록은
[RFC8414]의 AS 메타데이터 응답에
JSON 배열인 메타데이터 매개변수
authorization_details_types_supported를 사용하여 포함된다.¶
이는 다음 예제로 설명된다:¶
{
...
"authorization_details_types_supported":[
"payment_initiation",
"account_information"
]
}
클라이언트는 권한 부여를 요청할 때 사용할 권한 부여 세부 정보 타입을
JSON 배열인 클라이언트 등록 메타데이터 매개변수
authorization_details_types로 나타낼 MAY 있다.¶
이는 다음 예제로 설명된다:¶
{
...
"authorization_details_types":[
"payment_initiation"
]
}
AS에 권한 부여 세부 정보 타입을 등록하는 것은 이 명세의 범위를 벗어난다.¶
이 명세를 지원하는 일반적인 AS 구현은 다음 기본 기능을 제공해야 한다:¶
authorization_details 매개변수 수락¶
authorization_code 및
refresh_token에서 동작해야 한다.¶
권한 부여 세부 정보의 처리 및 표시는 서로 다른 권한 부여 세부 정보 타입 간에 크게 달라질 것이다. 따라서 구현은 해당 동작의 사용자 정의를 지원해야 한다. 특히 구현은 배포가 다음을 수행할 수 있게 해야 한다:¶
이러한 사용자 정의를 지원하는 한 가지 접근 방식은 확장 모듈 등록을 허용하는 메커니즘을 두는 것이다. 각 확장 모듈은 각각의 사용자 동의를 렌더링하고 구조화된 액세스 토큰 또는 토큰 인트로스펙션 응답을 통해 RS에 필요한 데이터를 제공하기 위해 필요한 변환을 담당한다.¶
구현은 배포가 권한 부여 세부 정보 타입을 정의하기 위해 기계 판독 가능
스키마 언어를 사용하도록 허용할 수 있으며, 이를 통해 이러한 스키마에 대해 권한 부여 세부
정보 객체를 생성하고 검증하는 것을 용이하게 할 수 있다. 예를 들어 권한 부여 세부 정보
type이 JSON Schemas [JSON.Schema]를 사용하여 정의된 경우, JSON Schema 식별자를
각각의 권한 부여 세부 정보 객체에서 type 값으로 사용할 수 있다.¶
그러나 type 값은 AS 및 필요한 범위 내에서 클라이언트와
RS가 이해하는 식별자라는 점에 유의한다.
이 명세는 type 값이 기계 판독 가능 스키마 형식을 가리킨다거나, 시스템의
어떤 당사자(클라이언트, AS, RS 등)가 type 필드의 내용을 특정한 방식으로
역참조하거나 처리한다고 가정하지 않는다.¶
요청 매개변수 또는 요청 객체에 authorization_details를
포함하는 권한 부여 요청 URI는 매우 길어질 수 있다. 따라서 구현자는
authorization_details를 신뢰할 수 있고 안전한 방식으로 전달하기 위해
[RFC9126]에 정의된 pushed request object
메커니즘과 함께 [RFC9101]에 정의된
request_uri 매개변수
사용을 고려해야 한다. 다음은 HTTPS로 보호되는 연결을 통해 권한 부여 요청 데이터를 AS에
직접 보내는 이러한 pushed authorization request의 예이다:¶
OAuth 권한 부여 요청의 경우 authorization_details 매개변수는
사용자 에이전트를 통해 전송되며, 이로 인해 사용자의 수정에 취약해진다. authorization_details의
무결성이 문제가 되는 경우, 클라이언트는 authorization_details를 변조 및 바꿔치기로부터
보호해야 MUST 한다. 이는 [RFC9101]에 정의된 서명된 요청 객체를 사용하여 요청을
서명하거나, [RFC9101]에 정의된
request_uri 권한 부여 요청 매개변수를 [RFC9126]와
함께 사용하여 요청 객체의 URI를 AS에 전달함으로써 달성할 수 있다.¶
authorization_details 매개변수의 모든 문자열 비교는
[RFC8259]에 정의된 대로 수행되어야 한다.
문자열 값의 동등성을 평가할 때 추가 변환이나 정규화는 수행되지 않아야 한다.¶
공통 데이터 필드 locations는 클라이언트가 특정 권한 부여를
어디에서 사용하려는지 지정할 수 있게 한다. 즉, 권한을 RS에 명확히 할당할 수 있다.
여러 RS가 있는 상황에서 이는 audience 제한을 통해 의도치 않은 클라이언트 권한 부여
(예: 이메일 및 클라우드 서비스 모두에 잠재적으로 적용될 수 있는
read scope 값)를 방지한다.¶
AS는 주입 공격을 방지하기 위해 authorization_details에 전달된
데이터를 적절히 정리하고 처리해야 MUST 한다.¶
구현자가 권한 부여 세부 정보를 프라이버시를 보존하는 방식으로 설계하고 사용하는 것은 특히 중요하다.¶
authorization_details에 포함된 모든 민감한 개인정보는 예를 들어
referrer 헤더를 통해 누출되지 않도록 방지되어야 한다. 구현 옵션에는
[RFC9101]에 정의된 암호화된 요청 객체,
또는 [RFC9126] 및
[RFC9101]에 정의된 request_uri 권한 부여 요청
매개변수를 활용하여 클라이언트와 AS 간의 종단 간 암호화된 연결을 통해
authorization_details를 전송하는 것이 포함된다. 후자는 애플리케이션 수준 암호화를
요구하지 않지만, 클라이언트와 AS 간에 또 다른 메시지 교환을 요구한다.¶
요청 데이터가 암호화되어 있더라도, 공격자는 자신이 제어하는 디바이스의 권한 부여 요청에 암호화된 요청 데이터를 주입하고 AS의 사용자 동의 화면을 사용하여 (복호화된) 사용자 데이터를 평문으로 보여주게 함으로써 AS를 이용해 사용자의 데이터를 알아낼 수 있다. 구현은 이 공격 벡터를 고려하고, 예를 들어 데이터의 일부만 표시하거나 가능한 경우 가정된 사용자 맥락이 (사용자 인증 후에도) 여전히 동일한지 판단하는 것과 같은 적절한 대응책을 구현해야 한다.¶
AS는 authorization_details를 클라이언트 또는 RS와 공유할 때의
프라이버시 영향을 고려해야 한다. AS는 로컬 정책에 의해 결정되는 "알 필요가 있는" 기준에 따라
이 데이터를 해당 당사자들과 공유해야 한다.¶
다음 매개변수는 [RFC6749]에 의해 설정된 "OAuth Parameters" 레지스트리 [IANA.OAuth.Parameters]에 등록되었다.¶
다음 값은 [RFC7519]에 의해 설정된 IANA "JSON Web Token Claims" 레지스트리에 등록되었다.¶
다음 값은 [RFC7662]에 의해 설정된 IANA "OAuth Token Introspection Response" 레지스트리에 등록되었다.¶
다음 값은 [RFC7591]에 의해 설정된 [IANA.OAuth.Parameters]의 IANA "OAuth Dynamic Client Registration Metadata" 레지스트리에 등록되었다.¶
OpenID Connect [OIDC]는
클라이언트(OpenID Connect Relying Party로 동작)가 세분화되고 프라이버시를 보존하는 방식으로
수신하고자 하는 클레임을 지정할 수 있으며, 또한 해당 클레임을 특정 전달 메커니즘, 즉
ID Token 또는 userinfo 응답에 할당할 수 있는 JSON 기반 claims 요청
매개변수를 지정한다.¶
scope 값 openid와 추가 매개변수 claims의 조합은
모든 비-OIDC scope 값과 동일한 방식으로 같은 요청에서 authorization_details와
함께 사용될 수 있다.¶
또는 OpenID Connect에 대한 권한 부여 세부 정보 타입이 있을 수 있다. 이 섹션은 그러한 권한 부여 세부 정보 타입이 어떻게 보일 수 있는지의 예를 제공하지만, 이 권한 부여 세부 정보 타입을 정의하는 것은 이 명세의 범위를 벗어난다.¶
이러한 가상의 예제는 권한 부여 과정의 OpenID Connect 부분에 특화된 모든 세부 사항을 권한 부여 JSON 객체 하나에 캡슐화하려고 한다.¶
최상위 필드는 [OIDC]에 주어진 정의를 기반으로 한다:¶
claim_sets:
profile과 같은 해당
scope 값의 대체로서, 미리 정의된 클레임 집합의 이름¶
max_age:
acr_values:
claims:
claims JSON 구조¶
이는 몇 가지 클레임 집합에 대한 간단한 요청이다.¶
[
{
"type": "openid",
"locations": [
"https://op.example.com/userinfo"
],
"claim_sets": [
"email",
"profile"
]
}
]
[
{
"type": "openid",
"locations": [
"https://op.example.com/userinfo"
],
"max_age": 86400,
"acr_values": "urn:mace:incommon:iap:silver",
"claims": {
"userinfo": {
"given_name": {
"essential": true
},
"nickname": null,
"email": {
"essential": true
},
"email_verified": {
"essential": true
},
"picture": null,
"http://example.com/claims/groups": null
},
"id_token": {
"auth_time": {
"essential": true
}
}
}
}
]
다음 예제는 ETSI TS 119 432 [ETSI] 및 원격 서명 생성을 위한 Cloud Signature Consortium (CSC) API [CSC]에서 제시된 원격 전자 서명의 개념을 기반으로 한다.¶
[
{
"type": "sign",
"locations": [
"https://signing.example.com/signdoc"
],
"credentialID": "60916d31-932e-4820-ba82-1fcead1c9ea3",
"documentDigests": [
{
"hash": "sTOgwOm+474gFj0q0x1iSNspKqbcse4IeiqlDg/HWuI=",
"label": "Credit Contract"
},
{
"hash": "HZQzZmMAIWekfGH0/ZKW1nsdt0xg3H6bZYztgsMTLw0=",
"label": "Contract Payment Protection Insurance"
}
],
"hashAlgorithmOID": "2.16.840.1.101.3.4.2.1"
}
]
최상위 필드는 다음 의미를 가진다:¶
credentialID:
documentDigests:
hash
필드)를 포함하는 배열. 또한 해당 label 필드는 예를 들어 사용자 동의에
사용될 수 있도록 각각의 문서를 사용자에게 식별한다.¶
hashAlgorithm:
AS는 이 구조에 나열된 문서에 대한 서명 생성을 위해 사용자에게 동의를 요청해야 한다. 클라이언트는 이 과정의 결과로 발급된 액세스 토큰을 사용하여 각각의 서명 서비스에서 문서 서명 API를 호출하고 실제로 서명을 생성한다. 이 액세스 토큰은 사용자 동의에 따라 클라이언트, 사용자 ID, 해시(및 서명 알고리즘)에 바인딩된다.¶
이 예제는 제3자가 예를 들어 신용도를 판단하기 위해 시민의 세금 신고서 및 소득 명세서에 액세스할 수 있도록 하는 API에서 영감을 받았다.¶
[
{
"type": "tax_data",
"locations": [
"https://taxservice.govehub.no.example.com"
],
"actions":"read_tax_declaration",
"periods": ["2018"],
"duration_of_access": 30,
"tax_payer_id": "23674185438934"
}
]
최상위 필드는 다음 의미를 가진다:¶
이 두 예제는 노르웨이 eHealth 시스템에서 사용되는 API에 대한 요구 사항에서 영감을 받았다.¶
이 사용 사례에서 물리치료사는 로컬 Electronic Health Records (EHR) 시스템을 사용하는 컴퓨터 앞에 앉아 있다. 그는 특정 환자의 전자 환자 기록을 보고자 하며, 다른 시스템, 아마도 다른 기관이나 국가 서비스에 있는 환자의 진료 기록 항목도 가져오고자 한다. 이 데이터에 대한 액세스는 API로 제공된다.¶
API에서 요청에 권한을 부여하는 데 필요한 정보는 EHR 시스템만 알고 있으며, API에 제시되어야 한다.¶
첫 번째 예에서 권한 부여 세부 정보 객체는 조직의 식별자를 포함한다. 이 경우 API는 주어진 조직이 민감한 데이터에 대한 액세스를 제공하기 위해 개인 건강 정보를 처리할 법적 근거를 가지고 있는지 알아야 한다.¶
"authorization_details": {
"type": "patient_record",
"requesting_entity": {
"type": "Practitioner",
"identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.4.4",
"value": "1234567"
}],
"practitioner_role": {
"organization": {
"identifier": {
"system": "urn:oid:2.16.578.1.12.4.1.2.101",
"type": "ENH",
"value": "[organizational number]"
}
}
}
}
}
두 번째 예에서 API는 요청에 권한을 부여하기 위해 더 많은 정보를 요구한다. 이 경우 권한 부여 세부 정보 객체는 의료 기관과 요청 시점에 사용자가 가진 현재 직업에 대한 추가 정보를 포함한다. 추가적인 세부 수준은 권한 부여와 데이터 최소화 모두에 사용될 수 있다.¶
[
{
"type": "patient_record",
"location": "https://fhir.example.com/patient",
"actions": [
"read"
],
"patient_identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.4.1",
"value": "12345678901"
}
],
"reason_for_request": "Clinical treatment",
"requesting_entity": {
"type": "Practitioner",
"identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.4.4",
"value": "1234567"
}
],
"practitioner_role": {
"organization": {
"identifier": [
{
"system": "urn:oid:2.16.578.1.12.4.1.2.101",
"type": "ENH",
"value": "<organizational number>"
}
],
"type": {
"coding": [
{
"system":
"http://hl7.example.org/fhir/org-type",
"code": "dept",
"display": "Hospital Department"
}
]
},
"name": "Akuttmottak"
},
"profession": {
"coding": [
{
"system": "http://snomed.example.org/sct",
"code": "36682004",
"display": "Physical therapist"
}
]
}
}
}
}
]
필드 설명:¶
patient_identifier:
reason_for_request:
requesting_entity:
이 사용 사례에서 AS는 환자가 아닌 요청자를 인증하고 정책에 기반하여 액세스를 승인한다.¶
이 명세를 준비하는 동안 귀중한 피드백을 제공해 준 Daniel Fett, Sebastian Ebling, Dave Tonge, Mike Jones, Nat Sakimura, 및 Rob Otto에게 감사한다.¶
또한 이 명세에 귀중한 피드백을 제공해 준 Vladimir Dzhuvinov, Takahiko Kawasaki, Daniel Fett, Dave Tonge, Travis Spencer, Joergen Binningsboe, Aamund Bremer, Steinar Noem, Francis Pouatcha, Jacob Ideskog, Hannes Tschofenig, 및 Aaron Parecki에게도 감사한다.¶