| インターネットドラフト | OAuth 2.1 認可フレームワーク | 2026年9月 |
| Hardt ほか | 2027年3月7日失効 | [ページ] |
OAuth 2.1 認可フレームワークにより、 アプリケーションは、リソース所有者と認可サービスの間の承認のやり取りを調整して リソース所有者に代わって、または アプリケーション自身に代わってアクセスを取得できるようにすることで、保護されたリソースへの限定的なアクセスを取得できます。この 仕様は、RFC 6749 で説明されている OAuth 2.0 認可 フレームワークおよび RFC 6750 の Bearer トークンの使用を置き換え、廃止します。¶
この注記は、RFC として公開する前に削除されます。¶
この文書についての議論は、 OAuth 作業部会メーリングリスト (oauth@ietf.org) で行われ、 そのアーカイブは https://mailarchive.ietf.org/arch/browse/oauth/ にあります。¶
このドラフトのソースおよび課題トラッカーは https://github.com/oauth-wg/oauth-v2-1 にあります。¶
このインターネットドラフトは、 BCP 78 および BCP 79 の規定に完全に準拠して提出されています。¶
インターネットドラフトは、Internet Engineering Task Force (IETF) の作業文書です。他のグループも作業 文書をインターネットドラフトとして配布する場合があることに注意してください。現在のインターネットドラフトの一覧は https://datatracker.ietf.org/drafts/current/ にあります。¶
インターネットドラフトは、最長6か月間有効なドラフト文書であり、 いつでも他の文書によって更新、置換、または廃止されることが あります。インターネットドラフトを参考 資料として使用したり、「作業中」以外のものとして引用したりすることは適切ではありません。¶
このインターネットドラフトは、2027年3月7日に失効します。¶
Copyright (c) 2026 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 は、クライアントの役割をリソース 所有者の役割から分離することにより、クライアント・サーバー認証モデルに認可レイヤーを導入します。 OAuth では、クライアントはリソース所有者によって制御され、 リソースサーバーによってホストされているリソースへのアクセスを要求します。 保護されたリソースにアクセスするためにリソース所有者のクレデンシャルを使用する代わりに、 クライアントはアクセストークン、すなわちスコープや有効期間などの 特定のアクセス属性の集合を表すクレデンシャルを取得します。アクセス トークンは、リソース所有者の承認を得て認可サーバーからクライアントに発行されます。 クライアントはアクセストークンを使用して、リソースサーバーによってホストされている 保護されたリソースにアクセスします。¶
従来の、より限定的なクライアント・サーバー認証モデルでは、クライアントは リソース所有者のクレデンシャルを使用してサーバーに認証することにより、 サーバー上のアクセス制限されたリソース(保護されたリソース)を 要求します。アプリケーションに制限されたリソースへのアクセスを提供するため、 リソース所有者は自身のクレデンシャルを アプリケーションと共有します。これにより、いくつかの問題と制限が生じます。¶
アプリケーションは、将来使用するためにリソース 所有者のクレデンシャル(通常は平文の パスワード)を保存する必要があります。¶
サーバーは、パスワードに固有の セキュリティ上の弱点があるにもかかわらず、パスワード認証をサポートする必要があります。¶
アプリケーションは、リソース 所有者の保護されたリソースに対して過度に広範なアクセスを取得し、リソース所有者には 期間を制限したり、リソースの限定された一部へのアクセスに 制限したりする手段がありません。¶
リソース所有者は、セキュリティのベストプラクティスに反して、 関係のない他のサービスでもパスワードを再利用することがよくあります。このパスワードの再利用により、 あるサービスの脆弱性や情報漏えいが、まったく関係のないサービスにも セキュリティ上の影響を及ぼす可能性があります。¶
リソース所有者は、すべての第三者へのアクセスを取り消すことなく、 個々のアプリケーションへのアクセスだけを取り消すことができず、そのためには パスワードを変更しなければなりません。¶
いずれかのアプリケーションが侵害されると、 エンドユーザーのパスワードと、その パスワードによって保護されているすべてのデータが侵害されます。¶
OAuth が使用される例として、エンドユーザー(リソース所有者)が金融 管理 サービス(クライアント)に対し、銀行サービス(リソースサーバー)に保存されている 自身の機密性の高い取引履歴へのアクセスを許可しながら、ユーザー名と パスワードを金融管理サービスと共有しない場合があります。代わりに、ユーザーは 自身の金融機関のサーバー(認可サーバー)で直接認証し、 そのサーバーが金融管理サービスに委任固有のクレデンシャル (アクセストークン)を発行します。¶
この関心事の分離により、アプリケーションを変更することなく、 多要素認証や パスワードレス認証など、より高度なユーザー認証方式を使用できるようにもなります。 すべてのユーザー認証ロジックが認可サーバーによって処理されるため、 アプリケーションは特定の認証メカニズムの 実装の詳細を意識する必要がありません。これにより、 認可サーバーはユーザー認証ポリシーを管理し、 アプリケーションと変更を調整することなく将来それらを変更することもできます。¶
認可レイヤーは、リソースサーバーが リクエストが認可されているかどうかを判断する方法も簡素化できます。従来は、クライアントを認証した後、 各リソースサーバーが各 API 呼び出しごとにポリシーを評価し、クライアントが認可されているかを 計算していました。分散システムでは、ポリシーをすべてのリソースサーバーに 同期するか、各リクエストを処理するためにリソースサーバーが中央のポリシー サーバーを呼び出す必要があります。OAuth では、ポリシーの評価は 認可サーバーによって新しいアクセストークンが作成されるときにのみ実行されます。 認可されたアクセスがアクセストークン内に表現されている場合、リソースサーバーは ポリシーを評価する必要がなくなり、アクセストークンを検証するだけで済みます。 この簡素化は、アプリケーションがリソース 所有者に代わって動作する場合にも、自身に代わって動作する場合にも適用されます。¶
OAuth は認可プロトコルであり、認証プロトコルではありません。OAuth は ユーザー認証を実現するために必要な構成要素を 定義していないためです。目的がユーザーを認証することである場合、認証プロトコルが必要です。その一例が OpenID Connect [OpenID.Connect] であり、これは OAuth を基盤として、認証プロトコルに必要なセキュリティ 特性と構成要素を提供します。¶
アクセストークンは、クライアントに付与された認可を表します。クライアントが アクセストークンを独自 API に提示し、その API がリソース所有者のユーザー識別子を 返し、その API の結果をユーザー認証の代替として使用することは一般的な 慣行です。この慣行は OAuth 標準またはセキュリティに関する考慮事項の一部ではなく、リソース所有者によって 想定されていない可能性があります。実装者は、この慣行を採用する前に リソースサーバーの文書を慎重に確認すべきです。¶
この仕様は HTTP [RFC9110] とともに使用するよう設計されています。 HTTP 以外のプロトコル上で OAuth を使用することは、この仕様の範囲外です。¶
2012年10月に OAuth 2.0 認可フレームワーク [RFC6749] が公開されて以来、OAuth 2.0 for Native Apps [RFC8252]、 OAuth Security Best Current Practice [RFC9700]、 および OAuth 2.0 for Browser-Based Apps [I-D.ietf-oauth-browser-based-apps] によって更新されてきました。 OAuth 2.0 Authorization Framework: Bearer Token Usage [RFC6750] も [RFC9700] によって更新されています。この 標準化過程の仕様は、これらすべての文書の情報を統合し、 [RFC9700] で安全でないことが判明した機能を 削除します。¶
OAuth は4つの役割を定義します。¶
保護されたリソースへのアクセスを許可できる主体です。 リソース所有者が人である場合は、 エンドユーザーと呼ばれます。「RO」と略されることもあります。¶
保護されたリソースをホストし、アクセストークンを使用して 保護されたリソースへのリクエストを受け付け、 応答できるサーバーです。リソースサーバーは多くの場合 API を介してアクセスできます。 「RS」と略されることもあります。¶
リソース所有者に代わり、その認可を得て 保護されたリソースへのリクエストを行うアプリケーションです。「クライアント」という用語は、 特定の実装特性(たとえば、 アプリケーションがサーバー、デスクトップ、その他の デバイスのいずれで実行されるか)を意味するものではありません。¶
リソース所有者を正常に 認証し、認可を取得した後、クライアントにアクセストークンを発行するサーバーです。 「AS」と略されることもあります。¶
この仕様の大部分は、クライアントと 認可サーバーの間、およびクライアントとリソースサーバーの間の相互作用を定義します。¶
認可サーバーとリソースサーバーの間の相互作用は この仕様の範囲外ですが、リソース サーバーと認可サーバーの間の相互運用性を提供するために、いくつかの拡張が 定義されています。認可サーバーは リソースサーバーと同じサーバーであっても、別個の主体であってもかまいません。 1つの認可サーバーが、複数のリソースサーバーで受け入れられる アクセストークンを発行する場合があります。¶
リソース所有者と認可サーバーの間の相互作用 (たとえば、エンドユーザーが認可サーバーでどのように自身を認証するか) もこの仕様の範囲外ですが、 エンドユーザーに同意を求める際のセキュリティに関する考慮事項など、一部の例外があります。¶
リソース所有者がエンドユーザーである場合、ユーザーは クライアントと対話します。クライアントが Web ベースのアプリケーションである場合、ユーザーは ユーザーエージェント(3.5節 of [RFC9110] で説明されているもの)を介してクライアントと対話します。 クライアントがネイティブアプリケーションである場合、ユーザーは オペレーティングシステムを介してクライアントと直接対話します。詳細については 2.1節 を参照してください。¶
+--------+ +---------------+
| |--(1)---- 認可リクエスト ----->| リソース |
| | | 所有者 |
| |<-(2)------ 認可グラント ------| |
| | +---------------+
| |
| | +---------------+
| |--(3)------ 認可グラント ----->| 認可 |
|クライアント| | サーバー |
| |<-(4)------ アクセストークン ----| |
| | +---------------+
| |
| | +---------------+
| |--(5)------ アクセストークン --->| リソース |
| | | サーバー |
| |<-(6)------ 保護リソース -------| |
+--------+ +---------------+
図 1 に示す抽象的な OAuth 2.1 フローは、 4つの役割間の相互作用を説明し、次の手順を含みます。¶
クライアントはリソース所有者に認可を要求します。 認可リクエストはリソース所有者に直接 (図示されているように)行うこともできますが、仲介者として認可 サーバーを介して間接的に行うことが望ましいです。¶
クライアントは、リソース所有者の認可を表す クレデンシャルである認可グラントを受け取ります。 これは、この仕様で定義されている認可グラントタイプのいずれか、 または拡張グラントタイプを使用して表現されます。 認可グラントタイプは、クライアントが認可を要求するために使用した方法と、 認可サーバーがサポートするタイプによって決まります。¶
クライアントは、認可サーバーで認証し、 認可グラントを提示することによってアクセストークンを要求します。¶
認可サーバーはクライアントを認証し、 認可グラントを検証し、有効であればアクセストークンを発行します。¶
クライアントはリソース サーバーに保護されたリソースを要求し、アクセストークンを提示して認証します。¶
リソースサーバーはアクセストークンを検証し、有効であれば、 リクエストを処理します。¶
クライアントがリソース所有者から認可グラントを取得する (手順 (1) と (2) に示される)望ましい方法は、 認可サーバーを仲介者として使用することであり、これは 4.1節 の 図 3 に示されています。¶
アクセストークンは、保護されたリソースにアクセスするために使用されるクレデンシャルです。 アクセストークンは、クライアントに発行された認可を表す文字列です。¶
文字列に構造がある場合でも、クライアントにとっては不透明なものとみなされます。 クライアントはアクセストークンの値を解析できると想定してはなりません。 認可サーバーは、リソースサーバーが 期待するもの以外に、一貫したアクセストークンのエンコードまたは形式を 使用する必要はありません。¶
リソース所有者からクライアントに付与されたアクセスは、 認可サーバーが作成したアクセストークンによって表されます。アクセストークンは、 漏えいしたアクセストークンによる影響範囲を縮小するために短命です。アクセストークンの有効期限は 認可サーバーによって設定されます。¶
認可サーバーの実装によっては、 トークン文字列をリソースサーバーが認可情報を取得するために使用する場合も、 検証可能な方法でトークン自体に認可情報を含める場合もあります (すなわち、署名されたデータペイロードで構成されるトークン文字列)。 トークン取得メカニズムの一例は Token Introspection [RFC7662] であり、この場合 RS は AS 上のエンドポイントを呼び出して、クライアントが提示したトークンを検証します。 構造化トークン形式の一例は JWT Profile for Access Tokens [RFC9068] であり、 アクセストークンデータを JSON Web Token [RFC7519] としてエンコードして署名する方法です。¶
クライアントがアクセストークンを使用するために、 この仕様の範囲外である追加の認証クレデンシャルが 必要になる場合があります。これは通常、DPoP [RFC9449] や Mutual TLS Certificate-Bound Access Tokens [RFC8705] などの送信者制約付き アクセストークンと呼ばれます。¶
アクセストークンは抽象化レイヤーを提供し、異なる 認可構成(たとえばユーザー名とパスワード)を、リソースサーバーが理解する単一の トークンに置き換えます。この抽象化により、 取得に使用した認可グラントより制限の厳しいアクセストークンを 発行できるだけでなく、リソースサーバーが 幅広い認証方式を理解する必要もなくなります。¶
アクセストークンは、リソース サーバーのセキュリティ要件に基づき、異なる形式、構造、使用方法 (たとえば暗号特性)を持つことができます。アクセストークンの属性および 保護されたリソースへのアクセスに使用される方法は、 この仕様で説明されているものを超えて拡張できます。¶
アクセストークン(および機密性のあるアクセストークン 属性)は、転送中および保存中に機密を保持しなければならず、 認可サーバー、アクセストークンが有効なリソースサーバー、 およびアクセストークンが発行されたクライアントの間でのみ 共有しなければなりません。¶
認可サーバーは、権限のない主体が 有効なアクセストークンを生成する目的で、アクセストークンを 生成、変更、または推測できないようにしなければなりません。¶
アクセストークンは、アクセスを許可するユーザーが持つ権限より 少ない権限を持つクライアントに発行されることを意図しています。 これは限定された「スコープ」のアクセストークンとして知られています。 認可サーバーとリソースサーバーは、この スコープメカニズムを使用して、特定のクライアントがアクセスできるリソースの種類や アクセスレベルを制限できます。¶
たとえば、クライアントはユーザーのリソースへの「読み取り」アクセスのみを 必要とし、リソースを更新する必要はない場合があります。そのためクライアントは 認可サーバーによって定義された読み取り専用スコープを要求し、 リソースの更新には使用できないアクセストークンを取得できます。これには 認可サーバー、リソースサーバー、クライアント間の調整が必要です。 認可サーバーはクライアントが特定のスコープを要求できるようにし、 それらのスコープをクライアントに発行されたアクセストークンに関連付けます。 リソースサーバーは、限定スコープのアクセストークンが 提示された場合にスコープを適用する責任を負います。¶
OAuth はスコープ値を定義しません。代わりに、スコープは 認可サーバー、または OAuth の拡張やプロファイルによって定義されます。 スコープを定義するそのような拡張の1つが [OpenID.Connect] であり、ユーザーのプロフィール情報への 細粒度のアクセスを提供する一連のスコープを定義します。 既知の拡張のスコープと競合するカスタムスコープを 定義しないことが推奨されます。¶
限定スコープのアクセストークンを要求するため、クライアントは
使用するグラントタイプに応じて、認可エンドポイントまたはトークンエンドポイントで
scope
リクエストパラメーターを使用します。一方、認可サーバーは scope
レスポンスパラメーターを使用して、発行されたアクセストークンのスコープをクライアントに通知します。¶
scope パラメーターの値は、空白で区切られた 大文字と小文字を区別する文字列のリストとして表現されます。これらの文字列は 認可サーバーによって定義されます。値に空白で区切られた複数の 文字列が含まれる場合、その順序は重要ではなく、各文字列によって 要求されるスコープに追加のアクセス範囲が 加えられます。¶
scope = scope-token *( SP scope-token )
scope-token = 1*( %x21 / %x23-5B / %x5D-7E )
¶
認可サーバーは、認可サーバーのポリシーまたは
リソース所有者の指示に基づき、クライアントが要求したスコープを
全部または一部無視してもかまいません。発行されたアクセストークンのスコープが
クライアントが要求したものと異なる場合、認可
サーバーは、実際に付与されたスコープをクライアントに通知するために、
トークンレスポンス(3.2.3節)に
scope レスポンスパラメーターを含めなければなりません。¶
クライアントが認可を要求するときに scope パラメーターを省略した場合、 認可サーバーは、事前定義されたデフォルト値を使用して リクエストを処理するか、無効なスコープを示してリクエストを 失敗させなければなりません。認可サーバーは、 スコープ要件とデフォルト値(定義されている場合)を文書化すべきです。¶
Bearer トークンは、そのトークンを所持する任意の主体 (「bearer」)が、他の任意の所持者と同じ方法で そのトークンを使用できるという特性を持つセキュリティトークンです。 Bearer トークンを使用する際、bearer が暗号鍵素材の所持を 証明する必要はありません(proof-of-possession)。¶
Bearer トークンは、DPoP [RFC9449] や mTLS [RFC8705] などの proof-of-possession 仕様によって拡張し、 proof-of-possession 特性を提供できます。¶
アクセストークンの漏えいを防ぐため、 クライアントとリソースサーバーの間の通信は、 1.5節 で説明されている 機密性および完全性の保護を使用しなければなりません。¶
Bearer トークンの特定の構造や形式に関する要件はありません。 Bearer トークンが認可情報への参照である場合、そのような参照は、 十分に長い暗号学的にランダムな文字列を使用するなど、攻撃者が推測することが 実行不可能でなければなりません。Bearer トークンが 認可情報をトークン自体に格納するエンコードメカニズムを使用する場合、 アクセストークンはトークンの変更を防止するのに十分な 完全性保護を使用しなければなりません。アクセストークンのエンコードおよび 署名メカニズムの一例は JSON Web Token Profile for Access Tokens [RFC9068] で説明されています。¶
送信者制約付きアクセストークンは、 アクセストークンの使用を特定の送信者に結び付けます。この送信者は、 そのアクセストークンが受信者(たとえばリソースサーバー)で受け入れられるための 前提条件として、特定の秘密を知っていることを 証明する義務があります。¶
認可サーバーおよびリソースサーバーは、 OAuth Demonstration of Proof of Possession (DPoP) [RFC9449] または Mutual TLS for OAuth 2.0 [RFC8705] など、 アクセストークンを送信者に制約するメカニズムを使用すべきです。 盗まれたまたは漏えいしたアクセストークンの悪用を防ぐため、 4.10.1節 of [RFC9700] を参照してください。¶
クライアントとリソースサーバーの間でエンドツーエンド TLS を使用することが推奨されます。 TLS トラフィックを中間者で終端する必要がある場合は、 追加のセキュリティ上の助言について 4.13節 of [RFC9700] を参照してください。¶
実装は、Transport-Layer Security [RFC9846] など、通信の認証、完全性、機密性を提供するメカニズムを使用して、 コンテンツまたはヘッダーフィールド内の平文のクレデンシャルおよびトークンの交換を、 リプレイを可能にする盗聴から保護しなければなりません (たとえば、2.4.1節、7.5.1節、3.2節、および 1.4.2節 を参照してください)。¶
すべての OAuth プロトコル URL(AS、RS、およびクライアントによって公開される URL)は、
ループバックインターフェイスのリダイレクト URI を除き、https スキームを使用しなければなりません。
ループバックインターフェイスのリダイレクト URI は http スキームを
使用してもかまいません。
https を使用する場合、TLS 証明書は
4.3.4節 of
[RFC9110] に従って検証しなければなりません。
この執筆時点では、
TLS バージョン 1.3 [RFC9846] が
最新バージョンです。¶
実装は、自身のセキュリティ要件を満たす追加のトランスポート層 セキュリティメカニズムをサポートしてもかまいません。¶
TLS のバージョンとアルゴリズムの指定は この仕様の範囲外です。 トランスポート層セキュリティに関する最新の 推奨事項については [BCP195] を、 証明書の検証およびその他のセキュリティ上の考慮事項については 関連する仕様を参照してください。¶
この仕様では HTTP リダイレクトを広範に使用し、 クライアントまたは認可サーバーがリソース所有者の ユーザーエージェントを別の宛先へ誘導します。この 仕様の例では HTTP 302 ステータスコードを使用していますが、 HTTP 307 を除き、ユーザーエージェントを介してこのリダイレクトを実現できる その他任意の方法が許可され、実装の詳細とみなされます。 詳細については 7.5.4節 を参照してください。¶
OAuth 2.1 は、明確に定義されたセキュリティ特性を持つ 豊富な認可フレームワークを提供します。¶
この仕様では、必要ないくつかの構成要素を部分的または完全に 未定義のままにしています(たとえば、クライアント登録、認可サーバーの能力、 エンドポイント検出)。これらの動作の一部は、実装が使用することを選択できる 任意の拡張で定義されています。たとえば次のものがあります。¶
[RFC8414]: Authorization Server Metadata。特定の OAuth サーバーと対話するために必要な 情報をクライアントが検索するために使用できるエンドポイントを定義します。¶
[RFC7591]: Dynamic Client Registration。認可サーバーにクライアントを プログラムによって登録するためのメカニズムを提供します。¶
[RFC7592]: Dynamic Client Management。動的に登録された クライアント情報を更新するためのメカニズムを提供します。¶
[RFC7662]: Token Introspection。リソースサーバーがアクセストークンに関する情報を 取得するためのメカニズムを定義します。¶
この公開時点で既知の拡張の一覧については、 付録 D を参照してください。¶
この仕様では、
client_id、認可コード、アクセストークン、リフレッシュトークン、
その他ほとんどのプロトコルパラメーターの最大長を定義していません。これらの値の長さは、
それらを発行する主体が選択する実装方法に依存するためです。
実際には、実装は独自の制限を設けており、
受信側実装の制限を超える値があると
リクエストは失敗します。¶
実装は、受信した値が特定の長さに 収まると想定してはなりません。値を発行する主体は、その長さを 文書化し、それを運ぶ構成要素の制限を 考慮すべきです。特に、認可コードなど リダイレクトで返される値は URI クエリ文字列で運ばれ、 HTTP 実装では一般にリクエスト行および 個々のヘッダーフィールドの長さが制限されます(3節 of [RFC9112] および 5.4節 of [RFC9110])。 実装は、リクエストが 3節 of [RFC9112] で推奨される 8000オクテットのリクエスト行長以内に収まるのに十分な長さの パラメーター値をサポートすべきです。特にリソース サーバーは、アクセストークンの長さに小さな制限を設けるべきではありません。 [RFC9068] で定義されているような 構造化形式のトークンは、通常1キロバイトを超えるためです。¶
OAuth 2.1 は、既知の最新ベストプラクティスによる拡張と制限を 適用したうえで OAuth 2.0 と互換性があります。具体的には、 PKCE のように OAuth 2.0 コアで規定されていない機能が OAuth 2.1 では必須です。 さらに、Implicit や Resource Owner Credentials グラントタイプなど、OAuth 2.0 で利用可能な一部の機能は OAuth 2.1 では規定されていません。 また、OAuth 2.0 で許可されていた一部の動作は OAuth 2.1 で制限されています。 たとえば、OAuth 2.1 ではリダイレクト URI の厳密な文字列一致が要求されます。¶
この文書におけるキーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、 "MAY"、および "OPTIONAL" は、ここに示すように すべて大文字で記述されている場合に限り、BCP 14 [RFC2119] [RFC8174] で説明されているとおりに 解釈されます。¶
この仕様では [RFC5234] の Augmented Backus-Naur Form (ABNF) 表記を使用します。さらに、規則 URI-reference は "Uniform Resource Identifier (URI): Generic Syntax" [RFC3986] から取り込まれています。¶
特定のセキュリティ関連用語は、 [RFC4949] で定義されている意味で理解されます。 これらの用語には、 "attack"、"authentication"、"authorization"、"certificate"、 "confidentiality"、"credential"、"encryption"、"identity"、"sign"、 "signature"、"trust"、"validate"、"verify" などがありますが、 これらに限定されません。¶
"content" という用語は、6.4節 of [RFC9110] で説明されているとおりに解釈されます。¶
"user agent" という用語は、3.5節 of [RFC9110] で説明されているとおりに解釈されます。¶
特に記載がない限り、すべてのプロトコルパラメーター名と値は 大文字と小文字を区別します。¶
プロトコルを開始する前に、クライアントは 認可サーバーで識別子(2.2節)を確立していなければなりません。 クライアント識別子を認可サーバーで確立する方法は この仕様の範囲外ですが、通常は、クライアント開発者が 認可サーバーの Web サイトでクライアントを手動登録する (アカウントを作成し、サービス利用規約に同意した後)か、 Dynamic Client Registration [RFC7591] を使用します。 拡張によって、クライアント登録を確立するその他のプログラム的な方法が 定義される場合もあります。¶
クライアント登録では、クライアントと 認可サーバーが直接対話する必要はありません。 認可サーバーがサポートする場合、登録では、 信頼の確立や必要なクライアントプロパティ (たとえばリダイレクト URI、クライアントタイプ)の取得を他の手段に依存できます。 たとえば、自己発行または第三者発行のアサーションを使用して 登録を行ったり、認可サーバーが信頼されたチャネルを使用して クライアント検出を実行したりできます。¶
クライアント登録には次を含めなければなりません。¶
使用中のグラントタイプで必要となるクライアントの詳細情報 (2.3節 で説明されているリダイレクト URI など)、および¶
認可サーバーが必要とするその他の情報 (たとえば、アプリケーション名、Web サイト、説明、ロゴ画像、 法的条件への同意)。¶
Dynamic Client Registration [RFC7591] は、 手動のクライアント登録でも使用できるクライアント向けの共通の汎用データモデルを 定義します。¶
OAuth 2.1 は、認可サーバーと 安全に認証できる能力に基づいて、2種類のクライアントタイプを定義します。¶
AS に対するクレデンシャルを持つクライアントは、 「confidential クライアント」とされます。¶
クレデンシャルを持たないクライアントは「public クライアント」と呼ばれます。¶
クレデンシャルを持つすべてのクライアントは、 そのクレデンシャルの漏えいおよび悪用を防止するための予防措置を講じなければなりません。¶
クライアント認証により、認可サーバーは OAuth フローにおいて
特定のクライアント(その client_id によって識別される)と
対話していることを確認できます。認可サーバーは、
実際に正当なクライアントと通信しているという確信度に基づき、
認可のたびにユーザーに同意を求めるか、最初の1回だけ求めるかなどについて
ポリシー上の判断を行う場合があります。¶
認可サーバーがクライアントまたはそのクライアントを 提供・運用する主体の身元を検証するかどうか、およびどのように検証するかは この仕様の範囲外です。 認可サーバーは、クライアントにより機密性の高いリソースや操作へのアクセス (Client Credentials グラントタイプなど)を許可するかどうか、およびユーザーに 同意を求める頻度を決定するとき、クライアントの身元に対する確信度を 考慮すべきです。¶
認可サーバーが特定の クライアントタイプをサポートしなければならないという要件はありません。¶
単一の client_id を複数のタイプの
クライアントとして扱うべきではありません。¶
この仕様は、次のクライアントプロファイルを想定して設計されています。¶
Web アプリケーションは Web サーバー上で動作するクライアントです。リソース所有者は、 リソース所有者が使用するデバイス上のユーザーエージェントでレンダリングされた HTML ユーザー インターフェイスを介してクライアントにアクセスします。クライアントクレデンシャルおよび クライアントに発行されたアクセストークンは Web サーバーに保存され、 リソース所有者に公開されたり、リソース所有者からアクセス可能になったりすることは ありません。¶
ブラウザベースアプリケーションは、 クライアントコードが Web サーバーからダウンロードされ、リソース 所有者が使用するデバイス上のユーザーエージェント(たとえば Web ブラウザ)内で 実行されるクライアントです。プロトコルデータとクレデンシャルは リソース所有者から容易にアクセス可能であり、多くの場合可視です。このようなアプリケーションが クライアントクレデンシャルを使用したい場合は、 backend for frontend パターンを利用することが推奨されます。 このようなアプリケーションはユーザーエージェント内に存在するため、 認可を要求するときにユーザーエージェントの能力をシームレスに 利用できます。¶
ネイティブアプリケーションは、リソース所有者が使用する デバイス上にインストールされ実行されるクライアントです。プロトコルデータと クレデンシャルはリソース所有者からアクセス可能です。 アプリケーションに含まれるクライアント認証クレデンシャルは 抽出可能であると想定されます。動的に 発行されたアクセストークンとリフレッシュトークンには、 許容可能なレベルの保護を適用できます。一部のプラットフォームでは、これらのクレデンシャルは 同じデバイス上に存在する他のアプリケーションから保護されます。 このようなアプリケーションがクライアントクレデンシャルを使用したい場合は、 backend for frontend パターンを利用するか、Dynamic Client Registration [RFC7591] を使用して実行時に クレデンシャルを発行することが推奨されます。¶
すべてのクライアントは、認可サーバーのコンテキスト内で、 クライアントが提供した登録情報を表す一意の文字列である クライアント識別子によって識別されます。認可サーバーは通常、 クライアント識別子を自身で発行しますが、 認可サーバー以外の主体によって作成されたクライアント識別子を持つクライアントに サービスを提供する場合もあります。クライアント識別子は秘密ではありません。 リソース所有者に公開され、単独でクライアント認証に使用してはなりません。 クライアント識別子は認可サーバーのコンテキスト内で一意です。¶
クライアント識別子は不透明な文字列であり、その長さは 1.7.1節 で説明されているように この仕様では定義されていません。¶
認可サーバーが、認可サーバー以外の主体によって 発行されたクライアント識別子を持つクライアントをサポートする場合、 認可サーバーは 7.4節 で説明されているような、クライアントによるリソース所有者のなりすましを 防止するための予防措置を講じるべきです。¶
クライアントリダイレクトエンドポイント(「リダイレクトエンドポイント」とも呼ばれます)は、 認可サーバーがリソース所有者との相互作用を完了した後、 ユーザーエージェントを戻すクライアントの URI です。¶
認可サーバーは、クライアント登録プロセス中に 認可サーバーと事前に確立されたクライアントの リダイレクトエンドポイントのいずれかへユーザーエージェントをリダイレクトします。¶
リダイレクト URI は、 4.3節 of [RFC3986] で定義されている絶対 URI でなければなりません。 リダイレクト URI にはクエリ文字列コンポーネント (付録 C.1)を含めてもかまいませんが、 追加のクエリパラメーターを追加する際には保持しなければなりません。 リダイレクト URI にフラグメントコンポーネントを含めてはなりません。¶
認可サーバーは、クライアントに完全な リダイレクト URI(パスコンポーネントを含む)を登録するよう要求しなければなりません。 認可サーバーは、 登録済みの URI のいずれかと完全に一致しないリダイレクト URI を指定する認可リクエストを 拒否しなければなりません。ただしループバックリダイレクトについては、 ポート URI コンポーネントを除いて完全一致が必要です。 詳細については 4.1.1節 を参照してください。¶
認可サーバーは、クライアントが複数の リダイレクト URI を登録することを許可してもかまいません。¶
登録は、認可サーバーでクライアント情報を設定する 手動手順のように帯域外で行われる場合もあれば、 Pushed Authorization Requests [RFC9126] の最初の POST のように 実行時に行われる場合もあります。¶
私的利用 URI スキームに基づくリダイレクト URI の場合、
認可サーバーは、
クライアントが逆ドメイン名ベースのスキームを使用するという
8.4.3節 の要件を適用すべきです。
少なくとも、ピリオド文字(.)を含まない
私的利用 URI スキームは拒否すべきです。¶
衝突耐性のある特性に加えて、
これは2つのアプリが同じ私的利用 URI スキームを主張する紛争
(一方のアプリが悪意を持って動作している場合)において、
所有権を証明するのにも役立ちます。たとえば、2つのアプリが
com.example.app を主張した場合、
example.com の所有者はアプリストア運営者に
偽造アプリを削除するよう申し立てることができます。一般的な URI スキームを
使用した場合、このような申し立ての立証はより困難になります。¶
クライアントは、7.13節 で説明されているような、 クエリパラメーターから取得した任意の URI へユーザーのブラウザを転送する URL (「オープンリダイレクター」)を公開してはなりません。 オープンリダイレクターは、認可コードやアクセストークンの 外部流出を可能にする可能性があります。¶
必要な場合、クライアントはリクエストごとにリダイレクト URI を
変える代わりに、state リクエストパラメーターを使用して
リクエストごとのカスタマイズを実現してもかまいません。¶
リダイレクト URI の登録を必須にしない場合、 攻撃者は 7.13節 で説明されているように、認可エンドポイントをオープンリダイレクターとして 使用できます。¶
クライアントに複数のリダイレクト URI が登録されている場合、
クライアントは認可リクエストに
redirect_uri リクエストパラメーター
(4.1.1節)を使用してリダイレクト URI
を
含めなければなりません。
クライアントに登録されているリダイレクト URI が1つだけの場合、
redirect_uri リクエストパラメーターは任意です。¶
クライアントは Cross-Site Request Forgery (CSRF) 攻撃を防止しなければなりません。
この
文脈で CSRF とは、認可サーバーではなく悪意ある第三者から
発生したリダイレクトエンドポイントへのリクエストを指します
(詳細については 4.4.1.8節 of [RFC6819] を参照してください)。
認可サーバーが code_challenge パラメーターをサポートしていることを
確認したクライアントは、そのメカニズムによって提供される CSRF 保護に
依存してもかまいません。OpenID Connect フローでは、
nonce パラメーターの検証によって CSRF 保護が提供されます。
それ以外の場合、ユーザーエージェントに安全に
結び付けられ、state パラメーターで運ばれる
1回限りの CSRF トークンを CSRF 保護に使用しなければなりません
(7.10節 を参照してください)。¶
OAuth クライアントが1つの認可 サーバーとのみ対話できる場合、Mix-Up 防御は不要です。一方、 OAuth クライアントが2つ以上の認可サーバーと対話する場合、 クライアントは Mix-Up 攻撃を防止しなければなりません。 Mix-Up 攻撃を防止するため、クライアントは、それぞれのリクエストを送信した 発行者からのリダイレクトレスポンスのみを、かつその認可リクエストを開始した 同じユーザーエージェントからのものとして処理しなければなりません。¶
リダイレクト URI が欠落、無効、または一致しないために 認可リクエストの検証が失敗した場合、 認可サーバーはリソース所有者にエラーを通知すべきであり、 ユーザーエージェントを無効なリダイレクト URI へ自動的に リダイレクトしてはなりません。¶
クライアントのエンドポイントへのリダイレクトリクエストは、通常、 ユーザーエージェントによって処理される HTML 文書レスポンスを生成します。 HTML レスポンスがリダイレクトリクエストの結果として直接提供される場合、 HTML 文書に含まれるすべてのスクリプトは、 リダイレクト URI とそこに含まれるアーティファクト(たとえば認可コード)への 完全なアクセス権を持って実行されます。さらに、認可コードを含むリクエスト URL が、 ページ内で読み込まれる埋め込み画像、スタイルシート、 その他の要素への HTTP Referer ヘッダーで送信される場合があります。¶
クライアントは、リダイレクト URI エンドポイントのレスポンスに第三者スクリプト(たとえば第三者 分析、ソーシャルプラグイン、広告ネットワーク)を含めるべきではありません。 代わりに、URI からアーティファクトを抽出し、 アーティファクトを(URI 内またはその他の場所で)公開することなく、 ユーザーエージェントを別のエンドポイントへ再度リダイレクトすべきです。 第三者スクリプトが含まれる場合、クライアントは自身のスクリプト (URI からクレデンシャルを抽出して削除するために使用されるもの)が 最初に実行されることを保証しなければなりません。¶
認可サーバーは、基礎となる クレデンシャルの発行・登録および配布プロセスがその機密性を 保証する場合にのみ、クライアント認証に依存しなければなりません。¶
confidential クライアントについて、認可サーバーは、 自身のセキュリティ要件を満たす任意の形式のクライアント認証 (たとえばクライアントシークレット、公開鍵・秘密鍵ペア)を受け入れてもかまいません。¶
クライアント認証には、mTLS [RFC8705] や、
[RFC7521]、[RFC7523]、
およびそれらの更新版 [I-D.ietf-oauth-rfc7523bis]
に従った署名付き JWT("Private Key JWT")などの
非対称(公開鍵ベース)方式を使用することが推奨されます
([OpenID.Connect] では
クライアント認証方式 private_key_jwt として定義されています)。
このようなクライアント認証方式を使用すると、認可
サーバーは機密性の高い対称鍵を保存する必要がなくなるため、
多くの攻撃に対してより堅牢になり、クライアントが
自身の鍵と鍵ローテーションを管理できるようになります。¶
JWT ベースのクライアント認証を使用する場合、クライアントと認可サーバーは
[I-D.ietf-oauth-rfc7523bis] にある
aud 値に関する更新された指針に従わなければなりません。¶
クライアント認証が不可能な場合、認可サーバーは クライアントの身元を検証するための他の手段を採用すべきです。 たとえば、クライアントのリダイレクト URI の登録を要求したり、 リソース所有者に身元確認を依頼したりします。有効な リダイレクト URI だけでは、リソース所有者に認可を求める際に クライアントの身元を検証するには十分ではありませんが、 リソース所有者の認可を得た後にクレデンシャルを 偽のクライアントへ送信することを防ぐためには使用できます。¶
クライアントは、どの認証メカニズムが リクエストに対して権威を持つかという競合を防ぐため、 各リクエストで複数の認証方式を使用してはなりません。¶
認可サーバーは、認証されていないクライアントと 対話することによるセキュリティ上の影響を考慮し、 そのようなクライアントに発行されるトークンの潜在的な漏えいを制限する措置 (たとえばリフレッシュトークンの有効期間を制限する)を講じなければなりません。¶
認可サーバーが特定のクライアントの身元に関連付ける権限は、 クライアント識別およびクライアントクレデンシャルのライフサイクル管理に関する プロセス全体の評価に依存しなければなりません。 詳細については 7.2節 を 参照してください。¶
クライアントシークレットを保持する confidential クライアントを サポートするため、認可サーバーは、クライアントが 次のパラメーターを使用してリクエスト本文のコンテンツに クライアントクレデンシャルを含めることをサポートしなければなりません。¶
これらのパラメーターはリクエストコンテンツ内でのみ送信でき、 リクエスト URI に含めてはなりません。¶
これは、2節
of [RFC7591] で定義されている
client_secret_post としても知られています。¶
たとえば、コンテンツパラメーターを使用して アクセストークンを更新するリクエスト(4.3節) は次のようになります(表示目的のみで追加の改行を含みます)。¶
POST /token HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA &client_id=s6BhdRkqt3&client_secret=7Fjfp0ZBr1KtDRbnfVdmIw¶
認可サーバーは、クライアントシークレットを 発行されたクライアントを認証するため、HTTP Basic 認証スキームをサポートしてもかまいません。¶
11節
of [RFC9110] で定義されている
HTTP Basic 認証スキームを使用して
認可サーバーに認証する場合、クライアント識別子は
付録 B に従って
application/x-www-form-urlencoded エンコードアルゴリズムでエンコードされ、
エンコード後の値がユーザー名として使用されます。クライアント
シークレットは同じアルゴリズムでエンコードされ、
パスワードとして使用されます。¶
これは、2節 of [RFC7591] で定義されている
client_secret_basic としても知られています。¶
たとえば、次のようになります(表示目的のみで追加の改行を含みます)。¶
Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3¶
注: クライアント識別子とシークレットを最初にフォームエンコードし、 その後エンコードされた値を HTTP Basic 認証のユーザー名と パスワードとして使用するこの方法は、過去に多くの相互運用性の問題を 引き起こしてきました。一部の実装はエンコード手順を省略したり、 特定の文字だけをエンコードすることにしたり、クレデンシャル検証時に エンコード要件を無視したりしてきました。その結果、クライアントは 個々の認可サーバーにクレデンシャルを提示する方法を 特別扱いしなければならなくなりました。リクエスト本文のコンテンツにクレデンシャルを 含めることで、エンコードの問題を回避し、より相互運用性の高い 実装になります。¶
クライアントシークレット認証方式はパスワードを伴うため、 認可サーバーは、それを利用するすべてのエンドポイントを ブルートフォース攻撃から保護しなければなりません。¶
認可サーバーは、自身のセキュリティ要件に合致する 任意の適切な認証スキームをサポートしてもかまいません。その他の 認証方式を使用する場合、認可サーバーは クライアント識別子(登録レコード)と 認証スキームの間の対応付けを定義しなければなりません。¶
mTLS [RFC8705] や Private Key JWT([RFC7523]、 [I-D.ietf-oauth-rfc7523bis])などの 追加の認証方式の一部は、 "OAuth Token Endpoint Authentication Methods" レジストリで定義されており、 トークンエンドポイントを保護するという特定用途を超えて、 汎用的なクライアント認証方式として有用な場合があります。¶
認可プロセスでは、2つの認可サーバーエンドポイント (HTTP リソース)を使用します。¶
認可エンドポイント - ユーザーエージェントのリダイレクトを介して リソース所有者から認可を取得するためにクライアントが使用します。¶
トークンエンドポイント - 通常はクライアント認証を伴い、 認可グラントをアクセストークンと交換するためにクライアントが使用します。¶
さらに、1つのクライアントエンドポイントを使用します。¶
リダイレクトエンドポイント - 認可サーバーが、 リソース所有者のユーザーエージェントを介して 認可クレデンシャルを含むレスポンスをクライアントへ返すために使用します。¶
すべての認可グラントタイプが両方のエンドポイントを使用するわけではありません。 拡張グラントタイプは、必要に応じて追加のエンドポイントを定義してもかまいません。¶
トークンエンドポイントは、クライアントが 4節 および 4.3節 で説明されているようなグラントを使用してアクセストークンを取得するために使用されます。¶
クライアントがトークンエンドポイントの URL を取得する方法は この仕様の範囲外ですが、その URL は通常 サービス文書で提供され、クライアントの開発時に設定されるか、 認可サーバーのメタデータ文書 [RFC8414] で提供され、 実行時にプログラムによって取得されます。¶
トークンエンドポイント URL にフラグメントコンポーネントを含めてはならず、 クエリ文字列コンポーネント(付録 C.1)を含めてもかまいません。¶
クライアントはトークンエンドポイントへリクエストを行うとき、
HTTP POST メソッドを使用しなければなりません。¶
認可サーバーは、トークンエンドポイントに送信された 認識できないリクエストパラメーターを無視しなければなりません。¶
値なしで送信されたパラメーターは、リクエストから 省略されたものとして扱わなければなりません。この仕様で定義される リクエストおよびレスポンスパラメーターを複数回含めてはなりません。 この要件は、特定のパラメーターについて 拡張が明示的に別の定義を行っていない限り、拡張によって定義されるパラメーターにも 適用されます。¶
ブラウザベースアプリケーション (たとえば、補助的なバックエンドサーバーへアクセスせず、 クライアント側 JavaScript のみで動作するアプリケーション)をサポートしたい認可サーバーは、 レスポンスをアプリケーションから可視にするために必要な CORS [WHATWG.CORS] ヘッダーをトークンエンドポイントが サポートしていることを保証する必要があります。 認可サーバーがアプリケーションに対して、メタデータ URL、動的クライアント登録、 失効、イントロスペクション、ディスカバリー、ユーザー情報エンドポイントなど 追加のエンドポイントを提供する場合、これらのエンドポイントもブラウザベース アプリケーションからアクセスされる可能性があり、アクセスを許可するために CORS ヘッダーを定義する必要があります。 詳細については [I-D.ietf-oauth-browser-based-apps] を参照してください。¶
confidential クライアントは、トークンエンドポイントへ リクエストするとき、 2.4節 で説明されているように、 認可サーバーで認証しなければなりません。¶
クライアント認証は次の目的で使用されます。¶
リフレッシュトークンおよび認可コードを、 それらが発行されたクライアントに結び付けることを強制します。 クライアント認証は、認可コードが安全でないチャネルを介して リダイレクトエンドポイントへ送信される場合に 追加のセキュリティレイヤーを提供します。¶
クライアントを無効化したり、 そのクレデンシャルを変更したりすることで、侵害されたクライアントから回復し、 攻撃者が盗まれたリフレッシュトークンを悪用することを防ぎます。 単一のクライアントクレデンシャル集合を変更する方が、 リフレッシュトークン一式を取り消すよりはるかに高速です。¶
定期的なクレデンシャルローテーションを要求する 認証管理のベストプラクティスを実装します。 リフレッシュトークン一式のローテーションは困難な場合がありますが、 単一のクライアントクレデンシャル集合のローテーションは はるかに容易です。¶
クライアントは、HTTP リクエストコンテンツ内で UTF-8 文字エンコーディングを使用し、 付録 C.2 に従った フォームエンコードされたシリアル化形式で次のパラメーターを送信することにより、 トークンエンドポイントへリクエストを行います。¶
必須。クライアントが特定のトークンリクエストで使用する
グラントタイプの識別子です。
この仕様では、値 authorization_code、
refresh_token、client_credentials を定義します。
グラントタイプによって、トークンリクエストで必要またはサポートされる
追加のパラメーターが決まります。それらのグラントタイプの
詳細は以下で定義されます。¶
任意。パラメーターに依存する形式の
クライアント認証が使用される場合、または grant_type が
public クライアントの識別を必要とする場合に
クライアント識別子が必要です。¶
confidential クライアントは、3.2.1節 で説明されているように、 認可サーバーで認証しなければなりません。¶
たとえば、クライアントは次の HTTPS リクエストを行います (表示目的のみで追加の改行を含みます)。¶
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=authorization_code &code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb &code_verifier=3641a2d12d66101249cdf7a79c000c1f8c05d2aafcf14bf146497bed¶
認可サーバーは次を行わなければなりません。¶
さらにグラントタイプ固有の処理規則が適用され、 各グラントタイプとともに規定されています。¶
アクセストークンリクエストが有効で認可されている場合、 認可サーバーはアクセストークンと、任意でリフレッシュ トークンを発行します。¶
クライアント認証が失敗したか無効である場合、 認可サーバーは 3.2.4節 で説明されている エラーレスポンスを返します。¶
認可サーバーは、[RFC8259] で定義されている
application/json メディアタイプを使用し、
付録 C.3 に従って HTTP レスポンスを作成し、
次のパラメーターと HTTP 200 (OK) ステータスコードを使用して
アクセストークンと任意のリフレッシュトークンを発行します。¶
必須。認可サーバーが発行したアクセストークン。¶
推奨。アクセストークンの有効期間を
秒単位で表す JSON 数値です。
たとえば、値 3600 は、レスポンスが生成された時点から
1時間後にアクセストークンが失効することを示します。
省略された場合、認可サーバーは
有効期間を他の手段で提供するか、デフォルト値を文書化すべきです。
認可サーバーはアクセストークンを予定より早く失効させる場合があり、
クライアントは指定された有効期間中アクセストークンが有効であると
想定してはならないことに注意してください。¶
クライアントが要求したスコープと同一の場合は推奨。 それ以外の場合は必須。1.4.1節 で説明されているアクセストークンのスコープ。¶
任意。対応する トークンリクエストで渡されたグラントに基づいて、新しい アクセストークンを取得するために使用できるリフレッシュトークン。¶
認可サーバーは、リスク評価と自身のポリシーに基づき、 特定のクライアントにリフレッシュトークンを発行するかどうかを決定すべきです。 認可サーバーがリフレッシュトークンを発行しないと判断した場合、 クライアントは OAuth フローを最初からやり直すことによって、 たとえば新しい認可コードリクエストを開始して、 新しいアクセストークンを取得してもかまいません。そのような場合、認可 サーバーは Cookie と永続的なグラントを利用してユーザー 体験を最適化できます。¶
リフレッシュトークンが発行される場合、それらのリフレッシュトークンは リソース所有者が同意したスコープおよびリソースサーバーに 結び付けなければなりません。 これは、正当なクライアントによる権限昇格を防止し、 リフレッシュトークン漏えいの影響を減らすためです。¶
パラメーターは、付録 C.3 で説明されている JavaScript Object Notation (JSON) 構造にシリアル化されます。¶
認可サーバーは、トークン、クレデンシャル、
またはその他の機密情報を含むすべてのレスポンスに、
値 no-store を持つ HTTP
Cache-Control
レスポンスヘッダーフィールド
(5.2節
of [RFC9111] を参照)を
含めなければなりません。¶
たとえば次のようになります。¶
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "2YotnFZFEjr1zCsicMWpAA",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter": "example_value"
}
¶
クライアントは、レスポンス内の認識できない値の名前を 無視しなければなりません。認可 サーバーから受信するトークンおよびその他の値の長さは、 1.7.1節 で説明されているように未定義です。¶
認可サーバーは、特に指定がない限り、 HTTP 400 (Bad Request) ステータスコードで応答し、 レスポンスに次のパラメーターを含めます。¶
必須。次の中から選ばれる単一の ASCII [USASCII] エラーコード。¶
リクエストに必要なパラメーターが欠けている、
サポートされていないパラメーター値
(グラントタイプを除く)を含んでいる、
パラメーターが重複している、複数のクレデンシャルを含んでいる、
クライアントを認証するために複数のメカニズムを使用している、
認可リクエストで code_challenge が送信されていないにもかかわらず
code_verifier を含んでいる、
またはその他の理由で不正な形式です。¶
クライアント認証に失敗しました
(たとえば、不明なクライアント、クライアント認証が
含まれていない、またはサポートされていない認証方式)。
認可サーバーは、サポートされる HTTP 認証スキームを示すため、
HTTP 401 (Unauthorized) ステータスコードを
返してもかまいません。クライアントが
Authorization リクエストヘッダーフィールドを介して認証を試みた場合、
認可サーバーは HTTP 401 (Unauthorized) ステータスコードで
応答し、クライアントが使用した認証スキームに一致する
WWW-Authenticate レスポンスヘッダーフィールドを
含めなければなりません。¶
提供された認可グラント (たとえば、認可コード、リソース所有者クレデンシャル) またはリフレッシュトークンが無効、期限切れ、取り消し済み、 認可リクエストで使用されたリダイレクト URI と一致しない、 または別のクライアントに発行されたものです。¶
認証されたクライアントには、 この認可グラントタイプを使用する権限がありません。¶
認可グラントタイプが 認可サーバーでサポートされていません。¶
要求されたスコープが無効、不明、 不正な形式、または リソース所有者によって付与されたスコープを超えています。¶
error パラメーターの値には、
集合 %x20-21 / %x23-5B / %x5D-7E の外側の文字を
含めてはなりません。¶
任意。発生したエラーを
クライアント開発者が理解するのを支援するための追加情報を提供する、
人間が読める ASCII [USASCII]
テキスト。
error_description パラメーターの値には、
集合 %x20-21 / %x23-5B / %x5D-7E の外側の文字を
含めてはなりません。¶
任意。エラーに関する情報を持つ、
人間が読める Web ページを識別する URI で、
クライアント開発者にエラーに関する追加情報を
提供するために使用されます。
error_uri パラメーターの値は
URI-reference 構文に準拠しなければならず、したがって
集合 %x21 / %x23-5B / %x5D-7E の外側の文字を
含めてはなりません。¶
パラメーターは、付録
C.3 で定義されている
application/json メディアタイプを使用して
HTTP レスポンスのコンテンツに含められます。¶
たとえば次のようになります。¶
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_request"
}
¶
クライアントは、リソースサーバーにアクセストークンを 提示することで保護されたリソースにアクセスします。リソースサーバーは アクセストークンを検証し、まだ失効していないこと、およびそのスコープが 要求されたリソースを対象としていることを確認しなければなりません。 リソースサーバーがアクセストークンを検証するために使用する方法は この仕様の範囲外ですが、通常は リソースサーバーと認可サーバーの間の 相互作用または調整を伴います。たとえば、リソースサーバーと 認可サーバーが同じ場所に配置されているか、同じシステムの一部である場合、 データベースやその他のストレージを共有することがあります。2つの構成要素が 独立して運用されている場合、Token Introspection [RFC7662] または JWT [RFC9068] などの構造化アクセストークン形式を使用する場合があります。¶
この節では、リソースサーバーへのリソース リクエストで Bearer トークンを送信する2つの方法を定義します。 クライアントは以下で定義する2つの方法のいずれかを使用しなければならず、 各リクエストでトークンを送信するために複数の方法を使用してはなりません。¶
特に、クライアントは URI クエリパラメーターでアクセストークンを 送信してはならず、 リソースサーバーは URI クエリパラメーター内のアクセストークンを無視しなければなりません。¶
HTTP リクエストコンテンツでアクセストークンを送信する場合、
クライアントは access_token パラメーターを使用して
リクエストコンテンツにアクセストークンを追加します。
次のすべての条件を満たさない限り、クライアントはこの方法を使用してはなりません。¶
HTTP リクエストに、
application/x-www-form-urlencoded に設定された
Content-Type ヘッダーフィールドが含まれている。¶
コンテンツが、URL 現行標準 [WHATWG.URL] で定義されている
application/x-www-form-urlencoded コンテンツタイプの
エンコード要件に従っている。¶
HTTP リクエストコンテンツが単一パートである。¶
HTTP リクエストメソッドが、コンテンツについて
定義された意味論を持つメソッドである。特に、これは GET
メソッドを使用してはならないことを意味します。¶
コンテンツには他のリクエスト固有パラメーターを
含めてもかまいません。その場合、access_token パラメーターは
& 文字(ASCII コード 38)を使用して、
リクエスト固有パラメーターから適切に分離しなければなりません。¶
たとえば、クライアントはトランスポート層セキュリティを使用して 次の HTTP リクエストを行います。¶
POST /resource HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded access_token=mF_9.B5f-4.1JqM¶
application/x-www-form-urlencoded 方式は、
参加するクライアントが Authorization リクエストヘッダーフィールドへ
アクセスできないアプリケーションコンテキストを除き、
使用すべきではありません。リソースサーバーはこの方法をサポートしてもかまいません。¶
アクセストークンを受信した後、リソースサーバーは、 アクセストークンがまだ失効しておらず、要求された リソースへのアクセスが認可され、適切なスコープで発行され、 保護されたリソースへアクセスするためのリソースサーバーの その他のポリシー要件を満たしていることを確認しなければなりません。¶
アクセストークンは一般に、参照トークンと 自己エンコードトークンの2つのカテゴリに分類されます。 参照トークンは認可サーバーへ問い合わせるか トークンデータベースでトークンを検索することで検証できます。一方、 自己エンコードトークンには、リソースサーバーが抽出できる 暗号化および/または署名された文字列の中に認可情報が含まれます。¶
アクセストークンの有効性を確認するために認可サーバーへ問い合わせる 標準化された方法は Token Introspection [RFC7662] で定義されています。¶
トークン文字列に情報をエンコードする標準化された方法は、 JWT Profile for Access Tokens [RFC9068] で定義されています。¶
リソースアクセスリクエストが失敗した場合、リソースサーバーは クライアントにエラーを通知すべきです。エラーレスポンスの詳細は、 5.3.2節 の Bearer トークンの説明など、 特定のトークンタイプによって決まります。¶
保護されたリソースへのリクエストに認証
クレデンシャルが含まれていない場合、または保護されたリソースへの
アクセスを可能にするアクセストークンが含まれていない場合、
リソースサーバーは HTTP WWW-Authenticate
レスポンスヘッダーフィールドを含めなければなりません。
その他の条件へのレスポンスにも含めてもかまいません。
WWW-Authenticate ヘッダー
フィールドは HTTP/1.1 [RFC7235]
で定義されるフレームワークを使用します。¶
このトークンタイプに対するすべてのチャレンジは、
auth-scheme 値 Bearer を使用しなければなりません。
このスキームの後には1つ以上の auth-param 値が続かなければなりません。
このトークンタイプについてこの仕様で使用または定義される
auth-param 属性は次のとおりです。他の auth-param
属性を使用してもかまいません。¶
HTTP/1.1 [RFC7235] で説明されている方法で
保護の範囲を示すために realm 属性を
含めてもかまいません。
realm 属性は複数回出現してはなりません。¶
scope 属性は
1.4.1節 で定義されています。
scope 属性は、要求されたリソースへアクセスするために
アクセストークンに必要なスコープを示す、大文字と小文字を区別する
スコープ値の空白区切りリストです。scope 値は実装によって
定義され、中央集約されたレジストリはありません。許可される値は
認可サーバーによって定義されます。scope 値の順序は
重要ではありません。場合によっては、保護されたリソースを
利用するのに十分なアクセススコープを持つ新しいアクセストークンを
要求するときに scope 値が使用されます。
scope 属性の使用は任意です。
scope 属性は複数回出現してはなりません。
scope 値はプログラムによる使用を意図しており、
エンドユーザーに表示することを意図していません。¶
次に2つのスコープ値の例を示します。これらはそれぞれ、 OpenID Connect [OpenID.Messages] および Open Authentication Technology Committee (OATC) Online Multimedia Authorization Protocol [OMAP] の OAuth 2.0 ユースケースから取られています。¶
scope="openid profile email" scope="urn:example:channel=HBO&urn:example:rating=G,PG-13"¶
保護されたリソースへのリクエストにアクセストークンが
含まれていて認証に失敗した場合、リソースサーバーは
アクセス要求が拒否された理由をクライアントに提供するために
error 属性を含めるべきです。パラメーター値は
5.3.2節
で説明されています。¶
リソースサーバーは、
エンドユーザーに表示することを意図しない、人間が読める
開発者向けの説明を提供するために
error_description 属性を含めてもかまいません。¶
リソースサーバーは、
エラーを説明する人間が読める Web ページを識別する
絶対 URI を持つ error_uri 属性を
含めてもかまいません。¶
error、error_description、および
error_uri 属性は複数回
出現してはなりません。¶
scope 属性
(付録 A.4 で規定)
の値には、スコープ値を表すための集合 %x21 / %x23-5B
/ %x5D-7E およびスコープ値間の区切り文字としての %x20 の外側の文字を
含めてはなりません。error および
error_description 属性
(付録
A.7 および 付録
A.8 で規定)の値には、
集合 %x20-21 / %x23-5B / %x5D-7E の外側の文字を含めてはなりません。
error_uri 属性
(付録 A.9 で規定)
の値は URI-reference 構文に準拠しなければならず、したがって
集合 %x21 / %x23-5B / %x5D-7E の外側の文字を含めてはなりません。¶
リクエストが失敗した場合、リソースサーバーは 適切な HTTP ステータスコード(通常は 400、401、403、または 405)で応答し、 レスポンスに次のいずれかのエラーコードを含めます。¶
リクエストに必要なパラメーターが欠けている、 サポートされていないパラメーターまたはパラメーター値を含んでいる、 同じパラメーターを繰り返している、 アクセストークンを含めるために複数の方法を使用している、 またはその他の理由で不正な形式です。リソースサーバーは HTTP 400 (Bad Request) ステータスコードで応答すべきです。¶
提供されたアクセストークンが失効、取り消し済み、 不正な形式、または その他の理由で無効です。リソースサーバーは HTTP 401 (Unauthorized) ステータスコードで応答すべきです。クライアントは 新しいアクセストークンを要求し、保護されたリソースへの リクエストを再試行してもかまいません。¶
リクエストには、クライアントに付与され
アクセストークンによって表されているスコープより
高い権限(スコープ)が必要です。
リソースサーバーは HTTP
403 (Forbidden) ステータスコードで応答すべきであり、
保護されたリソースへアクセスするために必要なスコープを持つ
scope 属性を含めてもかまいません。¶
拡張では、追加のエラーコードを定義したり、 上記のエラーコードが返される追加の状況を規定したりできます。¶
リクエストに認証情報がまったくない場合 (たとえば、クライアントが認証が必要であることを認識していなかった、 またはサポートされていない認証方式を使用して試みた場合)、 リソースサーバーはエラーコードやその他のエラー情報を 含めるべきではありません。¶
たとえば次のようになります。¶
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example"¶
また、失効したアクセストークンを使用して認証を試みた 保護されたリソースへのリクエストに対するレスポンスは次のとおりです。¶
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
error="invalid_token",
error_description="The access token expired"
¶
アクセストークンタイプは、次の2つの方法のいずれかで定義できます。 Access Token Types レジストリに登録する (11.1節 of [RFC6749] の手順に従う)か、 一意の絶対 URI をその名前として使用します。¶
[RFC6750] は、OAuth トークン認証スキーム間で共有されるエラー値のための 共通レジストリを 11.4節 of [RFC6749] で確立しています。¶
主として OAuth トークン認証用に設計された 新しい認証スキームは、クライアントにエラー ステータスコードを提供するためのメカニズムを定義すべきです。この場合、 許可されるエラー値は、この仕様によって確立された エラーレジストリに登録されます。¶
そのようなスキームは、有効なエラーコードの集合を
登録済み値の部分集合に制限してもかまいません。
エラーコードが名前付きパラメーターを使用して返される場合、
パラメーター名は error とすべきです。¶
OAuth トークン認証に使用できるものの、 主としてその目的のために設計されたものではない他のスキームも、 同じ方法でそのエラー値をレジストリに結び付けてもかまいません。¶
新しい認証スキームは、この仕様での使用法と同様の方法で
エラー情報を返すために、
error_description および error_uri パラメーターの使用も
規定することを選択してもかまいません。¶
タイプ名は
type-name ABNF に準拠しなければなりません。タイプ定義に新しい HTTP
認証スキームが含まれる場合、タイプ名は HTTP
認証スキーム名([RFC2617] で定義)と同一にすべきです。
トークンタイプ example は、例で使用するために予約されています。¶
type-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
URI 名を利用するタイプは、一般的には適用できず、 使用されるリソースサーバーの実装詳細に 固有である、ベンダー固有の実装に限定すべきです。¶
その他のすべてのタイプは登録しなければなりません。¶
認可エンドポイントまたはトークンエンドポイントで使用する 新しいリクエストまたはレスポンスパラメーターは、 11.2節 of [RFC6749] の手順に従って OAuth Parameters レジストリで定義および登録されます。¶
パラメーター名は param-name ABNF に準拠しなければならず、 パラメーター値の構文は明確に定義されていなければなりません (たとえば、ABNF を使用するか、既存のパラメーター構文を参照します)。¶
param-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
一般的には適用できず、使用される認可サーバーの 実装詳細に固有である、未登録のベンダー固有パラメーター拡張は、 他の登録済み値と競合する可能性が低いベンダー固有の プレフィックス(たとえば 'companyname_' で始める)を使用すべきです。¶
認可エンドポイントで使用する新しいレスポンスタイプは、 11.3節 of [RFC6749] の手順に従って Authorization Endpoint Response Types レジストリで定義および登録されます。レスポンスタイプ 名は response-type ABNF に準拠しなければなりません。¶
response-type = response-name *( SP response-name ) response-name = 1*response-char response-char = "_" / DIGIT / ALPHA¶
レスポンスタイプに1つ以上の空白文字 (%x20) が含まれる場合、 値の順序が重要でない空白区切りの値リストとして 比較されます。登録できる値の順序は1つだけであり、 同じ値集合のその他すべての並びを包含します。¶
たとえば、拡張で
code other_token
レスポンスタイプを定義して登録できます。登録後、同じ組み合わせを
other_token code として登録することはできませんが、
どちらの値も同じレスポンスタイプを
表すために使用できます。¶
プロトコル拡張(すなわち、アクセストークンタイプ、 拡張パラメーター、または拡張グラントタイプ)で、 認可コードグラントのエラー レスポンス(4.1.2.1節)、 トークンエラーレスポンス(3.2.4節)、または リソースアクセスエラーレスポンス(5.3節) とともに使用する追加のエラーコードが必要な場合、そのようなエラーコードを 定義してもかまいません。¶
拡張エラーコードは、それと組み合わせて使用される拡張が 登録済みアクセストークンタイプ、登録済みエンドポイントパラメーター、または 拡張グラントタイプである場合、登録しなければなりません (11.4節 of [RFC6749] の手順に従います)。 未登録の拡張で使用されるエラーコードは 登録してもかまいません。¶
エラーコードは error ABNF に準拠しなければならず、
可能な場合は識別用の名前をプレフィックスとして付けるべきです。たとえば、
拡張パラメーター example に設定された無効な値を示す
エラーは example_invalid と
命名すべきです。¶
error = 1*error-char error-char = %x20-21 / %x23-5B / %x5D-7E¶
柔軟で拡張可能なフレームワークであるため、OAuth のセキュリティに関する 考慮事項は多くの要因に依存します。以下の節では、 2.1節 で説明した3つの クライアントプロファイル、すなわち Web アプリケーション、 ブラウザベースアプリケーション、およびネイティブアプリケーションに焦点を当てた セキュリティガイドラインを実装者に提供します。¶
包括的な OAuth セキュリティモデルと分析、および プロトコル設計の背景については、 [RFC6819] および [RFC9700] で提供されています。¶
次の一覧は、何らかの形式のトークンを利用するプロトコルに対する 一般的な脅威をいくつか示しています。この脅威の一覧は NIST Special Publication 800-63 [NIST800-63] に基づいています。¶
攻撃者は偽の アクセストークンを生成したり、既存のトークンの内容(認証情報や 属性ステートメントなど)を改変したりすることで、リソース サーバーにクライアントへの不適切なアクセスを許可させる可能性があります。たとえば、 攻撃者がトークンを改変して有効期間を延長したり、 悪意あるクライアントがアサーションを改変して、 本来閲覧できない情報へのアクセスを取得したりする可能性があります。¶
アクセストークンには、機密情報を含む認証および属性 ステートメントが含まれる場合があります。¶
クライアントがアクセストークンの内容を閲覧できないようにする必要がある場合、 コンテンツ暗号化を適用しなければなりません。¶
Cookie はデフォルトでは平文で送信されるため、そこに 含まれる情報はすべて漏えいの危険にさらされます。 Bearer トークンを平文で送信される可能性のある Cookie に保存してはなりません。 Cookie に関するセキュリティ上の考慮事項については [RFC6265] の7節および8節を参照してください。¶
攻撃者は、あるリソースサーバーで使用するために生成されたアクセストークンを使用し、 そのトークンが自分向けであると誤って判断する別のリソース サーバーへのアクセスを取得します。¶
攻撃者は、そのリソースサーバーで過去にすでに 使用されたアクセストークンを再び使用しようとします。¶
デジタル署名を使用してアクセストークンの内容を保護し、 定期的な鍵ローテーションなどの署名鍵管理の ベストプラクティスに従うことで、広範な脅威を緩和できます。¶
別の方法として、Bearer トークンには、認可情報そのものを 直接エンコードするのではなく、認可情報への参照を含めることができます。 参照を使用する場合、その参照から認可情報を解決するために、 リソースサーバーと認可サーバーの間で追加の相互作用が 必要になる場合があります。このような相互作用の仕組みは この仕様では定義されていませんが、そのようなメカニズムの1つが Token Introspection [RFC7662] で定義されています。¶
この文書ではアクセストークンのエンコード方式や内容を 規定していないため、アクセストークンの完全性保護を保証する方法に関する 詳細な推奨事項はこの仕様の範囲外です。 アクセストークンのエンコードおよび 署名メカニズムの一例は、 JSON Web Token Profile for Access Tokens [RFC9068] で説明されています。¶
アクセストークンのリダイレクトに対処するためには、 認可サーバーがトークン内に意図された受信者(オーディエンス)の 身元を含めることが重要です。通常は単一のリソースサーバー (またはリソースサーバーの一覧)です。トークンの使用を 特定のスコープに制限することも推奨されます。¶
1.5節 では、 アクセストークンの漏えいを防止し、 クライアント、リソースサーバー、および認可サーバー間の通信に 機密性と完全性を提供するための情報を示しています。¶
クライアント実装は、 Bearer トークンが意図しない主体へ漏えいしないことを保証しなければなりません。 漏えいした主体は、そのトークンを使用して保護されたリソースへのアクセスを 取得できるためです。これは Bearer トークンを使用する際の 最も重要なセキュリティ上の考慮事項であり、以下のより具体的な すべての推奨事項の基礎となります。¶
クライアントは、保護されたリソースへリクエストするとき、 TLS 証明書チェーンを検証しなければなりません。 これを行わないと、DNS ハイジャック攻撃によってトークンを盗まれ、 意図しないアクセスを取得される可能性があります。¶
クライアントは、Bearer トークンを使用して リクエストするとき、常に TLS (https) または同等のトランスポートセキュリティを使用しなければなりません。 これを行わないと、トークンが多数の攻撃にさらされ、 攻撃者に意図しないアクセスを許す可能性があります。¶
認可サーバーは、特に Web ブラウザ内や その他の情報漏えいが発生する可能性のある環境で動作する クライアントにトークンを発行する場合、 短命な Bearer トークンを発行すべきです。 短命な Bearer トークンを使用することで、 漏えいした場合の影響を軽減できます。¶
認可サーバーは、オーディエンス制限を含み、 意図されたリソースサーバーまたはリソースサーバー群に 使用範囲を限定した Bearer トークンを発行すべきです。¶
Bearer トークンを ページ URL(たとえばクエリ文字列パラメーター)で 渡してはなりません。代わりに、Bearer トークンは、 機密性対策が講じられた HTTP メッセージヘッダーまたは メッセージ本文で渡すべきです。 ブラウザ、Web サーバー、およびその他のソフトウェアは、 ブラウザ履歴、Web サーバーログ、およびその他の データ構造内の URL を十分に保護しない可能性があります。 Bearer トークンをページ URL で渡すと、 攻撃者が履歴データ、ログ、またはその他の保護されていない場所から それらを盗み出せる可能性があります。¶
アクセストークンに関連付けられる権限は、 特定のアプリケーションまたはユースケースに必要な最小限に 制限すべきです。これにより、クライアントがリソース所有者によって 認可された権限を超えることを防止できます。また、ユーザーが 各セキュリティポリシーによって認可された自身の権限を超えることも 防止します。権限制限は、アクセストークン漏えいの影響を 軽減するのにも役立ちます。¶
特に、アクセストークンは特定のリソース
サーバー(オーディエンス制限)に制限し、できれば単一のリソース
サーバーに制限すべきです。これを実現するため、認可サーバーは
アクセストークンを特定のリソースサーバーに関連付け、各リソース
サーバーはすべてのリクエストについて、そのリクエストとともに送信された
アクセストークンがその特定のリソースサーバーで使用することを
意図したものかどうかを検証する義務があります。そうでない場合、
リソースサーバーは該当するリクエストの処理を拒否しなければなりません。
クライアントおよび認可サーバーは、アクセスしたいリソースサーバーを
決定するため、この文書および [RFC8707]
でそれぞれ規定されている scope または resource
パラメーターを使用してもかまいません。¶
さらに、アクセストークンは、リソースサーバーまたは
リソース上の特定のリソースおよび操作に制限すべきです。これを実現するため、
認可サーバーはアクセストークンを該当するリソースおよび操作に関連付け、
各リソースサーバーはすべてのリクエストについて、そのリクエストとともに
送信されたアクセストークンが、その特定のリソースに対する
特定の操作で使用することを意図したものかどうかを検証する義務があります。
そうでない場合、リソースサーバーは該当するリクエストの処理を
拒否しなければなりません。クライアントおよび認可サーバーは、
それらのリソースおよび/または操作を決定するため、
[RFC9396] で規定されている
scope および authorization_details パラメーターを
使用してもかまいません。¶
クライアント登録およびクレデンシャルの ライフサイクル管理のプロセス全体によっては、これは認可 サーバーが特定のクライアントに対して持つ確信度に影響する可能性があります。¶
たとえば、動的に登録されたクライアントの認証は、 クライアントの身元を証明するものではなく、認可サーバーへの繰り返しの リクエストが同じクライアントインスタンスから行われたことを保証するだけです。 このようなクライアントは、要求を許可されるスコープを制限されたり、 トークンの有効期間を短くするなど、その他の制限を受けたりする場合があります。¶
これに対して、開発者の身元が検証され、 契約に署名し、安全なバックエンドサービスでのみ使用される クライアントシークレットを発行された登録済みアプリケーションの場合、 認可サーバーは、このクライアントにより機密性の高いスコープの要求を 許可したり、より長期間有効なトークンを発行したりする場合があります。¶
confidential クライアントのクレデンシャルが盗まれた場合、 悪意あるクライアントがそのクライアントになりすまし、 保護されたリソースへのアクセスを取得できます。¶
認可サーバーは、明示的なリソース所有者 認証を強制し、クライアント、要求された認可スコープ、および 有効期間に関する情報をリソース所有者に提供すべきです。 リソース所有者は、現在のクライアントのコンテキストでその情報を確認し、 リクエストを認可するか拒否するかを決定します。¶
認可サーバーは、クライアントを認証するか、 繰り返しのリクエストが元のクライアントからのものであって なりすまし者からのものではないことを保証するその他の措置に依存しない限り、 繰り返される認可リクエストを(リソース所有者による能動的な操作なしに) 自動的に処理すべきではありません。¶
上記のとおり、認可 サーバーは、クライアントの身元を保証できる場合を除き、 ユーザーの同意または操作なしに認可リクエストを自動的に 処理すべきではありません。これには、ユーザーが 特定のクライアント ID に対する認可リクエストを以前に承認していた場合も含まれます。 クライアントの身元を証明できない限り、そのリクエストは 以前のリクエストが承認されていなかったものとして処理すべきです。¶
宣言済み https スキームリダイレクトなどの措置を、
認可サーバーが身元証明として受け入れてもかまいません。
一部のオペレーティングシステムは、必要に応じて受け入れることのできる
代替のプラットフォーム固有の身元確認機能を提供する場合があります。¶
クライアントは、必要最小限のスコープを持つアクセストークンを 要求すべきです。認可サーバーは、要求されたスコープをどのように 承認するかを決定する際にクライアントの身元を考慮すべきであり、 要求されたものより少ないスコープを持つアクセストークンを 発行してもかまいません。¶
アクセストークンに関連付けられる権限は、 特定のアプリケーションまたはユースケースに必要な 最小限に制限すべきです。これにより、クライアントが リソース所有者によって認可された権限を超えることを防止します。 また、ユーザーが各セキュリティポリシーによって認可された 自身の権限を超えることも防止します。権限制限は、 アクセストークン漏えいの影響を軽減するのにも役立ちます。¶
特に、アクセストークンは特定のリソース
サーバー(オーディエンス制限)に制限し、できれば単一のリソース
サーバーに制限すべきです。これを実現するため、認可サーバーは
アクセストークンを特定のリソースサーバーに関連付け、各リソース
サーバーはすべてのリクエストについて、そのリクエストとともに送信された
アクセストークンがその特定のリソースサーバーで使用することを
意図したものかどうかを検証する義務があります。そうでない場合、
リソースサーバーは該当するリクエストの処理を拒否しなければなりません。
クライアントおよび認可サーバーは、アクセスしたい
リソースサーバーを決定するため、
[RFC8707] で規定されている
scope または resource パラメーターを
それぞれ使用してもかまいません。¶
リソースサーバーは、アクセストークンが発行された
リソース所有者の身元、またはクライアントクレデンシャルグラントにおける
クライアントの身元に基づいてアクセス制御を決定する場合があります。
両方の選択肢が可能な場合、実装の詳細によっては、
クライアントの身元がリソース所有者の身元と誤認される可能性があります。
たとえば、クライアントが認可サーバーへの登録時に
自身の client_id を選択できる場合、悪意あるクライアントは
それをエンドユーザーを識別する値(たとえば OpenID Connect を使用する場合の
sub 値)に設定する可能性があります。リソースサーバーが、
クライアントに発行されたアクセストークンとエンドユーザーに発行された
アクセストークンを適切に区別できない場合、クライアントは
エンドユーザーのリソースにアクセスできる可能性があります。¶
認可サーバーがクライアント ID とユーザー識別子に
共通の名前空間を使用しているため、リソースサーバーが、
リソース所有者によって認可されたアクセストークンと
クライアント自身によって認可されたアクセストークンを区別できない場合、
認可サーバーは、正当なリソース所有者との混同を引き起こす可能性があるなら、
クライアントが自身の client_id または
その他の Claim に影響を与えることを許可すべきではありません。
これを避けられない場合、認可サーバーは、
リソースサーバーが2種類のアクセストークンを区別するための
その他の手段を提供しなければなりません。¶
中間者攻撃に関連するリスクは、 認可エンドポイントおよびトークンエンドポイントとの通信に [RFC9846] などのチャネルセキュリティメカニズムの 使用を必須とすることで緩和されます。 詳細については 1.5節 を 参照してください。¶
認可サーバーは、攻撃者がアクセストークン、 認可コード、リフレッシュトークン、リソース所有者の パスワード、およびクライアントクレデンシャルを推測できないようにしなければなりません。¶
攻撃者が生成されたトークン (およびエンドユーザーが扱うことを意図していないその他のクレデンシャル)を推測する確率は、 2^(-128) 以下でなければならず、2^(-160) 以下であるべきです。¶
認可サーバーは、エンドユーザーによる使用を意図した クレデンシャルを保護するためにその他の手段を利用しなければなりません。¶
このプロトコルおよび類似プロトコルが広く普及すると、 エンドユーザーが、パスワードの入力を求められる Web サイトへ リダイレクトされる慣行に慣れきってしまう可能性があります。 エンドユーザーがクレデンシャルを入力する前に これらの Web サイトの真正性を慎重に確認しない場合、 攻撃者はこの慣行を悪用して、リソース所有者のパスワードや、 OTP などフィッシング可能なその他のクレデンシャルを 盗むことができます。¶
サービスプロバイダーは、フィッシング攻撃がもたらすリスクについて エンドユーザーを教育し、エンドユーザーがサイトの真正性を 容易に確認できるメカニズムを提供するよう努めるべきです。 たとえばフィッシング耐性のある認証器を使用できます。 フィッシング耐性のある認証器は、プラットフォームがサイトのオリジンを 正常に検証した場合にのみ、そのサイトへログインするための クレデンシャルをユーザーへ提供するためです。クライアント 開発者は、ユーザーエージェントとの対話方法 (たとえば外部、埋め込み)のセキュリティ上の影響、および エンドユーザーが認可サーバーの真正性を 検証できる能力を考慮すべきです。¶
認可サーバーがフィッシング耐性のある認証
方式を導入すると、攻撃者は認証手順ではなく
認可手順を標的に切り替える可能性があります。同意フィッシング攻撃では、
攻撃者は自身が制御するクライアントを
認可サーバーに登録し、被害者のリソースを標的とする
scope 値を持つ認可リクエストを作成し、その結果得られる
認可エンドポイント URL をフィッシングメッセージを通じて被害者へ送ります。
認可リクエストは正当な
認可サーバーによって処理されるため、リソース所有者は
フィッシング耐性のある要素を含めて通常どおり認証し、
その後、信頼できるように見える認可プロンプトを提示されます。
リソース所有者がリクエストを許可すると、攻撃者は
被害者のリソースへのアクセスを許可する認可コードまたは
アクセストークンを受け取ります。¶
重要なのは、フィッシング耐性のある認証器は 同意フィッシングから保護しないという点です。リソース所有者は、 正当な認可サーバーで正常に認証しています。 この攻撃は認証手順ではなく、その後の 同意手順を悪用します。¶
認可サーバーは、特定のクライアントが 要求を許可されるスコープを制限することを含め、 クライアント登録に対する制御を強制することを検討すべきです。 可能な場合、認可サーバーは、機密性の高いスコープへのアクセスを 許可する前にクライアント開発者の身元を検証すべきです。¶
認可サーバーは、認可プロンプトでリソース所有者に 明確で意味のある情報を提示すべきです。これには、 クライアント名、それを登録した開発者または組織、および 要求されている具体的なスコープを含め、リソース所有者がアクセスを 許可する前に十分な情報に基づいて判断できるようにします。 Dynamic Client Registration [RFC7591] を使用する場合のように クライアントの事前登録が不可能なシナリオ、または Client ID Metadata Document [I-D.ietf-oauth-client-id-metadata-document] を使用する場合のように クライアントメタデータが外部の主体から提供される可能性がある場合、 認可サーバーは、ユーザーが自身の認可しようとしているクライアントを 理解していることを確認するための追加措置を講じるべきです。¶
認可サーバーは、管理者およびリソース所有者が、 自身のリソースへのアクセスを許可されたクライアントの集合を確認し、 それらのグラントを取り消せるようにすべきです ([RFC7009] を参照)。 これにより、リソース所有者が騙されて悪意ある認可リクエストを 承認した場合でも、危険にさらされる期間を制限できます。¶
攻撃者は、被害者のデバイス上にある正当なクライアントの リダイレクト URI にリクエストを注入しようとする可能性があります。 たとえば、クライアントに攻撃者の制御下にあるリソースへアクセスさせることができます。 これは Cross-Site Request Forgery (CSRF) と呼ばれる攻撃の 一形態です。¶
従来の対策では、クライアントは
CSRF トークンとも呼ばれるランダムな値を state パラメーターで渡し、
説明されているように、リダイレクト URI へのリクエストを
ユーザーエージェントセッションに結び付けます。この
対策は 5.3.5節
of [RFC6819] で詳しく説明されています。
同じ保護は、code_verifier パラメーターまたは
OpenID Connect の nonce 値によっても提供されます。¶
CSRF 保護に state または
nonce の代わりに code_verifier を使用する場合、
次の点に注意することが重要です。¶
クライアントは、AS がクライアントの使用を意図する
code_challenge_method をサポートしていることを
確認しなければなりません。認可サーバーが要求された方式をサポートしていない場合、
代わりに state または nonce を CSRF 保護に
使用しなければなりません。¶
state をアプリケーション状態の伝達に使用し、
その内容の完全性が重要である場合、クライアントは
state を改ざんや入れ替えから保護しなければなりません。
これは state の内容をブラウザセッションに結び付ける、
および/または署名・暗号化された state 値
[I-D.bradley-oauth-jwt-encoded-state] を
使用することで実現できます。¶
したがって AS は、[RFC8414] に従った AS メタデータ、または サポートを保証または確認するためのデプロイメント固有の方法によって、 サポートするコードチャレンジ方式を検出できる手段を提供しなければなりません。¶
4.4.1.9節 of [RFC6819] で説明されているように、認可 リクエストは、ユーザーインターフェイスの偽装とも呼ばれる クリックジャッキング攻撃の影響を受ける可能性があります。このような攻撃では、 攻撃者が認可エンドポイントのユーザーインターフェイスを 無害に見えるコンテキスト内に埋め込みます。 ユーザーはそのコンテキストと対話していると思い、たとえば ボタンをクリックしますが、実際には意図せず 認可エンドポイントのユーザーインターフェイスと対話します。 逆のことも可能です。ユーザーが認可エンドポイントと 対話していると思っているときに、元のユーザーインターフェイスの上に 重ねられた攻撃者提供の入力フィールドへ 誤ってパスワードを入力する可能性があります。クリックジャッキング 攻撃は、たとえば他の要素の上にほぼ透明な iframe を 重ねることで、ユーザーが攻撃にほとんど気付けないように 設計できます。¶
攻撃者はこの攻撃ベクトルを使用して、ユーザーの認証 クレデンシャルを取得したり、クライアントに付与されるアクセスのスコープを変更したり、 ユーザーのリソースへアクセスしたりする可能性があります。¶
認可サーバーはクリックジャッキング攻撃を防止しなければなりません。
[RFC6819] では、
X-Frame-Options HTTP レスポンスヘッダーフィールドの使用や
frame-busting JavaScript など、複数の対策が説明されています。
それらに加えて、認可サーバーは Content Security Policy (CSP) level 2
[CSP-2] 以上も使用すべきです。¶
効果を得るため、CSP は認可エンドポイント、および 該当する場合はユーザーの認証やクライアントの認可に使用される その他のエンドポイント(たとえばデバイス認可エンドポイント、ログイン ページ、エラーページなど)で使用しなければなりません。 これにより、CSP をサポートするユーザーエージェントで、 許可されていないオリジンによるフレーム化を防止できます。 クライアントは、自身のリダイレクトエンドポイントで使用するオリジン以外の 一部のオリジンからフレーム化されることを許可してもかまいません。 このため、認可サーバーは、管理者が特定のクライアントに対して 許可されるオリジンを設定できるようにし、および/またはクライアントが それらを動的に登録できるようにすべきです。¶
CSP を使用すると、認可サーバーは単一のレスポンスヘッダー
フィールドで複数のオリジンを指定し、柔軟なパターンを使用して
それらを制約できます(詳細は [CSP-2] を参照)。
この標準の Level 2 は、フレームのオリジンを制限するポリシー
(frame-ancestors を使用)と、
HTML ページ上で実行を許可するスクリプトのソースを制限するポリシー
(script-src を使用)を組み合わせることで、
クリックジャッキングから保護する堅牢なメカニズムを提供します。
このようなポリシーの非規範的な例を次に示します。¶
HTTP/1.1 200 OK Content-Security-Policy: frame-ancestors https://ext.example.org:8000 Content-Security-Policy: script-src 'self' X-Frame-Options: ALLOW-FROM https://ext.example.org:8000 ...¶
一部のユーザーエージェントは [CSP-2] をサポートしていないため、 認可サーバーがそのようなレガシーユーザーエージェントを明示的に サポート対象外としていない限り、この手法は [RFC6819] で説明されているものを含む その他の手法と組み合わせるべきです。そのような場合でも、 追加の対策を引き続き講じるべきです。¶
インジェクション攻撃は、入力値またはその他の外部 変数がアプリケーションによってサニタイズされずに使用され、 アプリケーションロジックの変更を引き起こす場合に発生します。 これにより、攻撃者がアプリケーションのデバイスまたはそのデータへの アクセスを取得したり、サービス拒否を引き起こしたり、 幅広い悪意ある副作用を発生させたりできる可能性があります。¶
認可サーバーとクライアントは、受信したパラメーターを
潜在的に悪意ある外部入力として扱い、適切な保護を適用しなければなりません。
特に state および redirect_uri パラメーターの値に
注意する必要があります。¶
オープンリダイレクターとは、クエリパラメーターから取得した 任意の URI へユーザーのブラウザを転送するエンドポイントです。 このようなエンドポイントは、たとえばユーザーを外部 Web サイトへ リダイレクトする前にメッセージを表示したり、 ログインプロンプトなどによって中断される前に ユーザーが訪問しようとしていた URL へ戻したりするために 実装されることがあります。¶
AS またはクライアントがオープンリダイレクターを持つ場合、 次の攻撃が発生する可能性があります。¶
クライアントはオープンリダイレクターを公開してはなりません。 攻撃者はオープンリダイレクターを使用してクライアントを指す URL を作成し、 4.1.1節 of [RFC9700] で説明されているように、それを利用して認可コードを 流出させる可能性があります。 別の悪用例として、クライアントを指しているように見える URL を作成できます。 これにより、ユーザーがその URL を信頼してブラウザでアクセスするよう 騙される可能性があります。これはフィッシングに悪用できます。¶
オープンリダイレクトを防止するため、クライアントは、 対象 URL が許可リストに含まれている場合、またはリクエストの オリジンと完全性を認証できる場合にのみリダイレクトすべきです。 オープンリダイレクトへの対策は OWASP [owasp_redir] で説明されています。¶
ロードバランサーを利用するものを含む一部のデプロイメントでは、 リソースサーバーへの TLS 接続が、実際に リソースを提供するサーバーより前で終端します。これにより、 TLS 接続が終端するフロントエンドサーバーと、 リソースを提供するバックエンドサーバーの間でトークンが 保護されない可能性があります。このようなデプロイメントでは、 フロントエンドサーバーとバックエンドサーバーの間で アクセストークンの機密性を保証するための十分な措置を 講じなければなりません。トークンの暗号化はそのような措置の1つです。¶
Mix-Up は、OAuth クライアントが2つ以上の 認可サーバーと対話し、そのうち少なくとも1つの認可 サーバーが攻撃者の制御下にあるシナリオに対する攻撃です。 たとえば、攻撃者が動的登録を使用して自身の認可サーバーに クライアントを登録した場合や、認可サーバーが侵害された場合に 発生する可能性があります。¶
OAuth クライアントが1つの認可サーバーとのみ対話できる場合、 Mix-Up 防御は必要ありません。一方、OAuth クライアントが2つ以上の 認可サーバーと対話するシナリオでは、クライアントは Mix-Up 攻撃を 防止しなければなりません。以下では2つの異なる方法について説明します。¶
両方の防御方式について、クライアントは各認可リクエストごとに、 認可リクエストを送信した発行者を保存し、その情報を ユーザーエージェントに結び付け、認可レスポンスが正しい発行者から 受信されたことを確認しなければなりません。クライアントは、 該当する場合、その後のアクセストークンリクエストが 同じ発行者へ送信されることを保証しなければなりません。 発行者は、関連するメタデータを介して、フローで使用される 認可エンドポイントとトークンエンドポイントの組み合わせを表す 抽象的な識別子として機能します。たとえば OAuth 2.0 Authorization Server Metadata [RFC8414] も OpenID Connect Discovery [OpenID.Discovery] も使用されていない場合など、 発行者識別子が利用できない場合は、この組のための別の一意な識別子、 または組自体を代わりに使用できます。説明を簡潔にするため、 以下ではこのようなデプロイメント固有の識別子も発行者 (または発行者識別子)に含めて扱います。¶
注: 認可サーバー URL を保存するだけでは、 Mix-Up 攻撃を識別するのに十分ではありません。攻撃者は、 侵害されていない AS の認可エンドポイント URL を「自身の」AS URL として宣言しつつ、 自身の制御下にあるトークンエンドポイントを宣言する可能性があります。¶
複数種類の Mix-Up 攻撃の詳細な説明については、 4.4節 of [RFC9700] を参照してください。¶
この防御では、認可サーバーが認可レスポンスで クライアントに送信する発行者識別子の値をクライアントが比較する必要があります。 認可レスポンスを受信したとき、クライアントは 受信した発行者識別子と保存済みの発行者識別子を比較しなければなりません。 一致しない場合、クライアントは 相互作用を中止しなければなりません。¶
この発行者識別子をクライアントへ伝達する方法には いくつかあります。¶
OpenID Connect を使用し、認可
レスポンスで ID Token が返される場合、クライアントは
ID Token 内の iss claim を評価できます。¶
どちらの場合も、iss 値は
[RFC9207] に従って評価しなければなりません。¶
この防御では、発行者情報を伝達するために 追加のパラメーターを使用する必要がある場合がありますが、 Mix-Up に対する堅牢で比較的単純な防御です。¶
この防御では、クライアントは対話する発行者ごとに 異なるリダイレクト URI を使用しなければなりません。¶
クライアントは、発行者用の固有のリダイレクト URI と 認可レスポンスを受信した URI を比較することにより、 認可レスポンスが正しい発行者から受信されたことを 確認しなければなりません。一致しない場合、クライアントは フローを中止しなければなりません。¶
この防御は既存の OAuth 機能を利用しますが、 クライアントが多数の異なる発行者を使用するために1回だけ登録する シナリオ(一部のオープンバンキング方式など)では使用できません。 また、クライアント登録と密接に統合されているため、 自動的にデプロイすることがより困難です。¶
さらに、攻撃者は、クライアントが攻撃者の AS に 割り当てたリダイレクト URI を使用して「正当な」AS に新しいクライアントを 登録することで、この防御が提供する保護を回避できる可能性があります。 その後攻撃者は、クライアント ID を新たに作成したクライアントの クライアント ID に置き換えて、上記の攻撃を実行できます。¶
したがって、この防御は他の選択肢が利用できない場合にのみ 使用すべきです。¶
ネイティブアプリケーションは、リソース所有者が使用するデバイスに インストールされ実行されるクライアントです(すなわち、デスクトップアプリケーションまたは ネイティブモバイルアプリケーション)。ネイティブアプリケーションでは、 セキュリティ、プラットフォーム機能、および全体的なエンドユーザー 体験に関連する特別な考慮が必要です。¶
この節の指針は、主としてデスクトップアプリではなく ネイティブモバイルアプリを対象としています。ここで説明する OAuth フローに 関連してアプリ開発者に提供される機能という点では、 ネイティブモバイルプラットフォームの方がデスクトッププラットフォームより 成熟しています。この指針は主にモバイルアプリに焦点を当てていますが、 その多くは一般的にデスクトップアプリにも適用できます。¶
認可エンドポイントでは、クライアントと リソース所有者のユーザーエージェントの間で相互作用が必要です。 現在のベストプラクティスは、OAuth 認可リクエストを 埋め込みユーザーエージェント(Web View で実装されたものなど)ではなく、 外部ユーザーエージェント(通常はブラウザ)で実行することです。¶
ネイティブアプリケーションは、 認可サーバーからのレスポンスを複数の異なる方法で取得でき、 それぞれ異なるセキュリティ特性を持ちます。たとえば、 「アプリ宣言済み URL」を持つリダイレクト URI や、 オペレーティングシステムに登録されたカスタム URL スキームを使用して クライアントをハンドラーとして起動する方法、クレデンシャルを手動でコピー&ペーストする方法、 ローカル Web サーバーを実行する方法、ユーザーエージェント拡張をインストールする方法、 またはクライアントの制御下にあるサーバーでホストされた リソースを識別するリダイレクト URI を提供し、そのリソースから ネイティブアプリケーションにレスポンスを提供する方法などがあります。¶
以前は、ネイティブアプリが OAuth 認可 リクエストに埋め込みユーザーエージェント (一般に Web View で実装)を使用することが一般的でした。 この方式には、ホストアプリがユーザーのクレデンシャルや Cookie を コピーできることや、ユーザーがアプリごとに最初から 認証し直す必要があることなど、多くの欠点があります。 OAuth で埋め込みユーザーエージェントを使用することの欠点に関する 詳細な分析については、8.5.1節 を参照してください。¶
システムブラウザを使用するネイティブアプリの認可リクエストは より安全であり、デバイス上にあるユーザーの認証状態を利用できます。 ブラウザ内の既存の認証セッションを利用できることで シングルサインオンが可能になります。認可サーバーのポリシーで 必要とされない限り、ユーザーは新しいアプリを使用するたびに 認可サーバーで認証する必要がないためです。¶
ネイティブアプリとブラウザの間の認可フローは、 OAuth プロトコル自体を変更せずにサポートできます。 OAuth の認可リクエストとレスポンスはすでに URI の観点で 定義されているためです。これには、アプリ間通信に使用できる URI も含まれます。 すべてのクライアントが confidential Web クライアントであると想定している 一部の OAuth サーバー実装では、このベストプラクティスをサポートするために、 public なネイティブアプリクライアントと、それらが使用する リダイレクト URI の種類について理解する必要があります。¶
複数のユーザーへ配布されるアプリの一部として
静的に含まれる秘密は、機密性のある秘密ではありません。
あるユーザーが自身のコピーを調べて共有秘密を知ることができるためです。
このため、認可サーバーは、共有秘密を使用したネイティブアプリクライアントの
クライアント認証を要求してはなりません。
これは、client_id リクエストパラメーターですでに提供されている
クライアント識別以上の価値を持たないためです。¶
ネイティブアプリクライアントに静的に含まれる共有秘密を なお要求する認可サーバーは、そのクライアントを public クライアント(2.1節 で定義)として 扱い、その秘密をクライアントの身元の証明として 受け入れてはなりません。追加の措置がなければ、 このようなクライアントはクライアントのなりすましの影響を受けます (7.3.1節 を参照)。¶
インスタンスごとのクレデンシャルをプロビジョニングするために Dynamic Client Registration [RFC7591] のようなメカニズムを 使用する場合を除き、ネイティブアプリは 2.1節 で定義されている public クライアントとして分類され、 認可サーバーにもそのように登録しなければなりません。 認可サーバーは、クライアントの種類を識別し、それに応じて リクエストを処理できるようにするため、 クライアント登録の詳細にクライアントタイプを記録しなければなりません。¶
ドラフト仕様 [I-D.ietf-oauth-attestation-based-client-auth] では、ネイティブアプリが認可サーバーまたは リソースサーバーに対して認証するための、鍵に結び付けられた アテステーションを取得するために使用できるメカニズムを定義しています。 これにより、モバイルアプリの身元について より高い保証レベルを提供できます。¶
Web 上の OAuth で、認可リクエストを開始し、 認可レスポンスを要求元の Web サイトへ返すために URI が使用されるのと同様に、 ネイティブアプリでも URI を使用して、 デバイスのブラウザで認可リクエストを開始し、 レスポンスを要求元のネイティブアプリへ返すことができます。¶
Web 上の OAuth と同じ方法を採用することで、 シングルサインオンセッションの使いやすさや、 分離された認証コンテキストのセキュリティといった Web コンテキストでの利点を、 ネイティブアプリのコンテキストでも同様に得られます。 同じアプローチを再利用することで、特定のプラットフォームに固有ではない 標準ベースの Web フローに依存できるため、 実装の複雑さも低減され、相互運用性も向上します。¶
ネイティブアプリは OAuth 認可リクエストを実行するために、 外部ユーザーエージェントを使用しなければなりません。これは、 ブラウザで認可リクエストを開き (8.3節 で詳述)、 認可レスポンスをネイティブアプリへ戻す リダイレクト URI(8.4節 で定義)を 使用することで実現します。¶
埋め込みユーザーエージェントは、技術的には ネイティブアプリを認可するために使用可能な方法です。 ただし、このような埋め込みユーザーエージェントは、 埋め込みユーザーエージェントをホストするアプリが、 アプリ向けの OAuth 認可グラントだけでなく、 ユーザーの完全な認証クレデンシャルにもアクセスできるため、 定義上、認可サーバーに対する第三者による使用には安全ではありません。 また通常はオペレーティングシステムによってサンドボックス化され、 Web オリジンに依存する WebAuthn などのメカニズムは無効になります。¶
一般的な Web View ベースの埋め込みユーザーエージェント実装では、 ホストアプリケーションはログインフォームへ入力されたすべてのキーストロークを 記録してユーザー名とパスワードを取得したり、 フォームを自動送信してユーザーの同意を回避したり、 セッション Cookie をコピーしてユーザーとして認証済み操作を 実行したりできます。¶
認可サーバーと同じ主体に属する信頼されたアプリによって 使用される場合でも、埋め込みユーザーエージェントは 必要以上に強力なクレデンシャルへアクセスできるため、 最小権限の原則に違反し、攻撃対象領域を増加させる可能性があります。¶
通常のアドレスバーやブラウザが備える可視の証明書検証機能がない 埋め込みユーザーエージェントにユーザーがクレデンシャルを入力することを 奨励すると、ユーザーは正当なサイトにサインインしているかどうかを 判断できなくなります。実際に正当なサイトであったとしても、 サイトを事前に検証せずにクレデンシャルを入力してよいという習慣を ユーザーに身に付けさせてしまいます。¶
セキュリティ上の懸念とは別に、埋め込みユーザーエージェントは 他のアプリやブラウザと認証状態を共有しないため、 認可リクエストごとにユーザーがログインする必要があり、 一般に劣ったユーザー体験とみなされます。¶
認可リクエストを開始するネイティブアプリは、 ユーザーインターフェイスを大きく制御できるため、 偽の外部ユーザーエージェント、すなわち 外部ユーザーエージェントのように見せかけた埋め込みユーザーエージェントを 提示できる可能性があります。¶
すべての善良な主体が外部ユーザーエージェントを使用している場合、 外部ユーザーエージェントを偽装する主体は明らかに悪意があるため、 セキュリティ専門家が悪意ある主体を検出できるという利点があります。 一方、善良な主体も悪意ある主体も埋め込みユーザーエージェントを 使用している場合、悪意ある主体は何も偽装する必要がなく、 検出が難しくなります。悪意あるアプリが検出された後は、 この情報を使用して、マルウェアスキャンソフトウェアで アプリの署名をブラックリスト化したり、 (アプリストアで配布されるアプリの場合は)削除措置を講じたり、 その他の方法で悪意あるアプリの影響と拡散を 抑制できる可能性があります。¶
認可サーバーは、真の外部ユーザーエージェントでのみ 利用可能な認証要素を要求することで、偽の外部 ユーザーエージェントから直接保護することもできます。¶
アプリ内ブラウザタブを使用する際のセキュリティを 特に懸念するユーザーは、追加の措置として、 アプリ内ブラウザタブからリクエストを完全なブラウザで開き、 そこで認可を完了することもできます。 アプリ内ブラウザタブパターンのほとんどの実装は、 このような機能を提供しています。¶
悪意あるアプリが、オペレーティングシステムで
https スキーム URI のデフォルトハンドラーとして自身を
設定できる場合、デフォルトブラウザを使用する認可リクエストを
傍受し、この信頼された立場を悪用して、
ユーザーへのフィッシングなど悪意ある目的を実行できます。¶
この攻撃は OAuth に限定されません。
このように設定された悪意あるアプリは、
ネイティブアプリによる OAuth の使用を超えて、
ユーザーに一般的かつ継続的なリスクをもたらします。
多くのオペレーティングシステムは、
http および https スキーム URI のデフォルト
ハンドラーを変更する際に明示的なユーザー操作を要求することで、
この問題を緩和しています。¶
ループバックインターフェイスのリダイレクト URI は
http スキーム(すなわち TLS なし)を
使用してもかまいません。HTTP リクエストがデバイスの外へ
出ることがないため、ループバックインターフェイスの
リダイレクト URI ではこれは許容されます。¶
クライアントは、認可リクエストを開始するときにのみ ネットワークポートを開き、レスポンスが返されたら 閉じるべきです。¶
クライアントは、他のネットワーク主体による干渉を避けるため、 ループバックネットワークインターフェイス上だけで 待ち受けるべきです。¶
クライアントは、8.4.2節 で説明されているように、
文字列 localhost ではなく
ループバック IP リテラルを使用すべきです。¶
ブラウザベースアプリは Web ブラウザ内で動作するクライアントで、 通常は JavaScript で記述され、「シングルページアプリ」とも呼ばれます。 この種類のアプリには、ネイティブアプリと類似した 特有のセキュリティ上の考慮事項があります。¶
TODO: ブラウザベースアプリ BCP が確定したら、その規範的なテキストを取り込む。¶
このドラフトは、OAuth 2.0 [RFC6749]、 OAuth 2.0 for Native Apps [RFC8252]、 Proof Key for Code Exchange [RFC7636]、 OAuth 2.0 for Browser-Based Apps [I-D.ietf-oauth-browser-based-apps]、 OAuth Security Best Current Practice [RFC9700]、 および Bearer Token Usage [RFC6750] の機能を統合します。¶
後続のドラフトが元の [RFC6749] にある機能を更新または廃止している場合、このドラフト内のその機能は 後続のドラフトで説明されている規範的な変更によって更新されるか、完全に削除されます。¶
OAuth 2.0 からの変更点の非規範的な一覧を以下に示します。¶
認可コードグラントは PKCE [RFC7636] の機能によって拡張され、 この仕様に従って認可コードグラントを使用するデフォルトの方式では PKCE パラメーターの追加が必要になります。¶
リダイレクト URI は、4.1.3節 of [RFC9700] に従って 厳密な文字列一致を使用して比較しなければなりません。¶
Implicit グラント(response_type=token)は、
2.1.2節 of
[RFC9700] に従って
この仕様から省略されています。¶
Resource Owner Password Credentials グラントは、 2.4節 of [RFC9700] に従って この仕様から省略されています。¶
Bearer トークンの使用では、 4.3.2節 of [RFC9700] に従って URI のクエリ文字列での Bearer トークンの使用を省略しています。¶
public クライアント向けのリフレッシュトークンは、 4.14.2節 of [RFC9700] に従って、 送信者制約付きまたは1回限りの使用のいずれかでなければなりません。¶
認可コードを含むトークンエンドポイントリクエストには、
redirect_uri パラメーターが含まれなくなりました。¶
認可サーバーは、リクエスト本文内のクライアントクレデンシャルをサポートしなければなりません。¶
PKCE の plain 方式は削除されています。¶
OAuth 2.0 Implicit グラントは、 [RFC9700] で非推奨とされたため、OAuth 2.1 から省略されています。¶
Implicit グラントを削除する目的は、認可レスポンスでアクセストークンを
発行しないようにすることです。このようなトークンは漏えいや
インジェクションに対して脆弱であり、クライアントへの送信者制約を適用できないためです。
この動作は、クライアントが response_type=token パラメーターを使用することで示されていました。
response_type パラメーターのこの値は OAuth 2.1 では定義されなくなりました。¶
response_type=token の削除は、
認可エンドポイントから他のアーティファクトを返すその他の拡張
レスポンスタイプには影響しません。たとえば、[OpenID.Connect] で定義されている
response_type=id_token です。¶
OAuth 2.0 では、認可コード
フローにおけるトークンエンドポイントへのリクエスト(4.1.3節 of [RFC6749])には、
任意の redirect_uri パラメーターが含まれます。このパラメーターは
認可コードインジェクション攻撃を防止することを目的としており、元の認可リクエストで redirect_uri パラメーター
が送信された場合には必須でした。認可リクエストでは、特定の
クライアントに複数のリダイレクト URI が登録されている場合にのみ
redirect_uri パラメーターが必須でした。しかし実際には、多くの認可サーバー実装が、
登録済み URI が1つしかない場合でも認可リクエストで
redirect_uri パラメーターを要求していたため、トークンエンドポイントでも
redirect_uri パラメーターが必須になっていました。¶
OAuth 2.1 では、認可コードインジェクションは
code_challenge および code_verifier パラメーターによって防止されるため、
トークンリクエストに redirect_uri パラメーターを含めても意味がありません。そのため、このパラメーターは
削除されました。¶
OAuth 2.0 と OAuth 2.1 の両方のクライアントをサポートしたい
認可サーバーの後方互換性のため、認可サーバーはクライアントが
トークンリクエスト(4.1.3節)で
redirect_uri パラメーターを送信することを許可しなければならず、
[RFC6749]
で説明されているとおりにそのパラメーターを適用しなければなりません。認可サーバーは
リクエスト内の client_id を使用して、古い OAuth 2.0 の動作を使用することが
分かっている特定のクライアントに対してこの動作を適用するかどうかを判断できます。¶
OAuth 2.1 の推奨事項のみに従うクライアントは、
トークンリクエストで redirect_uri を送信しないため、トークンリクエストでそのパラメーターを
期待する認可サーバーとは互換性がありません。¶
この文書では IANA による作業は必要ありません。¶
参照されるすべてのレジストリは [RFC6749] およびこの作業の基礎となっている関連文書によって定義されています。 この仕様では、それらのレジストリを変更する必要はありません。¶
この節では、[RFC5234] の 表記を使用して、この仕様で定義される要素の Augmented Backus-Naur Form (ABNF) 構文を 説明します。以下の ABNF は Unicode コードポイント [W3C.REC-xml-20081126] に基づいて定義され、 これらの文字は通常 UTF-8 でエンコードされます。要素は最初に定義された順序で示されます。¶
以下の定義の一部では、[RFC3986] の "URI-reference" 定義を使用します。¶
以下の定義の一部では、次の共通定義を使用します。¶
VSCHAR = %x20-7E NQCHAR = %x21 / %x23-5B / %x5D-7E NQSCHAR = %x20-21 / %x23-5B / %x5D-7E¶
client_id 要素は 2.4.1節 で定義されています。¶
client-id = *VSCHAR¶
client_secret 要素は 2.4.1節 で定義されています。¶
client-secret = *VSCHAR¶
response_type 要素は 4.1.1節 および 6.4節 で定義されています。¶
response-type = response-name *( SP response-name ) response-name = 1*response-char response-char = "_" / DIGIT / ALPHA¶
scope = scope-token *( SP scope-token ) scope-token = 1*NQCHAR¶
redirect_uri 要素は 4.1.1節 および 4.1.3節 で定義されています。¶
redirect-uri = URI-reference¶
error_description 要素は 4.1.2.1節、
3.2.4節、および 5.3節 で定義されています。¶
error-description = 1*NQSCHAR¶
grant_type 要素は 3.2.2節 で定義されています。¶
grant-type = grant-name / URI-reference grant-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
access_token 要素は 3.2.3節 で定義されています。¶
access-token = 1*VSCHAR¶
token_type 要素は 3.2.3節 および 6.1節 で定義されています。¶
token-type = type-name / URI-reference type-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
expires_in 要素は 3.2.3節 で定義されています。¶
expires-in = 1*DIGIT¶
新しいエンドポイントパラメーターの構文は 6.2節 で定義されています。¶
param-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
code_verifier の ABNF は次のとおりです。¶
code-verifier = 43*128unreserved unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" ALPHA = %x41-5A / %x61-7A DIGIT = %x30-39¶
code_challenge の ABNF は次のとおりです。¶
code-challenge = 43*128unreserved unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" ALPHA = %x41-5A / %x61-7A DIGIT = %x30-39¶
[RFC6749] の公開時点では、
application/x-www-form-urlencoded メディアタイプは
[W3C.REC-html401-19991224]
の17.13.4節で定義されていましたが、
IANA MIME Media Types レジストリ
(http://www.iana.org/assignments/media-types)には登録されていませんでした。
さらに、その
定義は US-ASCII 以外の
文字を考慮していないため不完全です。¶
このメディア タイプを使用してコンテンツを生成する際にこの欠点へ対処するため、名前と値はまず UTF-8 文字エンコーディング方式 [RFC3629] を使用して エンコードしなければなりません。その結果得られるオクテット列は、 [W3C.REC-html401-19991224] で定義されている エスケープ規則を使用してさらにエンコードする必要があります。¶
このメディアタイプを使用するコンテンツからデータを解析する場合、 名前/値エンコードを逆変換して得られる名前と 値は、その結果オクテット列として扱い、 UTF-8 文字エンコーディング方式を使用してデコードする必要があります。¶
たとえば、6つの Unicode コードポイント (1) U+0020 (SPACE)、(2) U+0025 (PERCENT SIGN)、 (3) U+0026 (AMPERSAND)、(4) U+002B (PLUS SIGN)、 (5) U+00A3 (POUND SIGN)、および (6) U+20AC (EURO SIGN) から構成される値は、 次のオクテット列にエンコードされます(16進表記を使用)。¶
20 25 26 2B C2 A3 E2 82 AC¶
そして、コンテンツ内では次のように表されます。¶
+%25%26%2B%C2%A3%E2%82%AC¶
この仕様のさまざまなメッセージは、以下で説明する方式のいずれかを使用して シリアル化されます。この節では、これらのシリアル化方式の構文を説明します。その他の節では、 それらをいつ使用でき、また使用しなければならないかを説明します。すべての方式をすべてのメッセージに使用できるわけではないことに注意してください。¶
クエリ文字列シリアル化を使用してパラメーターをシリアル化するため、 クライアントは、[WHATWG.URL] で定義されている application/x-www-form-urlencoded 形式を使用して、URL のクエリコンポーネントにパラメーターと値を追加することにより 文字列を構築します。クエリ文字列シリアル化は通常、HTTP GET リクエストで使用されます。¶
パラメーターとその値は、付録 B で定義されている application/x-www-form-urlencoded 形式を使用して、HTTP リクエストのエンティティ本文にパラメーター名と値を追加することでフォームシリアル化されます。 フォームシリアル化は通常 HTTP POST リクエストで使用されます。¶
パラメーターは、それぞれのパラメーターを 最上位の構造レベルに追加することで、JSON [RFC8259] オブジェクト構造にシリアル化されます。 パラメーター名と文字列値は JSON 文字列として表されます。 数値は JSON 数値として表されます。Boolean 値は JSON Boolean として表されます。特に指定がない限り、省略されたパラメーターおよび値のないパラメーターは オブジェクトから省略すべきであり、JSON null 値として表すべきではありません。パラメーターは JSON オブジェクトまたは JSON 配列を値として持ってもかまいません。パラメーターの順序は重要ではなく、変化してもかまいません。¶
公開時点で十分に確立されている拡張の一覧を以下に示します。¶
Token Revocation 拡張は、 アクセストークンが不要になったことをクライアントが認可サーバーへ示すためのメカニズムを定義します。¶
Dynamic Client Registration は、 認可サーバーにクライアントをプログラムによって登録するためのメカニズムを提供します。¶
Token Introspection 拡張は、 リソースサーバーがアクセストークンに関する情報を取得するためのメカニズムを定義します。¶
Authorization Server Metadata(OAuth Discovery とも呼ばれます)は、 特定の OAuth サーバーと対話するために必要な情報、 たとえば認可エンドポイントやトークンエンドポイントの場所、 サポートされるグラントタイプなどをクライアントが検索するために使用できるエンドポイントを定義します。¶
[RFC8628]: OAuth 2.0 デバイス認可グラント¶
Device Authorization Grant(以前は Device Flow と呼ばれていました)は、ブラウザを持たない、または入力機能が限定されたデバイスが アクセストークンを取得できるようにする拡張です。これは、スマート TV アプリや、 ストリーミング動画サービスへ動画をストリームできる ハードウェアビデオエンコーダーなどのデバイスで一般に使用されます。¶
Mutual TLS は、TLS 証明書認証を介して、 トークンをそれが発行されたクライアントに結び付けるメカニズムと、 クライアント認証メカニズムを説明します。¶
クライアントが、要求しているアクセストークンを どこで使用する予定なのかを認可サーバーへ明示的に示す方法を提供します。¶
[RFC9068]: OAuth 2.0 アクセストークン向け JSON Web Token (JWT) プロファイル¶
この仕様は、JSON Web Token (JWT) 形式で OAuth アクセス トークンを発行するためのプロファイルを定義します。¶
[RFC9126]: Pushed Authorization Requests¶
Pushed Authorization Requests 拡張は、 バックチャネルから OAuth フローを開始する手法を説明し、より優れたセキュリティと 複雑な認可リクエストを構築するための高い柔軟性を提供します。¶
認可レスポンス内の iss パラメーターは、
クライアントでの Mix-Up 攻撃を防ぐために認可サーバーの身元を示します。¶
[RFC9396]: Rich Authorization Requests¶
Rich Authorization Requests は、
OAuth 認可リクエスト内で細粒度の認可データを運ぶために使用される新しいパラメーター
authorization_details を規定します。¶
[RFC9449]: Demonstrating Proof of Possession (DPoP)¶
DPoP は、アプリケーションレベルの proof-of-possession メカニズムを介して OAuth 2.0 トークンを送信者に制約するためのメカニズムを説明します。¶
[RFC9470]: Step-Up 認証チャレンジプロトコル¶
Step-Up Auth は、現在のリクエストのアクセストークンに 関連付けられた認証イベントが自身の認証要件を満たしていないことを リソースサーバーがクライアントへ通知するために使用できるメカニズムを説明します。¶
この仕様は OAuth Working Group の成果であり、その出発点は 次の仕様の内容に基づいていました。OAuth 2.0 Authorization Framework (RFC 6749)、 OAuth 2.0 for Native Apps (RFC 8252)、OAuth Security Best Current Practice、および OAuth 2.0 for Browser-Based Apps。編集者は、この仕様の基礎となったそれらの 仕様の作成に関わったすべての方々に感謝します。¶
編集者はまた、この版の仕様を形作るうえで役立ったアイデア、 フィードバック、修正、および文言を提供してくださった次の方々にも感謝します。Andrii Deinega, Bob Hamburg, Brian Campbell, Daniel Fett, Deng Chao, Emelia Smith, Falko, Filip Skokan, Goutam Adwant, Joseph Heenan, Justin Richer, Karsten Meyer zu Selhausen, Michael Jones, Michael Peck, Roberto Polli, Tim Würtele and Vittorio Bertocci.¶
この仕様に関する議論は、2021年および2022年の OAuth Security Workshop でも行われました。著者は、協力とコミュニティからの意見に適したイベントを開催してくださった ワークショップの主催者(Guido Schmitz, Steinar Noem, and Daniel Fett)に感謝します。¶
[[ 最終仕様から削除予定 ]]¶
-16¶
PKCE plain 方式を削除¶
認可エンドポイント定義の節で PAR に言及¶
OAuth 同意フィッシングに関するセキュリティ考慮事項の節を追加¶
iss レスポンスパラメーターを AS が送信することを必須に変更
(Mix-Up 緩和策は引き続きクライアントが選択可能)¶
値の長さに関する記述を新しい「値のサイズ」 節に統合¶
認可エンドポイントのエラーレスポンス動作を明確化¶
-15¶
JWT クライアント認証に関する追加の文脈を追加し、特に RFC7523bis を推奨¶
編集上の明確化と更新¶
認可エンドポイントおよびトークンエンドポイントのエラーレスポンスを明確化¶
AS のオープンリダイレクトに関する考慮事項について RFC9700 の文言と同期¶
RFC6750 の正誤表 3500 および 6613 を適用¶
重複パラメーターに関する曖昧性を解消¶
-14¶
編集上の明確化¶
"relying party" と "resource server" の取り違えを1箇所修正¶
RFC7591 の client_secret_post および
client_secret_basic 用語への参照を追加¶
"sanitize" という文言を、信頼できない入力として扱うという文言に置換¶
ネイティブアプリの指針が主にモバイルアプリ プラットフォームに適用されることを明確化¶
AS が public または confidential クライアントを特にサポートしなければならないという要件がないことを明確化¶
-13¶
-12¶
OpenID Federation やオープンエコシステムで使用される方式など、 代替登録方式をより適切に反映するようクライアント登録に関する文言を更新¶
拡張の付録に DPoP と Step-Up Auth を追加¶
auth scheme の大文字小文字非区別性について、ABNF ではなく HTTP への参照に更新¶
"relying party" と "client" の取り違えを1箇所修正¶
client_id 要件を個別のグラントタイプへ移動¶
シリアル化方式の説明を付録に統合¶
-11¶
Bearer が大文字と小文字を区別しないことを明示的に記載¶
既知のスコープと競合するカスタムスコープの定義を避けることを推奨¶
HTTP Basic 認証のエンコード相互運用性問題を避けるため、 リクエスト本文内のクライアントクレデンシャルのサポートを必須に変更¶
-10¶
client id が不透明な文字列であることを明確化¶
拡張がリソースリクエストに追加のエラーコードを定義できるように変更¶
error フィールド定義の書式を改善¶
"scope" 定義を導入節へ移動し拡充¶
アクセストークン節を構造とリクエストに分割¶
RFC7235 との整合性のため b64token を token68 に改名¶
application/x-www-form-urlencoded に関する旧付録 B の内容を復元¶
クライアントがアクセストークンを解析してはならないことを明確化¶
認可リクエストで redirect_uri パラメーターが必要となる場合についての記述を拡充¶
一貫性のため、リフレッシュトークン節の "permissions" を "privileges" に変更¶
認可コードフローのセキュリティに関する考慮事項を統合¶
認可コードの再利用を明確化 - 認可コードはアクセストークンを1回だけ取得できる¶
-09¶
AS は認可エンドポイントで CORS リクエストをサポートしてはならない¶
非対称クライアント認証について詳細を追加¶
CSRF の説明を Security BCP と同期¶
送信者制約付きアクセストークンの節を更新して移動¶
リソース所有者になりすますクライアントに関する内容を Security BCP と同期¶
リダイレクト URI 登録節から認可リクエストへの参照を追加¶
リフレッシュローテーション節を Security BCP と同期¶
リダイレクト URI 一致に関する記述を Security BCP と同期¶
RAR (RFC9396) への参照を更新¶
URI に関する明確化¶
トークンリクエストから redirect_uri を削除¶
code_verifier に関するセキュリティ考慮事項を拡充¶
導入節を改訂¶
-08¶
謝辞を更新¶
client ID 定義の "by a trusted party" を "by an outside party" に置換¶
"verify the identity of the resource owner" を "authenticate" に置換¶
RFC6819 と一致するようリフレッシュトークンローテーションを明確化¶
application/x-www-form-urlencoded の例を収録する付録を追加¶
付録内の項目への参照を修正¶
Security BCP の新しい "Phishing via AS" 節を取り込み¶
クライアント認証の動機に関する説明を言い換え¶
OAuth 2.0 と一致するよう、トークンリクエストの "scope" パラメーターを個別のグラントタイプへ移動¶
Security BCP の最新版から Clickjacking および Open Redirection の説明を更新¶
規範要件を認可コードのセキュリティ考慮事項の節から移動¶
セキュリティに関する考慮事項を明確化し、重複する節を削除¶
-07¶
概要から "third party" を削除¶
導入部に追加の動機として MFA とパスワードレスを追加¶
リダイレクト URI 登録を行う方法の1つとして PAR に言及¶
トークンエンドポイントで CORS ヘッダーを必須とすることへの参照を追加¶
OMAP 拡張への参照を更新¶
シーケンス図の番号付けを修正¶
-06¶
"credentialed client" という用語を削除¶
"confidential" および "public" クライアントの定義を簡素化¶
RFC9207 を参照する iss レスポンスパラメーターを取り込み¶
RS によるアクセストークン検証の節を追加¶
認可サーバーがネイティブアプリ向けの3つすべてのリダイレクト方式をサポートするという要件を削除¶
一部の参照を修正¶
HTTP への参照を RFC 9110 に更新¶
"authorization grant" という用語を明確化¶
client credential グラントの使用法を明確化¶
認可コード図を整理¶
application/x-www-form-urlencoded への参照を更新し、 IANA レジストリに存在しないという古い注記を削除¶
-05¶
Implicit フローの削除に関する節を追加¶
多くの規範要件をセキュリティ考慮事項から適切な本文の節へ移動¶
TLS に関する文言を再編成して統合¶
localhost/カスタム URL スキームを除き、リダイレクト URI で TLS を必須化¶
Security BCP と一致するようリフレッシュトークンの指針を更新¶
-04¶
-03¶
4節ですべてのグラントタイプを同じ最上位見出しの下にまとめるようリファクタリング¶
規範テキストとセキュリティ考慮事項のテキストを適切な場所へより明確に分離し、 実際にはセキュリティ考慮事項であったテキストを文書本体から移動するとともに、 セキュリティ考慮事項の節から規範要件を本文の適切な箇所へ移動¶
RFC6749 の公開済み正誤表の多くを取り込み¶
さまざまな RFC への参照を更新¶
文書全体の編集上の明確化¶
-02¶
-01¶
-00¶
初版¶