OIDC / OAuth 2.0

よくある攻撃と対策

セキュリティ

OAuth 2.0 / OIDC に対する代表的な攻撃パターンと、その防御方法を学びます。

OAuth/OIDCに対する攻撃

OAuth 2.0 と OIDC はセキュリティを重視して設計されていますが、 実装の誤りや設定の不備により脆弱性が生まれることがあります。 ここでは代表的な攻撃パターンと、その具体的な対策を解説します。

トークン漏洩
Critical

攻撃シナリオ

XSS攻撃、安全でないストレージ、ログへの出力、リファラヘッダーなどを通じて、アクセストークンやリフレッシュトークンが第三者に漏洩する。

対策

  • -トークンをlocalStorageに保存しない(HttpOnly Cookieまたはメモリ保存)
  • -トークンをURLのクエリパラメータに含めない
  • -ログにトークンを出力しない
  • -アクセストークンの有効期限を短く設定する(5~15分)
  • -トークンの失効(revocation)機能を実装する
リプレイ攻撃
High

攻撃シナリオ

攻撃者が過去のリクエストやトークンを再利用して、不正にリソースにアクセスする。IDトークンの場合、過去に傍受したトークンを使って認証をバイパスする。

対策

  • -nonce パラメータを使用し、IDトークンでの一致を検証する
  • -認可コードは一度使用したら即座に無効化する
  • -トークンの exp クレームを検証する
  • -jti(JWT ID)クレームでトークンの一意性を検証する
  • -TLS を使用して通信経路上での傍受を防止する
フィッシング攻撃
High

攻撃シナリオ

攻撃者が正規の認可サーバーに似せた偽のログインページを作成し、ユーザーのクレデンシャルを盗む。OAuthの認可フローでは、ユーザーが外部サイトにリダイレクトされることが普通であるため、フィッシングに気づきにくい。

対策

  • -redirect_uri を完全一致で検証する(ワイルドカードを使わない)
  • -認可サーバーのURLが正しいことをユーザーに確認させるUI設計
  • -登録済みの redirect_uri のみを許可する
  • -iss パラメータ(RFC 9207)で認可サーバーの正当性を検証する
オープンリダイレクト
High

攻撃シナリオ

redirect_uri の検証が不十分な場合、攻撃者が任意のURLにリダイレクトさせることで、認可コードやトークンを外部に流出させる。

対策

  • -redirect_uri を事前登録し、完全一致で検証する
  • -パス部分の比較にも厳密一致を使う(前方一致ではなく)
  • -ワイルドカードやパターンマッチを redirect_uri の検証に使わない
  • -フラグメント (#) を含む redirect_uri を拒否する
クリックジャッキング
Medium

攻撃シナリオ

攻撃者が透明なiframeで認可サーバーの同意画面を埋め込み、ユーザーが気づかずに「許可」ボタンをクリックさせる。これにより、ユーザーの意図しない認可が行われる。

対策

  • -認可サーバーで X-Frame-Options: DENY ヘッダーを設定する
  • -Content-Security-Policy: frame-ancestors 'none' を設定する
  • -フレームバスティングスクリプトを実装する
  • -ユーザーの操作を必要とするインタラクティブな同意画面を使う
追加のセキュリティ推奨事項
  • -すべての通信にHTTPSを使用する
  • -セキュリティヘッダー(CSP, HSTS, X-Content-Type-Options)を設定する
  • -定期的に依存パッケージの脆弱性をスキャンする
  • -OAuthライブラリは実績のあるものを使い、自前実装は避ける
  • -OAuth 2.1 のベストプラクティスに従う
  • -トークンのスコープは必要最小限にする(最小権限の原則)
セキュリティ対策のまとめ
攻撃主な対策
CSRFstate パラメータ
認可コード横取りPKCE
トークン漏洩HttpOnly Cookie / BFF パターン
リプレイ攻撃nonce / jti / exp 検証
オープンリダイレクトredirect_uri の完全一致検証
クリックジャッキングX-Frame-Options / CSP

次のステップ

セキュリティの基礎を理解したら、 シミュレーター で実際のOAuthフローを体験し、学んだセキュリティ機構がどのように 動作するかを確認しましょう。