-
ユーザーがログインする
-
サーバが短寿命 access token を発行する
理由:- 漏洩時の悪用時間を短縮するため
(token窃取後の攻撃継続時間を制限できるため)
NG例:
- access token 有効期限30日
(漏洩時に長期間API操作を継続されるため)
- 漏洩時の悪用時間を短縮するため
-
サーバが長寿命 refresh token を別途発行する
理由:-
毎回ログインを要求せず再認証するため
(UX低下を防ぎつつ認証継続できるため) -
access token を短命化できるため
(短寿命化によるセキュリティ向上と両立できるため)
-
-
サーバが refresh token を
HttpOnly + Secure + SameSiteCookie として保存させる
理由:-
JavaScriptから読めなくするため
(XSS成立時のtoken窃取を困難化するため) -
HTTPS以外で送信させないため
(平文通信経由の漏洩を防ぐため) -
CSRFリスクを軽減するため
(クロスサイト自動送信を制限できるため)
NG例:
-
refresh token を localStorage 保存
(XSS成立時にJavaScriptから直接窃取可能なため) -
Secure未設定
(HTTP通信でCookie送信される可能性があるため) -
SameSite=Noneのまま運用
(クロスサイト送信が許可されCSRFリスクが増加するため)
-
-
クライアントは access token をメモリ上にのみ保持する
理由:- 永続保存領域からの窃取リスクを減らすため
(ブラウザ保存領域への残存を避けられるため)
NG例:
-
localStorage 保存
(XSS成立時に恒久的に取得可能なため) -
sessionStorage 保存
(タブ寿命に限定されるが依然JSから取得可能なため)
- 永続保存領域からの窃取リスクを減らすため
-
クライアントは API 呼び出し時に access token を
Authorization: Bearerで送信する
理由:- Cookie自動送信を避け、CSRF対象を減らすため
(明示的送信のみになるため)
NG例:
- access token を Cookie 運用
(ブラウザが自動送信するためCSRF対象になりやすいため)
- Cookie自動送信を避け、CSRF対象を減らすため
-
access token の期限切れ時、クライアントは refresh endpoint を呼ぶ
理由:- access token の再発行専用処理に分離するため
(認証更新責務を限定できるため)
- access token の再発行専用処理に分離するため
-
ブラウザが refresh token Cookie を自動送信する
理由:- JavaScriptに refresh token を触らせないため
(XSS経由での直接取得を防ぐため)
- JavaScriptに refresh token を触らせないため
-
サーバが refresh token を検証する
理由:- 改ざん・期限切れ・失効済みを判定するため
(不正token利用を拒否するため)
NG例:
- JWT署名検証のみ実施
(サーバ側失効状態を検知できないため)
- 改ざん・期限切れ・失効済みを判定するため
-
サーバが古い refresh token を失効させる
理由:- token再利用攻撃を防ぐため
(盗難済みtokenの継続利用を遮断できるため)
NG例:
- 同一 refresh token を永久利用可能
(窃取済みtokenが継続利用可能になるため)
- token再利用攻撃を防ぐため
-
サーバが新しい access token を発行する
理由:- 継続ログインを維持するため
(再ログインなしでAPI利用継続できるため)
- 継続ログインを維持するため
-
サーバが新しい refresh token を発行する
理由:- refresh token rotation を成立させるため
(旧token使い回しを防止できるため)
- refresh token rotation を成立させるため
-
サーバが新しい refresh token Cookie を再設定する
理由:- 古い token を置き換えるため
(旧tokenをブラウザから除去するため)
- 古い token を置き換えるため
-
クライアントが新しい access token をメモリへ再保存する
理由:- 次回API通信に利用するため
(継続認証状態を維持するため)
- 次回API通信に利用するため
-
ログアウト時、クライアントが logout endpoint を呼ぶ
理由:- サーバ側失効処理を実行するため
(tokenを中央管理で無効化するため)
- サーバ側失効処理を実行するため
-
サーバが refresh token を失効させる
理由:- logout後の再発行を不可能にするため
(セッション継続を遮断するため)
NG例:
- client側削除のみ
(サーバ側では依然tokenが有効なため)
- logout後の再発行を不可能にするため
-
サーバが refresh token Cookie を削除する
理由:- ブラウザに残存させないため
(次回自動送信を防止するため)
- ブラウザに残存させないため
-
クライアントがメモリ上の access token を破棄する
理由:- 即時認証解除するため
(以降のAPI認証を失敗させるため)
- 即時認証解除するため
-
-
Save kobitoDevelopment/c9eeea80f7d06c7681b31634cf84dee4 to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment