2026/04/13
Refresh Token とは
有効期限が切れた Access Token を再発行するための長期間有効なトークン
なぜ必要か
Access Token だけの場合
- Access Token の有効期限を長くする
- トークンが漏洩した場合に長期間悪用される(セキュリティリスク)
- Access Token の有効期限を短くする
- ユーザーが頻繁にログインし直す必要がある(UX 低下)
Refresh Token を活用すると「セキュリティと UX を両立」できる
- Access Token:短い有効期限 → 漏洩リスクを最小化
- Refresh Token:長い有効期限 → ログインし直しを回避
Access Token と Refresh Token の役割の違い
| Access Token | Refresh Token | |
|---|---|---|
| 用途 | API へのアクセス認可 | Access Token の再発行 |
| 有効期限 | 短い | 長い |
| 送信先 | 毎回の API リクエスト | Token エンドポイントのみ |
| 漏洩リスク | 高い(頻繁に送信) | 低い(送信機会が少ない) |
| 保存場所 | メモリまたは Cookie | HttpOnly Cookie |
フロー
初回ログインから API 利用まで
① ユーザーがログインする
クライアント → POST /auth/login { email, password }
サーバー → Access Token(15分)+ Refresh Token(30日)を返す
② Access Token で API を呼ぶ
クライアント → GET /api/users
Authorization: Bearer <access_token>
サーバー → 200 OK(正常レスポンス)
③ Access Token の有効期限が切れる
クライアント → GET /api/users
Authorization: Bearer <expired_access_token>
サーバー → 401 Unauthorized
④ Refresh Token で Access Token を再発行する
クライアント → POST /auth/refresh
{ refresh_token: <refresh_token> }
サーバー → 新しい Access Token(+ 新しい Refresh Token)を返す
⑤ 新しい Access Token で API を呼ぶ
クライアント → GET /api/users
Authorization: Bearer <new_access_token>
サーバー → 200 OK
⑥ Refresh Token も期限切れ
→ ログインし直し
種類
ステートフル方式(DB 管理)
Refresh Token の情報を DB に保存して検証する
メリット
- 任意のタイミングで即時無効化できる(ログアウト・強制失効)
- 発行済みトークンの一覧を管理・確認できる
- デバイスごとに管理できる
デメリット
- リフレッシュのたびに DB アクセスが発生する
ステートレス方式(JWT)
Refresh Token 自体を JWT にして DB を使わずに検証する
メリット
- DB アクセスが不要・スケールしやすい
デメリット
- 即時無効化ができない(有効期限まで使われ続ける)
- ブラックリストを使う場合は結局 DB が必要
保存場所
HttpOnly Cookie
- JavaScript から読み取れない(XSS 対策)
Secure属性で HTTPS のみ送信SameSite=Strictで CSRF 対策- ブラウザが自動で送信するためクライアントの実装が不要
ローテーション
Refresh Token を使うたびに新しいトークンを発行して古いトークンを失効させる
攻撃者が盗んでいた token を使おうとするが、対象 token すでに失効しているため、サーバーが不正アクセスとして検知できる
→ (検知後)盗まれた側のユーザーの全 Refresh Token を失効させ、ユーザーにアラートを送ることなど
デバイスごとのセッション管理
ログイン時にデバイス情報を保存しておくことで、複数デバイスに対応したセッション管理を実現する
ユーザーが自分のセッション一覧を確認・個別ログアウトできるようにするなど
参考
- OAuth 2.0 Refresh Token(RFC 6749):https://datatracker.ietf.org/doc/html/rfc6749#section-6
- OWASP Authentication Cheat Sheet:https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html