リフレッシュトークン

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

認証セキュリティ

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

リフレッシュトークンは、アクセストークンの有効期限が切れた後に、ユーザーの再ログインなしで新しいアクセストークンを取得するためのトークンである。OAuth 2.0 の仕様 (RFC 6749) では、認可サーバーが必要に応じて発行するものと位置づけられており、クライアントはトークンエンドポイントへ grant_type=refresh_token として提示し、新しいアクセストークンと交換する。

有効期限そのものは仕様が定めておらず、認可サーバーの設定で決まる。実装ではアクセストークンを分単位から 1 時間程度、リフレッシュトークンを日単位から数週間に置く形が多い。この非対称が設計の要点である。アクセストークンは API サーバーへ毎回送るため漏洩の機会が多く、寿命の短さで被害を打ち切る。リフレッシュトークンは認可サーバーにしか送らないため漏洩の機会を絞れる代わりに、盗まれたときの影響が長く続く。

アクセストークン vs リフレッシュトークン

2 つの違いは寿命だけではなく、どこへ送るかが本質的に違う。送信先を認可サーバーだけに限れるからこそ、長命にする余地が生まれる。

観点アクセストークンリフレッシュトークン
有効期限短い (15 分〜1 時間が典型)長い (7〜30 日が典型)
用途API へのアクセス新しいアクセストークンの取得
送信先API サーバー認証サーバーのみ
漏洩リスク短命なので影響が限定的長命なので影響が大きい

フロー

更新は次の順序で進む。リフレッシュトークンを使うのはアクセストークンの失効をクライアントが検知した後だけであり、毎回の API 呼び出しに混ぜてはならない。送る相手を増やすほど、長命なトークンが漏れる経路が増える。

1. ログイン → アクセストークン + リフレッシュトークンを取得
2. API 呼び出し → アクセストークンを使用
3. アクセストークンが期限切れ → 401 Unauthorized
4. リフレッシュトークンで新しいアクセストークンを取得
5. 新しいアクセストークンで API を再呼び出し

Cognito でのリフレッシュトークン

Amazon Cognito ユーザープールでは、REFRESH_TOKEN_AUTH フローでリフレッシュトークンを新しい ID トークンとアクセストークンに交換する。リフレッシュトークンの有効期限はサインインから既定で 30 日で、アプリクライアントの設定で 60 分から 10 年の範囲に変更できる (2026 年 8 月時点)。延ばすほど再ログインの手間は減るが、盗まれたトークンが使える期間も同じだけ伸びる。

const result = await cognito.initiateAuth({
  AuthFlow: 'REFRESH_TOKEN_AUTH',
  ClientId: 'my-client-id',
  AuthParameters: {
    REFRESH_TOKEN: refreshToken,
  },
});
const newAccessToken = result.AuthenticationResult!.AccessToken;

リフレッシュトークンの保存場所

保存場所の選択は、XSS が起きたときに何を持ち去られるかで決まる。読み出せない場所に置くのが基本になる。

保存場所セキュリティ推奨
HttpOnly Cookie高い (JS からアクセス不可)既定の選択。Secure と SameSite も併せて指定する
localStorage低い (XSS で盗まれる)避ける。1 度の XSS で長命なトークンごと持ち去られる
メモリ (変数)高い (ページ遷移で消える)再読み込みのたびにログインし直す前提なら使える

リフレッシュトークンローテーション

RFC 9700 (BCP 240・2025 年 1 月) は、クライアント認証ができない公開クライアント (ネイティブアプリや SPA) のリフレッシュトークンについて、送信者制約かローテーションのいずれかを必須と定めている。ローテーションは更新のたびに新しいリフレッシュトークンを発行し、直前のものを無効化する仕組みである。

1. リフレッシュトークン A で新しいアクセストークンを取得
2. 同時に新しいリフレッシュトークン B を発行
3. リフレッシュトークン A を無効化
→ 無効化済みの A が提示された時点で漏洩を検知できる

セキュリティ対策

無効化済みのトークンが提示されても、認可サーバーには攻撃者と正当なクライアントのどちらが出したのか判別できない。そのため有効なリフレッシュトークンごと失効させ、正当な利用者にも再ログインを求めることで攻撃を止める。検知できるが代償はある、という前提で運用する。

対策は、盗まれにくくする層と、盗まれた後に被害を止める層に分かれる。前者だけでは足りない。

対策説明
HttpOnly CookieJavaScript から読み出せない。ただし XSS 下で同一オリジンから更新を要求されるのは防げない
ローテーション使用済みを無効化し、再利用を漏洩の兆候として扱える
絶対有効期限更新を繰り返しても延長されない上限を設け、期限で必ず再認証させる
送信者制約クライアントの鍵に結び付ける (mTLS の RFC 8705・DPoP の RFC 9449)。盗んだだけでは使えない

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

この記事は役に立ちましたか?

関連用語

関連する記事