Skip to content

Instantly share code, notes, and snippets.

@kobitoDevelopment
Created May 24, 2026 10:07
Show Gist options
  • Select an option

  • Save kobitoDevelopment/c9eeea80f7d06c7681b31634cf84dee4 to your computer and use it in GitHub Desktop.

Select an option

Save kobitoDevelopment/c9eeea80f7d06c7681b31634cf84dee4 to your computer and use it in GitHub Desktop.

JWT認証フロー(推奨構成)

  1. ユーザーがログインする

  2. サーバが短寿命 access token を発行する
    理由:

    • 漏洩時の悪用時間を短縮するため
      (token窃取後の攻撃継続時間を制限できるため)

    NG例:

    • access token 有効期限30日
      (漏洩時に長期間API操作を継続されるため)
  3. サーバが長寿命 refresh token を別途発行する
    理由:

    • 毎回ログインを要求せず再認証するため
      (UX低下を防ぎつつ認証継続できるため)

    • access token を短命化できるため
      (短寿命化によるセキュリティ向上と両立できるため)

  4. サーバが refresh token を HttpOnly + Secure + SameSite Cookie として保存させる
    理由:

    • JavaScriptから読めなくするため
      (XSS成立時のtoken窃取を困難化するため)

    • HTTPS以外で送信させないため
      (平文通信経由の漏洩を防ぐため)

    • CSRFリスクを軽減するため
      (クロスサイト自動送信を制限できるため)

    NG例:

    • refresh token を localStorage 保存
      (XSS成立時にJavaScriptから直接窃取可能なため)

    • Secure 未設定
      (HTTP通信でCookie送信される可能性があるため)

    • SameSite=None のまま運用
      (クロスサイト送信が許可されCSRFリスクが増加するため)

  5. クライアントは access token をメモリ上にのみ保持する
    理由:

    • 永続保存領域からの窃取リスクを減らすため
      (ブラウザ保存領域への残存を避けられるため)

    NG例:

    • localStorage 保存
      (XSS成立時に恒久的に取得可能なため)

    • sessionStorage 保存
      (タブ寿命に限定されるが依然JSから取得可能なため)

  6. クライアントは API 呼び出し時に access token を Authorization: Bearer で送信する
    理由:

    • Cookie自動送信を避け、CSRF対象を減らすため
      (明示的送信のみになるため)

    NG例:

    • access token を Cookie 運用
      (ブラウザが自動送信するためCSRF対象になりやすいため)
  7. access token の期限切れ時、クライアントは refresh endpoint を呼ぶ
    理由:

    • access token の再発行専用処理に分離するため
      (認証更新責務を限定できるため)
  8. ブラウザが refresh token Cookie を自動送信する
    理由:

    • JavaScriptに refresh token を触らせないため
      (XSS経由での直接取得を防ぐため)
  9. サーバが refresh token を検証する
    理由:

    • 改ざん・期限切れ・失効済みを判定するため
      (不正token利用を拒否するため)

    NG例:

    • JWT署名検証のみ実施
      (サーバ側失効状態を検知できないため)
  10. サーバが古い refresh token を失効させる
    理由:

    • token再利用攻撃を防ぐため
      (盗難済みtokenの継続利用を遮断できるため)

    NG例:

    • 同一 refresh token を永久利用可能
      (窃取済みtokenが継続利用可能になるため)
  11. サーバが新しい access token を発行する
    理由:

    • 継続ログインを維持するため
      (再ログインなしでAPI利用継続できるため)
  12. サーバが新しい refresh token を発行する
    理由:

    • refresh token rotation を成立させるため
      (旧token使い回しを防止できるため)
  13. サーバが新しい refresh token Cookie を再設定する
    理由:

    • 古い token を置き換えるため
      (旧tokenをブラウザから除去するため)
  14. クライアントが新しい access token をメモリへ再保存する
    理由:

    • 次回API通信に利用するため
      (継続認証状態を維持するため)
  15. ログアウト時、クライアントが logout endpoint を呼ぶ
    理由:

    • サーバ側失効処理を実行するため
      (tokenを中央管理で無効化するため)
  16. サーバが refresh token を失効させる
    理由:

    • logout後の再発行を不可能にするため
      (セッション継続を遮断するため)

    NG例:

    • client側削除のみ
      (サーバ側では依然tokenが有効なため)
  17. サーバが refresh token Cookie を削除する
    理由:

    • ブラウザに残存させないため
      (次回自動送信を防止するため)
  18. クライアントがメモリ上の access token を破棄する
    理由:

    • 即時認証解除するため
      (以降のAPI認証を失敗させるため)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment