リフレッシュトークン

アクセストークンの有効期限切れ後に、再認証なしで新しいアクセストークンを取得するためのトークン

認証セキュリティ

リフレッシュトークンとは

リフレッシュトークンは、アクセストークンの有効期限が切れた後に、ユーザーの再ログインなしで新しいアクセストークンを取得するためのトークンである。アクセストークンは短命 (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 日後に強制ログアウト
デバイスバインド 発行時のデバイスでのみ使用可能

より深く学ぶには関連書籍が役立つ。

関連用語