| RFC 9101 | OAuth JAR | 2021年8月 |
| Sakimura, et al. | 標準化過程 | [ページ] |
RFC 6749で説明されているOAuth 2.0の認可リクエストは、 クエリパラメータのシリアライズを利用している。これは、認可リクエストの パラメータがリクエストのURIにエンコードされ、Webブラウザなどのユーザー エージェントを通じて送信されることを意味する。実装は容易である一方で、 a) ユーザーエージェントを介した通信は完全性が保護されず、そのため パラメータが改ざんされる可能性がある、b) 通信元が認証されない、そして c) ユーザーエージェントを介した通信が監視される可能性がある、ということを 意味する。これらの弱点により、このプロトコルに対する複数の攻撃が 現在までに提示されている。¶
本文書は、代わりにリクエストパラメータを JSON Web Token (JWT)で送信する機能を導入する。これにより、リクエストを JSON Web Signature (JWS)で署名し、JSON Web Encryption (JWE)で暗号化できるため、 認可リクエストの完全性、送信元認証、および機密性の 特性が得られる。リクエストは値として、または参照として 送信できる。¶
これはインターネット標準化過程文書である。¶
本文書はInternet Engineering Task Force (IETF)の成果物である。これはIETFコミュニティの合意を表している。本文書は 公開レビューを受け、Internet Engineering Steering Group (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]における認可リクエストは、 クエリパラメータのシリアライズを利用しており、通常はWebブラウザなどの ユーザーエージェントを通じて送信される。¶
例えば、パラメータresponse_type、client_id、state、および
redirect_uriは、リクエストのURIにエンコードされる:¶
実装は容易である一方で、URIへのエンコードでは、 機密性および完全性保護を提供するための アプリケーション層セキュリティを使用できない。 TLSは、クライアントとユーザーエージェントの間、および ユーザーエージェントと認可サーバーの間で通信セキュリティを 提供するために使用されるが、TLSセッションはユーザーエージェントで終端される。 さらに、TLSセッションは何らかのミドルボックス (ロードバランサーなど)で途中終端される可能性がある。¶
その結果、[RFC6749]の認可リクエストには、 次のような欠点がある:¶
こうした本質的な弱点により、リダイレクトURIの書き換えなど、 このプロトコルに対する複数の攻撃が特定されている。¶
アプリケーション層セキュリティの使用は、これらの問題を軽減する。¶
アプリケーション層セキュリティを使用すると、信頼された第三者が リクエストを準備できるため、クライアントアプリケーションは 事前に合意されたものより多くの権限を要求できない。¶
さらに、リクエストを参照として渡すことにより、通信路上のオーバーヘッドを削減できる。¶
JWT [RFC7519]エンコーディングが選択された理由は次のとおりである:¶
パラメータrequestおよびrequest_uriは、
OAuth 2.0 [RFC6749]フローのための
追加の認可リクエストパラメータとして導入される。
requestパラメータは
JSON Web Token (JWT) [RFC7519]であり、そのJWT Claims
SetにはJSONエンコードされたOAuth 2.0認可リクエストパラメータが含まれる。
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 Framework [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によって
参照されるリソースの内容は、同じ認可サーバーからクライアントに
提供されたURIでない限り、リクエスト
オブジェクト(セクション2.1)である。
後者の場合、その内容は認可サーバーの裁量による実装詳細である。
内容がリクエストオブジェクトであることは、request_uriの提供者が
コンシューマとは別のエンティティである場合、例えばクライアントが
クライアントのバックエンドサービスに保存されHTTPS経由でアクセス可能にされた
リクエストオブジェクトを参照するURIを提供する場合に、
相互運用性を確保するためである。後者の場合、すなわち
認可サーバーがURIの提供者でもコンシューマでもある場合、
例えばリクエストオブジェクトと引き換えにURIを提供するエンドポイントを
認可サーバーが提供する場合、この相互運用性の懸念は適用されない。¶
クライアントは、application/x-www-form-urlencoded
形式を用いて、認可エンドポイントURIの
クエリコンポーネントに次のパラメータを
追加することにより、認可リクエストURIを構築する:¶
request_uriが指定されていない限りREQUIRED。
リクエストオブジェクト(セクション2.1)であり、
[RFC6749]のセクション4(OAuth 2.0)で述べられる
認可リクエストパラメータを保持する。
このパラメータが認可リクエストに存在する場合、
request_uriは存在してはならない。¶
requestが指定されていない限りREQUIRED。
RFC 3986 [RFC3986]で定義される絶対URIであり、
[RFC6749]のセクション4(OAuth
2.0)で述べられる認可リクエスト
パラメータを参照するリクエストオブジェクトURI(セクション
2.2)である。
このパラメータが認可リクエストに存在する場合、
requestは存在してはならない。¶
client_id。その値は、
requestまたはrequest_uriの
リクエストオブジェクト(セクション2.1)の
client_idと一致しなければならない。¶
クライアントは、HTTPリダイレクトレスポンスまたは ユーザーエージェントを介して利用可能なその他の手段を用いて、 リソース所有者を構築されたURIに誘導する。¶
例えば、クライアントは、エンドユーザーのユーザーエージェントに 次のHTTPSリクエストを行わせる:¶
requestパラメータの値は、簡潔にするため省略されている。¶
認可リクエストオブジェクトは、次のいずれかでなければならない:¶
クライアントは、後方互換性などのために、 リクエストオブジェクトに含まれるパラメータを クエリパラメータにも重複して送信してもよい。 ただし、この仕様をサポートする認可サーバーは、 リクエストオブジェクトに含まれるパラメータのみを使用しなければならない。¶
クライアントは、認可リクエストを
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文字を超えるべきではない。 この制限には2つの理由がある:¶
request_uriによって参照されるリソースの内容は、
そのURIが認可サーバーからクライアントに提供されたものでない限り、
リクエストオブジェクトでなければならず、かつ認可サーバーから
到達可能でなければならない。
前者の場合、request_uriは
[RFC7230]のセクション2.7.2で規定される
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に、
リクエストオブジェクトリソースをローカルまたはリモートに保存する。
そのような機能は、認可サーバーまたは
信頼された第三者によって提供されてもよい。例えば、認可サーバーは
クライアントがリクエストオブジェクトをPOSTし、
リクエストURIを取得するURLを提供してもよい。
このURIがリクエストオブジェクトURI、すなわちrequest_uriである。¶
リクエストオブジェクトに、認可サーバーにだけ
開示されるべき値が含まれる可能性がある。
そのため、request_uriは
公開取得可能であっても推測されないように、その有効期間に応じた
適切なエントロピーを持たなければならない。
指針については、
[RFC6819]のセクション5.1.4.2.2および
「Capability URLのための優良実践」[CapURLs]を参照すること。
アクセス制御手段が講じられていない限り、
request_uriは妥当なタイムアウト後に
削除することがRECOMMENDEDである。¶
次は、 リクエストオブジェクトURI値の例である (値内の改行は表示目的のみ)。 この例では、信頼された第三者サービスがリクエストオブジェクトをホストしている。¶
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 Web Encryption [RFC7516] 仕様に従ってJWTを復号しなければならない。¶
その結果は、署名付きリクエストオブジェクトである。¶
復号に失敗した場合、認可サーバーは認可リクエストへの
応答として、invalid_request_objectエラーを
クライアントに返さなければならない。¶
認可サーバーは、JWS署名付き[RFC7515]
リクエストオブジェクトの署名を検証しなければならない。
kidヘッダーパラメータが存在する場合、識別された鍵は
使用される鍵でなければならず、かつクライアントに関連付けられた
鍵でなければならない。署名は、クライアントに関連付けられた鍵と
algヘッダーパラメータで指定されたアルゴリズムを使用して
検証されなければならない。アルゴリズム検証は、
[RFC8725]のセクション3.1および3.2で
規定されるように実行されなければならない。¶
鍵がクライアントに関連付けられていない場合、または署名検証に
失敗した場合、認可サーバーは認可リクエストへの応答として
invalid_request_objectエラーをクライアントに返さなければならない。¶
認可サーバーは、リクエストオブジェクト値から
認可リクエストパラメータの集合を抽出しなければならない。
認可サーバーは、同じパラメータがクエリパラメータで
提供されている場合でも、リクエストオブジェクト内の
パラメータのみを使用しなければならない。
client_idリクエストパラメータ内のクライアントID値と
リクエストオブジェクトのclient_id claim内のクライアントID値は
同一でなければならない。
その後、認可サーバーはOAuth 2.0 [RFC6749]で規定されるように
リクエストを検証する。¶
クライアントIDの確認またはリクエスト検証に失敗した場合、 認可サーバーは、[RFC6749]のセクション 5.2(OAuth 2.0)で規定されるように、 認可リクエストへの応答としてクライアントにエラーを返さなければならない。¶
認可サーバーのレスポンスは、 [RFC6749]のセクション4(OAuth 2.0)と同様に 作成され、クライアントに送信される。¶
さらに、本文書では次の追加エラー値を使用する:¶
request_uriが
エラーを返すか、無効なデータを含んでいる。¶
requestパラメータの
使用をサポートしていない。¶
request_uriパラメータの
使用をサポートしていない。¶
リクエストオブジェクトURI方式をサポートするクライアント実装は、 "Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)" [RFC7525]に従って、 TLSをサポートしなければならない。¶
情報漏えいおよび改ざんから保護するため、 機密性保護は、機密性および完全性保護を提供する 暗号スイートを備えたTLSを使用して適用されなければならない。¶
HTTPクライアントは、中間者攻撃を避けるため、 DNS-ID [RFC6125]を使用して TLSサーバー証明書も検証しなければならない。 [RFC6125]で定義される 規則および指針は、次の考慮事項とともにここに適用される:¶
*を含んでもよい。¶
リクエストオブジェクトはJWTであるため、コアJWT claimsは、 JWTが規定する目的以外でリクエストオブジェクト内に使用できない。 したがって、将来のOAuth拡張がそれらを異なる意味で 使用することを避けるため、OAuth認可リクエストパラメータとして 登録されている。¶
この仕様は、[RFC6749]により 確立された"OAuth Parameters"レジストリ [IANA.OAuth.Parameters]に、次の値を追加する。¶
この仕様は、[RFC8414]により確立された"OAuth Authorization Server Metadata"レジストリ [IANA.OAuth.Parameters]に、次の値を追加する。¶
この仕様は、[RFC7591]により確立された"OAuth Dynamic Client Registration Metadata"レジストリ [IANA.OAuth.Parameters]に、次の値を追加する。¶
このセクションは、
application/oauth-authz-req+jwt
メディアタイプ[RFC2046]を、
[RFC6838]で説明される方法により、
"Media Types"レジストリ
[IANA.MediaTypes]に登録する。
これは、内容がリクエストオブジェクトclaimsを含むJWTであることを
示すために使用できる。¶
.)文字で区切られた
一連のbase64urlエンコード値(その一部は空文字列の場合がある)として
エンコードされる。¶
OAuth 2.0で論じられている セキュリティに関するすべての考慮事項 [RFC6819]に加え、 [RFC7515]、[RFC7516]、 [RFC7518]、および[RFC8725]のセキュリティに関する考慮事項を 考慮する必要がある。また、[BASIN]など、OAuthのようなプロトコルの セキュリティ特性に関して有用な洞察を提供する学術論文もいくつかある。¶
上記を考慮し、本文書は次のセキュリティに関する考慮事項を 考慮に入れることを助言する。¶
認可リクエストオブジェクトを
requestパラメータを通じて送信する場合、その時点で
適切と考えられるアルゴリズムを用いて、
JWS [RFC7515]で署名されているか、
またはJWS [RFC7515]および
JWE [RFC7516]をそれぞれ使用して
署名された後に暗号化されていなければならない。¶
認可リクエストの送信元は常に検証されなければならない。 それを行う方法はいくつかある:¶
この仕様はそれらを要求しないが、 [BASIN]などの研究は、 起動者の意図が曖昧でないように、意図された相互作用エンドポイントと シーケンス内のメッセージ位置を、改ざんが検出可能な方法で 明示的に示すことが優良実践であると指摘している。 この仕様は、[RFC6749]、[RFC6750]、および[RFC8414]で定義される次のエンドポイントに対して、 この実践を使用することをRECOMMENDEDする:¶
protected_resources)¶
authorization_endpoint)¶
redirect_uri)¶
token_endpoint)¶
さらに、動的ディスカバリが使用される場合、この実践は ディスカバリ関連のエンドポイントにも適用される。¶
[RFC6749]では、 リダイレクトURIは認可リクエストに含まれるが、その他は 含まれない。その結果、同じことが認可リクエストオブジェクトにも 適用される。¶
request_uriの導入は、
いくつかの攻撃の可能性を導入する。
URIに関連するリスクの詳細については、
[RFC3986]のセクション7の
セキュリティに関する考慮事項を参照すること。¶
悪意のあるクライアント群は、
request_uriに、極めて大きなコンテンツを返すURI、
または応答が極めて遅い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の値は署名されないため、
man-in-the-browser攻撃者によって改ざんされ得る。
このため、いくつかの攻撃の可能性が生じる。例えば、
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という名前で、
値はいずれもブール値である。¶
クライアントメタデータとしてのその値がtrueである場合、
サーバーは、この仕様に準拠しないクライアントからの
認可リクエストを拒否しなければならない。また、
このサーバーメタデータ値がtrueであるときに
リクエストオブジェクトがnoneのalg値を
使用する場合も、リクエストを拒否しなければならない。
省略された場合、デフォルト値はfalseである。¶
サーバーメタデータとしてのその値がtrueである場合、
サーバーは、この仕様に準拠しない任意のクライアントからの
認可リクエストを拒否しなければならない。また、
リクエストオブジェクトがnoneのalg値を
使用する場合も、リクエストを拒否しなければならない。
省略された場合、デフォルト値はfalseである。¶
require_signed_request_objectメタデータ値が
存在しない場合でも、クライアントとサーバーが相互にサポートする
署名アルゴリズムがあれば、クライアントは署名付きリクエストオブジェクトを
使用してもよいことに注意すること。
署名アルゴリズムメタデータの使用については、
セクション4で説明されている。¶
現在のセキュリティに関する考慮事項は、 「Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)」 [RFC7525]に記載されている。これは OAuth 2.0 [RFC6749]における TLSバージョンの推奨事項を置き換える。¶
OAuthパラメータ値が、通常のOAuthパラメータとして、また
リクエストオブジェクトclaimsとして、2つの異なる場所で送信されることを
考えると、実装は、不一致のパラメータ値を利用して意図しない結果を
得ようとする攻撃から保護しなければならない。
これが、2つのクライアントID値が一致しなければならない理由であり、
リクエストオブジェクトからのパラメータ値のみを使用する理由であり、
requestもrequest_uriも
リクエストオブジェクト内に現れてはならない理由である。¶
[RFC8725]のセクション2.8で説明されるように、 攻撃者は、ある目的のために発行されたJWTを、それが意図されていない コンテキストで使用しようと試みる可能性がある。 これらの攻撃に対して説明されている緩和策は、リクエストオブジェクトにも 適用できる。¶
攻撃者がリクエストオブジェクトを別用途に転用しようとする一つの方法は、
[RFC7523]のセクション2.2で説明されるように、
それをクライアント認証JWTとして使用しようとすることである。
これを防ぐ簡単な方法は、リクエストオブジェクト内のsub値として
クライアントIDを決して使用しないことである。¶
Cross-JWT混同を防ぐもう一つの方法は、
[RFC8725]のセクション3.11で説明されるように、
明示的な型付けを使用することである。
リクエストオブジェクトは、値
oauth-authz-req+jwt
(セクション9.4.1で登録されている)を持つ
typヘッダーパラメータを含めることで明示的に型付けできる。
ただし、既存の認可サーバーで明示的に型付けされたリクエストオブジェクトを
要求すると、既存のクライアントは、特にOpenID Connect
[OpenID.Core]で、すでに型付けされていない
リクエストオブジェクトを一般的に使用しているため、ほとんどの既存の
デプロイメントを破壊することに注意すること。
しかし、既存のデプロイメントとの互換性を考慮しない新しいOAuth
デプロイメントプロファイルでは、明示的な型付けを要求することは
良い考えである。¶
最後に、Cross-JWT混同を防ぐさらに別の方法は、 リクエストオブジェクトの署名に使用される鍵が、他の目的に使用される 鍵と識別可能な形で区別される鍵管理体制を使用することである。 そうすれば、敵対者がリクエストオブジェクトを別のコンテキストで 転用しようとした場合、鍵の不一致が発生し、攻撃を阻止できる。¶
クライアントが、個人データを含む保護されたリソースへのアクセスを 許可される場合、クライアントと認可サーバーの両方は プライバシー原則を遵守する必要がある。 「Privacy Considerations for Internet Protocols」 [RFC6973]は、 プロトコル設計および実装の改善について優れた指針を 提供している。そこに列挙されている規定に従うべきである。¶
ほとんどの規定は、 「The OAuth 2.0 Authorization Framework」[RFC6749]および 「The OAuth 2.0 Authorization Framework: Bearer Token Usage」 [RFC6750]に 適用されるものであり、この仕様に固有のものではない。 以下では、この仕様に固有の規定のみを記す。¶
クライアントが、個人データを含む保護されたリソースへのアクセスを 許可される場合、クライアントは、適用法の範囲内で、かつ 指定された目的のために厳密に必要なものに個人データの 収集を制限するべきである。¶
要求された個人データが厳密に必要かどうかをユーザーが判断することは しばしば難しい。信頼された第三者サービスは、クライアントリクエストを 検査し、それをクライアントによる提案された処理と比較し、 リクエストを認証することによってユーザーを支援できる。 認証後、クライアントは認可リクエストを行う際に、 信頼された第三者サービスに認可リクエストを送信して リクエストオブジェクトURIを取得できる。このプロセスには2つのステップがある:¶
request_uriを取得するためにリクエストオブジェクトを
信頼された第三者サービスへプッシュする際に認証するための
クライアント資格情報が発行される。¶
request_uriを取得する。
信頼された第三者サービスはまた、前のステップに従い、
リクエストオブジェクトがクライアントに許可されているclaimsと
一貫していることを検証する。¶
認可リクエストでそのようなリクエストオブジェクトURIを受信すると、
認可サーバーはまず、リクエストオブジェクトURIのauthority部分が
信頼された第三者サービスにとって正当なものであることを検証する。
次に、認可サーバーはリクエストオブジェクトURIへHTTP GETリクエストを
発行する。接続時、認可サーバーは、TLS証明書で表される
サーバーIDがリクエストオブジェクトURIにとって正当であることを
検証しなければならない。その後、認可サーバーは
クライアントを表すclient_idを含む
リクエストオブジェクトを取得できる。¶
同意画面はクライアントを示さなければならず、 収集制限原則の遵守について、そのリクエストが 信頼された第三者サービスによって審査済みであることを 示すべきである。¶
この仕様は拡張パラメータを許可する。 これらは潜在的に機微な情報を含む場合がある。 URIクエリパラメータはさまざまな手段で漏えいする可能性があり、 特にreferrerおよびブラウザ履歴を通じて漏えいし得るため、 認可リクエストが潜在的に機微なパラメータを含む場合、 クライアントはJWE [RFC7516]を使用して リクエストオブジェクトを暗号化するべきである。¶
リクエストオブジェクトURI方式が使用されている場合で、
リクエストオブジェクトが個人を識別可能な情報または
機微な情報を含むとき、リクエストオブジェクト自体が
JWE
[RFC7516]を使用して
暗号化されていない限り、request_uriは一度だけ使用され、
短い有効期間を持つべきであり、かつ適用されるセキュリティポリシーに対して
十分なエントロピーを持たなければならない。
リクエストオブジェクトURIの有効性の適切な短さと
エントロピーは、保護されるリソースの価値に基づく
リスク計算に依存する。有効期間の一般的な指針は
1分未満であり、リクエストオブジェクトURIには、この仕様の
執筆時点で128ビット以上の暗号学的ランダム値を含めるべきである。¶
保護されたリソースが個人を識別可能な情報を含まない場合でも、 ユーザーごとの永続的な静的リクエストオブジェクトURIが 使用されると、そのリクエストオブジェクトURIを通じてユーザーを 識別できる場合がある。第三者は、ブラウザ履歴などを通じて それを観察し、それを用いてユーザーの活動を相関付け始める可能性がある。 ある意味で、これもデータ開示であり、 避けるべきである。¶
したがって、ユーザーごとの永続的なリクエストオブジェクトURIは 避けるべきである。使い捨てのリクエストオブジェクトURIは 代替手段の一つである。¶
次の人々は、OAuth Working Groupおよびその他の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), and 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), and Justin Richer (MITRE).¶