OAuth 2.1 が登場: 知っておくべきこと
OAuth 2.1 の仕様が計画されています。OAuth 2.0 と OAuth 2.1 の主な違いと、それらが Logto にどのように採用されたかを探りましょう。
はじめに
OAuth 2.0 (RFC 6749) が 2012 年に登場して以来、ウェブとモバイルアプリの世界は大きく変わりました。人々はデスクトップからモバイルデバイスへ移行し、シングルページアプリケーション (SPA) が流行しています。また、多くの新しいフレームワークやウェブ技術も登場してきました。これらの変化に伴い、セキュリティの課題も増しています。最新のウェブ技術に対応するために、Proof Key for Code Exchange (PKCE) のような新しい RFC が継続的にリリースされ、OAuth 2.0 の強化が図られています。現在のセキュリティ要件に合わせたベストプラクティスをまとめることが重要となり、これが OAuth 2.1 登場の理由です。
今後の OAuth 2.1 では、OAuth ワーキンググループはすべてのベストプラクティスとセキュリティに関する推奨事項を 1 つの文書にまとめることを目的としています。Logto では、最新の標準と OAuth のベストプラクティスを常に受け入れています。この記事では、OAuth 2.0 と OAuth 2.1 の主な違いと、それらが Logto にどのように採用されたかを探ります。
認可コードフローを使用するすべての OAuth クライアントに PKCE が必要
OAuth 2.1 の最も重要な変更の 1 つは、Proof Key for Code Exchange (PKCE) が認可コードフローを使用するすべての OAuth クライアントに必要とされることです。PKCE は、認可コードの傍受攻撃を防ぐためのセキュリティ拡張です。特に、クライアントシークレットを安全に保存できないモバイルアプリケーションやシングルページアプリケーション (SPA) に有用です。
OAuth クライアントは、シークレットを安全に保存できるかどうかに基づいて、2 つの異なるタイプに分類できます。
-
秘密クライアント: これらのクライアントは、サーバーレンダリングされたウェブアプリケーションやウェブサーバーのように、シークレットを安全に保存できます。すべての認可関連の要求はサーバー側から行われ、クライアントシークレットが漏洩するリスクは低いです。
-
公開クライアント: これらのクラ イアントは、シークレットを安全に保存することができません。モバイルアプリや SPA が該当します。クライアントシークレットはクライアント側のコードから簡単に抽出され、攻撃者から保護するのは困難です。
公開クライアントにとって、PKCE は必須のセキュリティ対策です。これは、認可コードが認可要求を開始したクライアントによってのみ交換されることを保証します。
PKCE は、ランダムなコード検証器とその検証器に基づいて生成されたコードチャレンジを生成することで機能します。コード検証器は認可サーバーに送信され、コードチャレンジはアクセストークンと認可コードを交換する際にコード検証器を確認するために使用されます。
OAuth 2.1 では、PKCE は抽象度に関係なく、すべての OAuth クライアントが認可コードフローを採用するために必須となります。これは、潜在的な認可コードの傍受攻撃から普遍的に保護するための重要な調整です。
Logto では、公開クライアン トと秘密クライアントの両方に対して、PKCE 検証フローが自動でアクティブ化されます。
SPA およびモバイルアプリにおいて、Logto で認可コードフローを保護するために PKCE は必須のセキュリティ対策です。コードチャレンジを含まない認可要求は、Logto の認可サーバーによって即座に拒否されます。
秘密クライアント (従来のウェブアプリケーション) に関しては、従来の互換性を向上させるために、Logto では認可リクエストでコードチャレンジを省略することを許可しています。しかし、公開クライアントの慣行に従って、コードチャレンジを認可要求に組み込んで PKCE を採用することを秘密クライアントに強く推奨します。
リダイレクト URI の厳密な一致
リダイレクト URI (Uniform Resource Identifier) は、認可サーバーが認証および認可プロセスの後にユーザーを再度リダイレクトする特定のエンドポイントまたは URL です。
OAuth フロー中に、クライアントアプリケーションは初期認可要求の一部としてリダイレクト URI を含めます。ユーザーが認証プロセスを完了すると、認可サーバーは認可コードを含む応答を生成し、指定されたリダイレクト URI にユーザーをリダイレクトします。元のリダイレクト URI からのいかなる逸脱も、認可コードまたはトークンの漏洩につながります。
リダイレクト URI の厳密な文字列一致は、OAuth 2.0 Security Best Current Practices のセクション 4.1 で最初に導入されました。このプラクティスは、リダイレクト URI が認可サーバーに登録されたものと完全に一致している必要があるとしています。登録されたリダイレクト URI からのいかなる逸脱もエラー応答を引き起こします。
開発者が複数のサブドメインやパスなどを管理する際に、特にランダムなサブドメインが多数存在する場合に、ワイルドカードマッチングを実装したいというコミュニティからの多数のリクエストを受けました。ワイルドカードマッチングは確かに便利ですが、オープンリダイレクト攻撃などのセキュリティリスクも伴います。リダイレクト URI の検証を欠如させた場合の危険性の実例については、弊社のブログ記事「OAuth のセキュリティ概観」をご参照ください。
OAuth 2.1 の厳格なセキュリティ基準に沿って、Logto ではリダイレクト URI の厳密な文字列一致を使用しています。この決定は、OAuth フローのセキュリティを優先させるものです。ワイルドカードマッチングを利用する代わりに、すべての潜在的なリダイレクト URI を Logto 認可サーバーに登録することを開発者に推奨しています。これにより、リダイレクト URI の徹底した検証が可能になり、潜在的なセキュリティの脆弱性を軽減します。