| 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) で暗号化できるため、 認可リクエストの完全性、送信元認証、および機密性の 特性が実現されます。リクエストは 値によって、または参照によって送信できます。¶
これはインターネット標準化過程の文書です。¶
本文書はインターネット技術タスクフォース (IETF) の成果物です。これは IETF コミュニティの総意を表しています。本文書は 公開レビューを受け、インターネット技術運営グループ (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 パラメーターは、
JWT Claims
Set に JSON エンコードされた OAuth 2.0 認可リクエストパラメーターを保持する JSON Web Token
(JWT) [RFC7519] です。
RFC 7519 とは異なり、Claims Set の要素は
エンコードされた OAuth リクエストパラメーター [IANA.OAuth.Parameters] であり、
IANA が管理する JSON Web Token Claim
[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 フレームワーク [RFC6749]、 JSON Web Signature [RFC7515]、および JSON Web Encryption [RFC7516] で定義されているものに加え、次の用語および 定義が適用されます。¶
リクエストオブジェクトとは、JWT Claims Set に JSON エンコードされた OAuth 2.0 認可リクエスト パラメーターを保持する JSON Web Token (JWT) [RFC7519] です。¶
リクエストオブジェクト URI は、OAuth 2.0 認可リクエストを構成する
パラメーターの集合を参照する絶対 URI です。URI が参照する
リソースの内容は リクエスト
オブジェクト (第2.1節) です。ただし、
URI が同じ認可サーバーからクライアントに
提供された場合は、内容は認可サーバーの裁量による
実装の詳細です。内容をリクエストオブジェクトとするのは、
request_uri の提供者と利用者が別の
エンティティである場合の相互運用性を確保するためです。たとえば、クライアントが
HTTPS を介してアクセス可能にしたクライアントのバックエンドサービス上に保存された
リクエストオブジェクトを参照する URI を提供する場合などです。後者の、
認可サーバーが URI の提供者と利用者を兼ねる場合、たとえば
リクエストオブジェクトと引き換えに URI を提供する
エンドポイントを提供する場合には、この相互運用性上の懸念は当てはまりません。¶
クライアントは、
application/x-www-form-urlencoded 形式を使用して
認可エンドポイント URI のクエリコンポーネントに
次のパラメーターを追加することにより、認可リクエスト URI を構築します:¶
request_uri が指定されていない限り
REQUIRED です。
第4節 of [RFC6749] (OAuth 2.0) に記載された
認可リクエストパラメーターを保持する リクエストオブジェクト (第2.1節)。
このパラメーターが認可リクエストに存在する場合、
request_uri は存在しては MUST NOT なりません。¶
request が指定されていない限り
REQUIRED です。RFC 3986 [RFC3986] で定義されている絶対 URI であり、
第4節 of [RFC6749] (OAuth
2.0) に記載された認可リクエスト
パラメーターを参照する リクエストオブジェクト URI (第
2.2節) です。
このパラメーターが認可リクエストに存在する場合、
request は存在しては MUST NOT なりません。¶
client_id です。この値は、
request または request_uri の
リクエストオブジェクト (第2.1節) の
client_id と一致しなければ MUST なりません。¶
クライアントは、HTTP リダイレクトレスポンス、または ユーザーエージェントを介して利用可能なその他の手段を使用して、 リソース所有者を構築した URI に誘導します。¶
たとえば、クライアントはエンドユーザーのユーザーエージェントに 次の HTTPS リクエストを行わせます:¶
簡潔にするため、request パラメーターの値は 省略されています。¶
認可リクエストオブジェクトは次のいずれかでなければ MUST なりません:¶
クライアントは、後方互換性などのため、 リクエストオブジェクトに含まれるパラメーターを クエリパラメーターにも重複して MAY 送信できます。 ただし、本仕様をサポートする認可サーバーは、 リクエストオブジェクトに含まれるパラメーターのみを使用しなければ MUST なりません。¶
クライアントは、認可リクエストを
リクエストオブジェクトとして認可エンドポイントに
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 認可リクエストを値ではなく参照によって渡すことができます。
このパラメーターは request パラメーターと同様に使用されますが、
リクエストオブジェクト値は値として渡されるのではなく、
指定された URI で識別されるリソースから取得されます。¶
リクエスト URI 全体は 512 ASCII 文字を超えるべきでは SHOULD NOT ありません。 この制限には2つの理由があります:¶
request_uri が参照するリソースの内容は、
URI が認可サーバーからクライアントに提供された場合を除き、
リクエストオブジェクトで MUST なければならず、認可サーバーから到達可能で
MUST なければなりません。
前者の場合、request_uri は、
第2.7.2節
of [RFC7230] で規定されている
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¶
クライアントは、認可サーバーがアクセスできる URI に、
リクエストオブジェクトリソースをローカルまたはリモートで保存します。
このような機能は、認可サーバーまたは信頼できる第三者によって
提供される場合があります。たとえば、認可サーバーは、
クライアントがリクエストオブジェクトを POST し、
リクエスト URI を取得できる URL を提供できます。
この URI がリクエストオブジェクト URI、request_uri です。¶
リクエストオブジェクトには、認可サーバーにのみ
開示されるべき値を含めることができます。
そのため、request_uri は、公開で取得可能な場合に
URI を推測できないよう、その有効期間に対して適切な
エントロピーを MUST 持たなければなりません。
指針については、
第5.1.4.2.2節 of [RFC6819] および
"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 を復号しなければ MUST なりません。¶
結果は署名されたリクエストオブジェクトです。¶
復号に失敗した場合、認可サーバーは
認可リクエストへの応答として、invalid_request_object エラーを
クライアントに返さなければ MUST なりません。¶
認可サーバーは、JWS 署名された [RFC7515] リクエスト
オブジェクトの署名を検証しなければ MUST なりません。
kid ヘッダーパラメーターが存在する場合、識別された鍵を
使用しなければ MUST ならず、その鍵はクライアントに関連付けられた
鍵で MUST なければなりません。署名は、
クライアントに関連付けられた鍵と、alg ヘッダーパラメーターで
指定されたアルゴリズムを使用して検証しなければ MUST なりません。
アルゴリズム検証は、[RFC8725] の
第3.1節 および 第3.2節 で
規定されているとおり実行しなければ MUST なりません。¶
鍵がクライアントに関連付けられていない場合、または署名の
検証に失敗した場合、認可サーバーは認可リクエストへの応答として
invalid_request_object エラーをクライアントに返さなければ
MUST なりません。¶
認可サーバーは、リクエストオブジェクト値から
認可リクエストパラメーターの集合を抽出しなければ
MUST なりません。
同じパラメーターがクエリパラメーターとして提供されている場合でも、
認可サーバーはリクエストオブジェクト内の
パラメーターのみを使用しなければ MUST なりません。
client_id リクエストパラメーターと
リクエストオブジェクトの client_id Claim 内のクライアント ID 値は
同一でなければ MUST なりません。
その後、認可サーバーは、
OAuth 2.0 [RFC6749] で規定されているとおり、リクエストを検証します。¶
クライアント ID の確認またはリクエストの検証に失敗した場合、 認可サーバーは、第 5.2節 of [RFC6749] (OAuth 2.0) で規定されているとおり、 認可リクエストへの応答としてクライアントにエラーを返さなければ MUST なりません。¶
認可サーバーのレスポンスは、 第4節 of [RFC6749] (OAuth 2.0) と同様に作成され、クライアントへ送信されます。¶
さらに、本文書では次の追加エラー値を使用します:¶
request_uri が
エラーを返すか、無効なデータを含んでいます。¶
request パラメーターの使用をサポートしていません。¶
request_uri パラメーターの使用をサポートしていません。¶
リクエストオブジェクト URI 方式をサポートするクライアント実装は、 「Transport Layer Security (TLS) および Datagram Transport Layer Security (DTLS) の 安全な使用に関する推奨事項」 [RFC7525] に従って、TLS をサポートしなければ MUST なりません。¶
情報漏えいおよび改ざんから保護するため、 機密性と完全性を保護する暗号スイートを備えた TLS を使用して、 機密性保護を適用しなければ MUST なりません。¶
HTTP クライアントは、中間者攻撃を回避するため、 DNS-ID [RFC6125] を使用して TLS サーバー証明書も検証しなければ MUST なりません。 [RFC6125] で定義されている規則および指針が、 次の考慮事項とともにここにも適用されます:¶
* を MAY 含めることができます。¶
リクエストオブジェクトは JWT であるため、JWT のコア Claim を、 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] に
登録します。これは、内容がリクエストオブジェクト Claim を含む
JWT であることを示すために使用できます。¶
.) 文字で区切られた
一連の base64url エンコードされた値(一部は
空文字列の場合があります)としてエンコードされます。¶
OAuth 2.0 で説明されているすべてのセキュリティ上の 考慮事項 [RFC6819] に加えて、 [RFC7515]、[RFC7516]、 [RFC7518]、および [RFC8725] のセキュリティ上の 考慮事項も考慮する必要があります。また、[BASIN] など、OAuth のようなプロトコルの セキュリティ特性に関して有用な洞察を提供する学術論文もいくつかあります。¶
上記を考慮し、本文書では次の セキュリティ上の考慮事項を考慮することを推奨します。¶
認可リクエストオブジェクトを
request パラメーターを介して送信する場合、これは
その時点で適切と考えられるアルゴリズムを使用して、
JWS [RFC7515] で署名するか、
JWS [RFC7515] で署名した後、
JWE [RFC7516] で暗号化するかのいずれかでなければ
MUST なりません。¶
認可リクエストの送信元は常に検証しなければ MUST なりません。これにはいくつかの方法があります:¶
本仕様では必須としていませんが、 [BASIN] などの研究では、 開始者の意図が曖昧にならないように、 意図する対話エンドポイントとシーケンス内の メッセージ位置を改ざん検知可能な方法で 明示することが良い実践であると指摘されています。本仕様では、 [RFC6749]、[RFC6750]、および [RFC8414] で定義された次のエンドポイントに対して、 この実践を使用することが RECOMMENDED されます:¶
protected_resources)¶
authorization_endpoint)¶
redirect_uri)¶
token_endpoint)¶
さらに、動的ディスカバリーを使用する場合、この実践は ディスカバリー関連のエンドポイントにも適用されます。¶
[RFC6749] では、 リダイレクト URI は認可リクエストに含まれますが、その他は 含まれません。その結果、同じことが認可 リクエストオブジェクトにも当てはまります。¶
request_uri の導入により、
いくつかの攻撃の可能性が生じます。
URI に関連するリスクの詳細については、
第7節 of
[RFC3986] のセキュリティに関する考慮事項を
参照してください。¶
悪意のある複数のクライアントは、
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 を実行しないようにするべきです。¶
request_uri の値は署名されていません。
そのため、man-in-the-browser 攻撃者によって改ざんされる可能性があります。
これにより、いくつかの攻撃の可能性が生じます。たとえば、
a) 攻撃者が書き換えられた URI の参照先となる別のファイルを
作成し、追加のスコープを要求できるようにすることや、
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 の場合、
サーバーは本仕様に準拠しないそのクライアントからの
認可リクエストを拒否しなければ MUST なりません。
また、このサーバーメタデータ値が true の場合に
リクエストオブジェクトが none の alg 値を
使用している場合も、リクエストを拒否しなければ
MUST なりません。省略した場合、デフォルト値は
false です。¶
サーバーメタデータとしての値が true の場合、
サーバーは本仕様に準拠しない任意のクライアントからの
認可リクエストを拒否しなければ MUST なりません。
また、リクエストオブジェクトが none の alg 値を
使用している場合も、リクエストを拒否しなければ
MUST なりません。省略した場合、
デフォルト値は false です。¶
require_signed_request_object メタデータ値が
存在しない場合でも、クライアントとサーバーが相互にサポートする
署名アルゴリズムがあることを条件として、クライアントは署名された
リクエストオブジェクトを MAY 使用できることに注意してください。
署名アルゴリズムメタデータの使用については、
第4節で説明されています。¶
現在のセキュリティ上の 考慮事項は、「Transport Layer Security (TLS) および Datagram Transport Layer Security (DTLS) の安全な使用に関する推奨事項」 [RFC7525] に記載されています。これは、 OAuth 2.0 [RFC6749] の TLS バージョンに関する推奨事項に 優先します。¶
OAuth パラメーター値が通常の OAuth パラメーターと
リクエストオブジェクト Claim という2つの異なる場所で送信されるため、
実装は、不一致のパラメーター値を利用して
意図しない結果を得ようとする攻撃を防がなければなりません。
これが、2つのクライアント ID 値が一致しなければ
MUST ならない理由、
リクエストオブジェクト内のパラメーター値だけを使用する理由、
および request と request_uri のいずれも
リクエストオブジェクト内に出現できない理由です。¶
第2.8節 of [RFC8725] で説明されているように、 攻撃者は、ある目的のために発行された JWT を、その JWT が意図されていない コンテキストで使用しようとする場合があります。 これらの攻撃について説明されている緩和策は、リクエストオブジェクトにも適用できます。¶
攻撃者がリクエストオブジェクトを別用途に転用しようとする方法の1つは、
第2.2節 of
[RFC7523] で説明されているように、
クライアント認証 JWT として使用しようとすることです。
これを防ぐ簡単な方法は、リクエストオブジェクト内の
sub 値としてクライアント ID を決して使用しないことです。¶
JWT 間の混同を防ぐ別の方法は、
第3.11節 of
[RFC8725] で説明されている
明示的な型付けを使用することです。
値 oauth-authz-req+jwt を持つ
typ ヘッダーパラメーターを含めることで、
リクエストオブジェクトを明示的に型付けできます
(これは 第9.4.1節で登録されています)。
ただし、既存の認可サーバーで明示的に型付けされたリクエストオブジェクトを
必須にすると、既存のクライアントはすでに型付けされていないリクエストオブジェクトを
一般的に使用しているため、ほとんどの既存デプロイメントが破損することに
注意してください。特に OpenID Connect [OpenID.Core]
ではその傾向があります。
しかし、既存デプロイメントとの互換性を考慮する必要がない
新しい OAuth デプロイメントプロファイルでは、明示的な型付けを
必須にすることは良い考えです。¶
最後に、JWT 間の混同を防ぐさらに別の方法は、 リクエストオブジェクトの署名に使用する鍵を、 他の目的に使用される鍵と識別可能な形で明確に区別する 鍵管理方式を使用することです。そうすれば、攻撃者が リクエストオブジェクトを別のコンテキストで転用しようとした場合、 鍵の不一致が発生し、攻撃を阻止できます。¶
クライアントが個人データを含む保護対象リソースへの アクセスを許可される場合、クライアントと 認可サーバーの両方がプライバシー原則を 遵守する必要があります。 「インターネットプロトコルに関するプライバシー上の考慮事項」 [RFC6973] は、 プロトコルの設計および実装の改善について 優れた指針を提供しています。 そこに列挙されている規定に従うべきです。¶
ほとんどの規定は、 「OAuth 2.0 認可フレームワーク」 [RFC6749] および「OAuth 2.0 認可フレームワーク:Bearer Token の使用」 [RFC6750] に適用されるものであり、本仕様に固有のものではありません。 以下では、本仕様に固有の規定のみを 記載します。¶
クライアントが個人データを含む保護対象リソースへのアクセスを 許可される場合、クライアントは個人データの収集を、 適用される法令の範囲内で、指定された目的に 厳密に必要なものに制限するべきです。¶
要求された個人データが厳密に必要かどうかを ユーザーが判断するのは、多くの場合困難です。信頼できる第三者サービスは、 クライアントのリクエストを調査し、それをクライアントが提案する 処理と比較し、リクエストを認証することで ユーザーを支援できます。認証後、クライアントは認可リクエストを行う際、 信頼できる第三者サービスに認可リクエストを送信して リクエストオブジェクト URI を取得できます。この処理には2つのステップがあります:¶
request_uri を取得するための
クライアント資格情報が発行されます。¶
request_uri を取得します。信頼できる第三者サービスは、
前のステップに従って、リクエストオブジェクトがクライアントに
認められている Claim と一致していることも検証します。¶
認可リクエスト内でこのようなリクエストオブジェクト URI を受信すると、
認可サーバーはまず、リクエストオブジェクト URI の authority 部分が
信頼できる第三者サービスに対して正当なものであることを検証します。
次に、認可サーバーはリクエストオブジェクト URI に HTTP GET リクエストを
発行します。接続すると、認可サーバーは、
TLS 証明書で表されるサーバー ID がリクエストオブジェクト URI に対して
正当であることを検証しなければ MUST なりません。その後、
認可サーバーは、クライアントを表す client_id を含む
リクエストオブジェクトを取得できます。¶
同意画面はクライアントを示さなければ MUST ならず、 また、収集制限の原則への準拠について、リクエストが信頼できる 第三者サービスによって審査済みであることを示すべきです SHOULD。¶
本仕様では拡張パラメーターを使用できます。 これらには機密性の高い可能性がある情報が含まれる場合があります。 URI クエリパラメーターはさまざまな方法で、 特にリファラーおよびブラウザー履歴を通じて漏えいする可能性があるため、 認可リクエストに機密性の高い可能性があるパラメーターが 含まれる場合、クライアントは JWE [RFC7516] を使用して リクエストオブジェクトを暗号化するべきです。¶
リクエストオブジェクト URI 方式を使用している場合、
リクエストオブジェクトに個人を特定できる情報または機密情報が
含まれている場合、リクエストオブジェクト自体が
JWE
[RFC7516] を使用して暗号化されていない限り、
request_uri は一度だけ使用し、
有効期間を短くするべきであり、適用されるセキュリティポリシーに対して
十分なエントロピーを持たなければ MUST なりません。
適切な有効期間の短さおよびリクエストオブジェクト URI のエントロピーは、
保護されるリソースの価値に基づく
リスク計算によって決まります。一般的な指針として、
本仕様の執筆時点では、有効期間は1分未満とし、
リクエストオブジェクト URI には
128 ビット以上の暗号学的乱数値を含めることが推奨されます。¶
保護対象リソースに個人を特定できる情報が 含まれていない場合でも、ユーザーごとに永続的かつ固定された リクエストオブジェクト URI を使用すると、 リクエストオブジェクト URI を通じてユーザーを特定できる場合があります。 第三者はブラウザー履歴などを介してそれを観察し、 それを使用してユーザーの活動を関連付け始める可能性があります。 ある意味では、これもデータ開示であり、 回避するべきです。¶
したがって、ユーザーごとの永続的なリクエストオブジェクト URI は避けるべきです。 一度限りのリクエストオブジェクト URI は代替手段の1つです。¶
以下の人々は、OAuth ワーキンググループおよびその他の IETF の役割において、 本文書の作成に貢献しました。 (所属は貢献時点のものです。)¶
Annabelle Backman (Amazon), Dirk Balfanz (Google), Sergey Beryozkin, Ben Campbell (AD として), Brian Campbell (Ping Identity), Roman Danyliw (AD として), Martin Duke (AD として), Vladimir Dzhuvinov (Connect2id), Lars Eggert (AD として), Joel Halpern (GENART として), Benjamin Kaduk (AD として), Stephen Kent (SECDIR として), Murray Kucherawy (AD として), Warren Kumari (OPSDIR として), Watson Ladd (SECDIR として), Torsten Lodderstedt (yes.com), Jim Manico, James H. Manger (Telstra), Kathleen Moriarty (AD として), Axel Nennker (Deutsche Telecom), John Panzer (Google), Francesca Palombini (AD として), David Recordon (Facebook), Marius Scurtescu (Google), Luke Shepard (Facebook), Filip Skokan (Auth0), Hannes Tschofenig (ARM), Éric Vyncke (AD として), および Robert Wilton (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)。¶