OAuth 2.0
すべての「Google でサインイン」ボタン、すべての「Twitter アカウントに接続」リンク、最新のサービス間のすべての API 統合は OAuth に基づいています。このプロトコルは、パスワード共有をトークンと同意画面のフローに置き換え、可動部分を理解することで、攻撃のカテゴリーと利便性の両方をわかりやすくします。
記事全文は以下に英語で記載されています。
OAuth 2.0 は、ユーザーのパスワードを確認することなく、あるアプリケーションがユーザーに代わって別のアプリケーションのリソースに限定的にアクセスできるようにする承認フレームワークです。古典的な使用例: Google カレンダーを読み取る必要があるカレンダー アプリでは、Google パスワードを入力する必要はありません。 OAuth を使用すると、代わりにスコープ指定された取り消し可能なトークンをアプリに付与できます。
アクター
OAuth フローの 4 つの役割:
- リソース所有者 — あなた、どこかにデータを持つユーザー
- Client — アクセスを必要とするアプリケーション(例: サードパーティのカレンダー ビューア)
- 認可サーバー — あなたを認証し、トークンを発行するサービス (例: Google の OAuth エンドポイント)
- リソース サーバー — データを保持する API (例: Google カレンダー) API)
認証コード フロー
簡略化された標準的なサーバー側フロー:
- クライアント アプリで [Google カレンダーに接続] をクリックします。
- クライアントは、パラメーター client_id、redirect_uri、scope を使用してブラウザを Google の認証サーバーにリダイレクトします。 (calendar.read)、状態 (CSRF トークン)。
- まだログインしていない場合は、Google に認証します。
- Google に同意画面が表示されます:「CalendarViewer がカレンダーの読み取りを要求しています。許可しますか?」
- 「許可」をクリックします。 Google は、ワンタイム認証コードを使用してブラウザをクライアントの redirect_uri にリダイレクトします。
- クライアントのサーバー側コードは、Google のトークン エンドポイントを直接呼び出すことにより、アクセス トークンの認証コード (およびそのクライアント シークレット) を交換します。
- クライアントは、アクセス トークンを使用して、ユーザーに代わって Google Calendar API を呼び出します。
- アクセス トークンの有効期限が切れたとき
重要なセキュリティ プロパティ: パスワードがクライアント アプリに影響することはありません。クライアントは、Google のアカウント ダッシュボードでいつでも取り消すことができるスコープ付きトークンを取得します。
OAuth 2.0 対 OAuth 2.1 対 OIDC
- OAuth 2.0 は 2012 年の標準 (RFC 6749) です。それ以降、いくつかの拡張 RFC とベスト プラクティス ドキュメントが追加されました。
- OAuth 2.1 (2026 年時点のドラフト) は、現在のベスト プラクティスを 1 つの仕様に統合します (必須の PKCE、削除された暗黙的フローなど)。
- OpenID Connect (OIDC) は ID レイヤーです。 OAuth 2.0 の上に。 OAuth 単独では、不透明なアクセス トークンが提供されます。 OIDC は、ユーザーを認証する ID トークン (JWT) を追加します。ほとんどの「サインイン...」ボタンは、プレーンな OAuth ではなく、OIDC を使用します。
付与タイプ
OAuth 2.0 では、さまざまなシナリオ向けにいくつかのフローが定義されています。
- 認証コード - 上で説明した標準のサーバー側フロー。 PKCE 拡張機能を使用し、モバイル アプリや SPA アプリでも使用されます。
- Implicit Flow (非推奨) — URL フラグメントを介して直接アクセス トークンを発行しました。トークン漏洩に対して脆弱です。認証コード + PKCE.
- リソース所有者パスワード資格情報 (めったに使用されません) に置き換えられます - クライアントはユーザーのパスワードを収集し、それをトークンと交換します。従来の移行シナリオでのみ使用してください。
- Client Credentials — ユーザーがいないマシン間の場合。クライアントは自身を認証し、独自のリソースのトークンを取得します。
- デバイス コード — ブラウザーのないデバイス (TV、IoT) 用。デバイスはコードを表示します。ユーザーは電話またはラップトップから認証します。
- リフレッシュ トークン - ユーザーの操作なしで、有効期間の長いリフレッシュ トークンを新しいアクセス トークンと交換します。
PKCE: 必須の拡張機能
PKCE (コード交換用の証明キー、 「ピクシー」と発音します)は、認証コード傍受攻撃を防ぎます。クライアントはランダムなシークレットを生成し、それをハッシュし、そのハッシュを認可リクエストに含めて送信します。コードを交換するときは、元のシークレットが送信されます。認可サーバーはハッシュが一致することを検証します。コードを傍受した攻撃者は、元のシークレットがなければコードを交換できません。
PKCE は現在、パブリック (ブラウザ、モバイル) と機密 (サーバーサイド) の両方のすべての OAuth クライアントに対して必須とみなされます。
Scopes
Token は、特定のスコープ、つまり実行が許可されるアクションで発行されます。 Google の一般的なスコープは、https://www.googleapis.com/auth/calendar.readonly のようになります。クライアントはスコープを要求します。ユーザーは同意画面でそれらを確認し、承認または拒否します。最小特権の原則: 実際に必要なスコープのみを要求します。
一般的な OAuth 攻撃
- リダイレクトを開く。 redirect_uri パラメーターが正しく設定されていないと、攻撃者は認証コードを自分のサーバーにリダイレクトできます。
- 状態パラメーターの省略。 状態値が関連付けられていない場合ユーザー セッションに対して、OAuth フローは CSRF に対して脆弱です。攻撃者は被害者をだまして、攻撃者のアカウントを被害者のセッションにリンクする OAuth フローを完了させます。
- ブラウザー履歴でのトークン漏洩 (暗黙的フローの主な弱点)
- XSS によるトークン盗難クライアント アプリがトークンを localStorage に保存しており、XSS の脆弱性がある場合、攻撃者はトークンを盗むことができます。
- 同意画面のフィッシング 攻撃者は、機密スコープを要求する悪意のある OAuth クライアントを登録します。ユーザーは、同意画面で「許可」をクリックすることを条件に、精査することなくアクセスを許可します。
ユーザーとして行うべきこと
- Google/Apple/Microsoft/Facebook/GitHub アカウント設定で接続されているアプリを定期的に確認します。使用しないものは取り消してください。
- アクセスを許可する前に、同意画面のスコープを読んでください。 「カレンダーの管理」は「カレンダーの表示」とは異なります。
- たとえ馴染みのあるワークフロー中に表示されたとしても、見覚えのないアプリからの OAuth リクエストには懐疑的になってください。
よくある質問
- OAuth は認証と同じですか?
- いいえ。OAuth は承認です。クライアントにリソースへのアクセス許可を付与します。 OAuth 上に構築された OpenID Connect は認証を追加します。 「Google でサインイン」は OIDC です。 「Google カレンダーに接続」は、アプリがユーザーの身元を知る必要があるか、データへのアクセスのみが必要かによって異なります。
- OAuth を使用するか、パスワードを保存する必要がありますか?
- 可能な限り OAuth を使用してください。ユーザー パスワードを保存するということは、ハッシュ、ソルト、侵害への対応、パスワード回復、および 2FA に対するすべての責任を引き継ぐことを意味します。 OAuth 経由で Google/Apple/Microsoft/GitHub に委任すると、そのすべてがオフロードされます。トレードオフは、ユーザーがそれらのプロバイダーのアカウントを必要とすることです。
- OAuth トークンは取り消すことができるのに、パスワードは取り消すことができないのはなぜですか?
- トークンは、認可サーバーのデータベース内のエントリを参照します。エントリを取り消すと、トークンは直ちに無効になります。パスワードは知識です。パスワードをローテーションして再認証を強制することはできますが、そうするまで古いパスワードは有効のままです。
- OAuth 2.0 と OAuth 1.0 の違いは何ですか?
- OAuth 1.0 (2007) では、すべてのリクエストに暗号署名が使用されました。 OAuth 2.0 (2012) はトランスポート セキュリティに TLS に依存し、ベアラー トークンを使用します。 OAuth 2.0 は実装が簡単で、ほぼすべての最新の API に同梱されています。 OAuth 1.0 は基本的に非推奨です。
- OAuth トークンは漏洩すると危険ですか?
- はい - トークンが期限切れになるか取り消されるまで、トークンを持っている人は誰でもアクセスを許可されます。軽減策: アクセス トークンの有効期間の短縮 (通常 1 時間)、リフレッシュ トークンのより安全な保存、スコープの最小化、監査ログ。アクセス トークンは、有効期間中はパスワードと同じように慎重に扱ってください。