リフレッシュトークン
アクセストークンの有効期限切れ後に、再認証なしで新しいアクセストークンを取得するためのトークン
認証セキュリティ
リフレッシュトークンとは
リフレッシュトークンは、アクセストークンの有効期限が切れた後に、ユーザーの再ログインなしで新しいアクセストークンを取得するためのトークンである。アクセストークンは短命 (15 分〜1 時間)、リフレッシュトークンは長命 (数日〜数週間)。
アクセストークン vs リフレッシュトークン
| 観点 | アクセストークン | リフレッシュトークン |
|---|---|---|
| 有効期限 | 短い (15 分〜1 時間) | 長い (7〜30 日) |
| 用途 | API へのアクセス | 新しいアクセストークンの取得 |
| 送信先 | API サーバー | 認証サーバーのみ |
| 漏洩リスク | 短命なので影響が限定的 | 長命なので影響が大きい |
フロー
1. ログイン → アクセストークン + リフレッシュトークンを取得
2. API 呼び出し → アクセストークンを使用
3. アクセストークンが期限切れ → 401 Unauthorized
4. リフレッシュトークンで新しいアクセストークンを取得
5. 新しいアクセストークンで API を再呼び出し
Cognito でのリフレッシュトークン
const result = await cognito.initiateAuth({
AuthFlow: 'REFRESH_TOKEN_AUTH',
ClientId: 'my-client-id',
AuthParameters: {
REFRESH_TOKEN: refreshToken,
},
});
const newAccessToken = result.AuthenticationResult!.AccessToken;
リフレッシュトークンの保存場所
| 保存場所 | セキュリティ | 推奨 |
|---|---|---|
| HttpOnly Cookie | 高い (JS からアクセス不可) | ✅ |
| localStorage | 低い (XSS で盗まれる) | ❌ |
| メモリ (変数) | 高い (ページ遷移で消える) | △ |
リフレッシュトークンローテーション
1. リフレッシュトークン A で新しいアクセストークンを取得
2. 同時に新しいリフレッシュトークン B を発行
3. リフレッシュトークン A を無効化
→ 漏洩したトークンが再利用されると検知できる
セキュリティ対策
| 対策 | 説明 |
|---|---|
| HttpOnly Cookie | XSS でトークンが盗まれない |
| ローテーション | 使用済みトークンを無効化 |
| 絶対有効期限 | 30 日後に強制ログアウト |
| デバイスバインド | 発行時のデバイスでのみ使用可能 |
より深く学ぶには関連書籍が役立つ。