- Single Page Application(SPA)がOpen ID Connect(OIDC)連携する際に検討・考慮が必要な内容をメモする。
- SPA : 単一のWebページでアプリケーションを構成する設計構造のこと。1つのHTMLに対してJavaScriptで動的に変更を加えながら画面描画を行う。
- OIDC : OAuth 2.0を使ってID連携をする際に、OAuth 2.0では標準化されていない機能で、かつID連携には共通して必要となる機能(IDトークンとUserInfoエンドポイント)を標準化したプロトコルのこと。認可だけでなく、認証にも対応している。
認可コード横取り攻撃対策
- 認可コード横取り攻撃:悪意あるアプリが、認可コードを横取りし、クライアントの代わりにアクセストークンを発行する攻撃。
-
Authorization Code Flow + PKCE(Proof Key Code Exchange):認可コードフローに認可コード横取り対策を加えたもの。
- クライアントは、認可エンドポイントへ
code_challenge
(code_verifier
とcode_challenge_method
(code_challenge
の計算に用いるメソッド。plain
(デフォルト) もしくはS256
を指定する。)から計算された値)とcode_challenge_method
をつけて認可リクエストを行う。 - OIDCサーバーは、認可リクエストを処理する時に、生成した認可コードと共に
code_challenge
とcode_challenge_method
をDBに保存する。 - クライアントは、
code_verifier
(認可リクエストの際に渡したcode_challenge
の元となった値)をつけてトークンリクエストする。 - OIDCサーバーは、トークンリクエストから
code_verifier
を取り出し、そのcode_verifier
とDBに保存したcode_challenge_method
を用いてcode_challenge
を計算し、計算結果がDBに保存しておいたcode_challenge
と等しいかどうかを検証する。
- クライアントは、認可エンドポイントへ
リプレイアタック対策
-
リプレイアタック:ログイン時の送信データ(IDトークン)を攻撃者が記録し、それをそのまま再現することで不正にログインする攻撃。
-
nonce
パラメータの利用- クライアントは、認可リクエスト時に
nonce
を生成しOIDCサーバーに渡す。 - OIDCサーバーは、IDトークン中に
nonce
を含める。 - クライアントは、自分の認可リクエストに対してのIDトークンであることを確認するため、リクエスト時に渡した
nonce
とIDトークンに含まれるnonce
の一致を確認する。
- クライアントは、認可リクエスト時に
CSRF対策
-
state
パラメータの利用- クライアントは、認可リクエスト時に
state
を生成しOIDCサーバーへ送信する。 - OIDCサーバーは、クライアントに認可コードを送信する際、リクエストで送られてきた
state
も付与する。 - クライアントは、
state
がリクエスト時の値と一致しない、もしくは渡されなかった場合にトークンリクエストを行わない。
- クライアントは、認可リクエスト時に
アクセストークン漏洩対策
- アクセストークンを奪われた場合、APへの不正アクセスを発生させないようにする。
-
DPoP(Demonstration of Proof-of-Possession at the Application Layer)
- アクセストークンを提示しているクライアントがアクセストークンの正当な所有者か(=アクセストークンの発行を受けたクライアントと同一か)を検証する。
トークンの安全な管理
-
SPA(ブラウザ)では、アクセストークンやIDトークンを安全に保管できない。
- Web Storage(localStorage、SessionStorage)
- XSSの危険あり(JSからアクセス可能なため)
- Cookie
-
httpOnly
、secure
属性など必須(JSからアクセスさせないため)
-
- Web Storage(localStorage、SessionStorage)
-
結局、ベストプラクティスがわからない...以下のような対策もある模様。
-
認可コードフロー+独自セッション
- OIDCをログイン管理に利用しない。
- OIDCは認証のみに利用する。
- RPのF/EとB/E間で独自のセッション(cookie)を構築し、ログイン管理を実施する。
- OIDCをログイン管理に利用しない。
-
認可コードフロー+独自セッション
リフレッシュトークン横取り対策
- 攻撃者に使用済みリフレッシュトークンを奪われた際、攻撃者に新しいトークンを発行されないようにする。
-
リフレッシュトークン ローテーション
- 古いリフレッシュトークンを使用して新しいリフレッシュトークンを発行する場合、
- 古いリフレッシュトークンを無効化し、新しいリフレッシュトークン発行する。
- 古いリフレッシュトークンを使用して新しいリフレッシュトークンを発行する場合、