セキュリティ強化のためのリフレッシュトークンローテーション
リフレッシュトークンローテーションの仕組みと、長期間のOAuth 2.0セッションでのトークン盗難防止に不可欠な理由を学びます。
Token Management
詳細な説明
リフレッシュトークンローテーション
リフレッシュトークンローテーションは、クライアントがリフレッシュトークンを使用するたびに認可サーバーが新しいリフレッシュトークンを発行するセキュリティメカニズムです。古いリフレッシュトークンは即座に無効化されます。攻撃者がリフレッシュトークンを盗み、正当なクライアントが既にローテーションした後にそれを使用しようとすると、サーバーが再利用を検出しトークンファミリー全体を取り消します。
仕組み
初期トークンレスポンス: クライアントがaccess_tokenとrefresh_token(RT1)を受信。
アクセストークンの期限切れ:
expires_in秒後、アクセストークンは無効に。リフレッシュリクエスト: クライアントが
grant_type=refresh_tokenでRT1を/tokenエンドポイントに送信。新しいトークン: サーバーが新しいaccess_tokenと新しいrefresh_token(RT2)を返す。RT1は無効化。
繰り返し: 各リフレッシュが現在のリフレッシュトークンを新しいペアに交換。
トークンリクエスト
POST /token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=tGzv3JOkF0XG5Qx2TlKW...
&client_id=s6BhdRkqt3
再利用検出
RT2が発行された後にRT1が再度使用された場合、サーバーは侵害が発生したことを認識します:
| イベント | サーバーのアクション |
|---|---|
| RT1でRT2を取得 | 正常 — 新しいトークンを発行 |
| RT2でRT3を取得 | 正常 — 新しいトークンを発行 |
| RT1の再利用 | 侵害検出 — ファミリー内のすべてのトークンを取り消し |
利点
- 露出ウィンドウの制限: リフレッシュトークンが盗まれても、正当なクライアントが次に使用した時点で無効になる
- 侵害の検出: トークンの再利用は潜在的な攻撃のシグナル
- 長期セッションのサポート: セキュリティを維持しながらユーザーが再認証なしでログイン状態を維持
実装の注意事項
- リフレッシュトークンを「トークンファミリー」識別子付きでサーバーサイドに保存
- 再利用が検出された場合、ファミリー内のすべてのトークンを取り消し、再認証を強制
- リフレッシュトークンに絶対最大有効期間を設定(例:30日)
- 短命のアクセストークン(例:5-15分)と組み合わせる
ユースケース
ユーザーを数日から数週間ログイン状態に保つ必要があるSPAやモバイルアプリ。長命のアクセストークンを付与する代わりに、短命のアクセストークンを使用し、ローテーションするリフレッシュトークンでリフレッシュします。トークンが盗まれた場合、ローテーションメカニズムが攻撃者を検出しブロックします。