OAuth 2.0 と OIDC は、ユーザーのパスワードを第三者に渡さずに 安全にアクセスを委譲するために設計されています。 しかし、その実装には多くのセキュリティ上の注意点があります。
プロトコル自体は安全に設計されていますが、実装の誤りによって脆弱性が生まれることが多くあります。 以下の3つの原則を常に意識しましょう。
1. 最小権限の原則
必要最小限のスコープのみを要求する。 不要な権限は攻撃の表面積を広げる。
2. 多層防御
state、PKCE、nonce など複数のセキュリティ機構を 組み合わせて使用する。
3. トークンの短命化
アクセストークンの有効期限は短く設定し、 リフレッシュトークンで更新する。
認可コードの横取り
攻撃者がリダイレクト時に認可コードを傍受する
対策: PKCE
CSRF攻撃
攻撃者が偽のコールバックをユーザーに踏ませる
対策: stateパラメータ
トークン漏洩
XSS等でクライアント側のトークンが盗まれる
対策: HttpOnly Cookie / BFFパターン
オープンリダイレクト
不正なredirect_uriで認可コードを外部に流出させる
対策: redirect_uriの完全一致検証
セキュリティトピック
認可リクエスト
stateパラメータを生成し、コールバックで検証している
PKCEを使用している(パブリッククライアントでは必須)
redirect_uriを完全一致で検証している
nonceを生成し、IDトークンで検証している
トークン管理
アクセストークンをlocalStorageに保存していない
トークンの有効期限を適切に設定している
リフレッシュトークンを安全に保存している
不要になったトークンを失効させている
通信
すべての通信がHTTPSで行われている
redirect_uriがHTTPSを使用している(localhostを除く)
CORSポリシーが適切に設定されている
検証
IDトークンの署名を検証している
issクレームを検証している
audクレームを検証している
expクレームを検証している
次のステップ
まずは stateパラメータとCSRF防止 から学び始めましょう。OAuthフローで最も基本的なセキュリティ機構です。