リフレッシュトークン
アクセストークンの有効期限切れ後に、再認証なしで新しいアクセストークンを取得するためのトークン
リフレッシュトークンとは
リフレッシュトークンは、アクセストークンの有効期限が切れた後に、ユーザーの再ログインなしで新しいアクセストークンを取得するためのトークンである。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 Cookie | JavaScript から読み出せない。ただし XSS 下で同一オリジンから更新を要求されるのは防げない |
| ローテーション | 使用済みを無効化し、再利用を漏洩の兆候として扱える |
| 絶対有効期限 | 更新を繰り返しても延長されない上限を設け、期限で必ず再認証させる |
| 送信者制約 | クライアントの鍵に結び付ける (mTLS の RFC 8705・DPoP の RFC 9449)。盗んだだけでは使えない |
より深く学ぶには関連書籍が役立つ。
この記事は役に立ちましたか?
関連用語
OpenID Connect
OAuth 2.0 の上に構築された認証レイヤーで、ユーザーの身元情報を ID トークンとして提供する
PKCE
OAuth 2.0 の認可コードフローを、クライアントシークレットなしで安全に実行するための拡張
OAuth 2.0
ユーザーのパスワードを渡さずに、リソースへの限定的なアクセスを許可する認可フレームワーク
ケイパビリティベースセキュリティ
リソースへのアクセス権を偽造不可能なトークン (ケイパビリティ) として管理するセキュリティモデル
JWT
JSON Web Token の略で、署名付きの JSON でユーザー情報を安全に伝達するトークン形式
IAM (概念)
Identity and Access Management の一般概念で、認証と認可を管理する仕組み
関連する記事
Web 開発本ガイド - フロントエンドからバックエンドまで
Web 開発の全体像を学べる技術書の選び方と学習マップを紹介。フレームワーク本の賞味期限問題と公式ドキュメントとの使い分けも解説します。
インフラ / クラウド本ガイド - AWS や Docker を本で学ぶ
クラウドインフラ、コンテナ、IaC を学べる技術書の選び方と学習順序を紹介。インフラ本の賞味期限問題と公式ドキュメントとの使い分けも解説します。
AWS 本の選び方 - 全体像 / 構築 / 設計 / 運用 / セキュリティの 5 視点
AWS を学ぶ技術書の選び方を「全体像 / 構築 / 設計 / 運用 / セキュリティ」の 5 視点で整理。公式ドキュメントと本の役割分担、資格対策書の位置づけまで、2026 年 8 月時点の定番書で AWS 独学のルートを解説します。