> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-actions-triggers-prototype.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

> リフレッシュトークンを使用しているクライアントから新しいアクセストークンが要求されるたびに、Auth0が新しいリフレッシュトークンを発行することによって、リフレッシュトークンのローテーションがどのようにセキュリティを強化しているのかを説明します。

リフレッシュトークンのローテーションはリフレッシュトークンを使って新しいアクセストークンを取得する方法で、[サイレント認証](/docs/ja-jp/authenticate/login/configure-silent-authentication)よりも優れています。リフレッシュトークンは一般的に寿命が長いため、より寿命の短いアクセストークンの期限が切れた後、新しいアクセストークンを要求するのに利用できます。リフレッシュトークンは、寿命が短いアクセストークンと共に、モバイルデバイスのネイティブアプリケーションで広く使用されています。寿命の長いアクセストークンを発行することなく、シームレスなUXを提供できるようにします。

<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=auth0-dashboard" tip="Auth0 Dashboard: サービスを構成するためのAuth0の主製品。" cta="用語集の表示">Auth0 Dashboard</Tooltip>でリフレッシュトークンのローテーションを有効にすると、アプリケーションがリフレッシュトークンを交換して新しいアクセストークンを取得するたびに、新しいリフレッシュトークンが返されます。このため、侵入を受けると永久にリソースへのアクセスを許してしまうような、寿命の長いリフレッシュトークンはなくなりました。リフレッシュトークンは交換され続け、失効し続けるため、脅威の軽減に繋がっています。

リフレッシュトークンのローテーションについて、Auth0の仕組みは[OAuth 2.0 BCP](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13#section-4.12)に準拠しており、以下のフローで動作します。

* [認可コードフロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/authorization-code-flow)
* [Proof Key for Code Exchange（PKCE）を使った認可コードフロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce)
* [デバイス認可フロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/device-authorization-flow)
* [リソース所有者のパスワードフロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/resource-owner-password-flow)

## SPAでユーザーセッションを維持する

ごく最近まで、SPAは、PKCEを使った認可コードフローとサイレント認証を併せて使用することによって、ユーザーのセッションを維持していました。Intelligent Tracking Prevention（ITP）など、ブラウザーのプライバシー技術における最近の発展により、Auth0のセッションCookieへのアクセスが妨げられるため、ユーザーの再認証が必要になっています。

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/lj4yKtFBkRd_2GRB/docs/images/ja-jp/cdy7uua7fh8z/3sf7RRsy81bt3zcXMnHUSe/d6dc4eaa961e9630bc65dd73dae49792/rt-and-at.png?fit=max&auto=format&n=lj4yKtFBkRd_2GRB&q=85&s=e02fe1d587d437127d08b2f17c0b7ce0" alt="リフレッシュトークンローテーションでSPAのユーザーセッション維持の図" width="900" height="764" data-path="docs/images/ja-jp/cdy7uua7fh8z/3sf7RRsy81bt3zcXMnHUSe/d6dc4eaa961e9630bc65dd73dae49792/rt-and-at.png" />
</Frame>

残念ながら、意図されたアプリケーションのみにアクセスを保証できるような永続ストレージのメカニズムがブラウザーにはないため、寿命の長いリフレッシュトークンはSPAには適していません。これら高価値のアーティファクトを手に入れるためや、悪意ある行為者に保護されたリソースへのアクセス権を付与させるために悪用され得る脆弱性があるため、SPAでリフレッシュトークンを使用することは断固としてお勧めできません。

リフレッシュトークンのローテーションは、ブラウザーのプライバシー保護メカニズムが原因で、エンドユーザーのセッションが失われてしまうという不都合を改善します。リフレッシュトークンのローテーションはAuth0のセッションCookieにアクセスしないため、ITPやそれに類似した保護メカニズムの影響を受けません。

以下の図は、リフレッシュトークンのローテーションがどのようにして、PKCEを使った認可コードフローと併せて使用されるのかを表していますが、交換時に新しいリフレッシュトークンの取得に適用される一般原則は、すべての対応するフローに適用されます。

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/lj4yKtFBkRd_2GRB/docs/images/ja-jp/cdy7uua7fh8z/41avsR2u0B4fSP3Bwh0WZz/a1ca15686f3e5e2b05b70479f319094b/rtr-state-diagram.png?fit=max&auto=format&n=lj4yKtFBkRd_2GRB&q=85&s=71cc16d1f09a8168f9b6930efc79d72b" alt="リフレッシュトークンローテーションでSPAのユーザーセッション維持の状態図" width="1500" height="1567" data-path="docs/images/ja-jp/cdy7uua7fh8z/41avsR2u0B4fSP3Bwh0WZz/a1ca15686f3e5e2b05b70479f319094b/rtr-state-diagram.png" />
</Frame>

つまり、ブラウザーのプライバシー保護ツールがもたらす副作用を軽減するために、リフレッシュトークンを安全に使用して、ユーザーエクスペリエンスを損なうことなく、エンドユーザーに継続してアクセスできるということになります。

## 再利用の自動検出

クライアントは、新しいアクセストークンが必要になると、新しいトークンのペアを取得するために、Auth0へ要求を添えてリフレッシュトークンを送信します。Auth0が新しいトークンのペアを発行すると、要求に使用されたリフレッシュトークンが即座に失効します。こうすることで、トークンの侵害によって起きるリプレイ攻撃からアプリを保護します。

sender-constraintを実現させないのであれば、リプレイ攻撃の際に、認可サーバーが正当な行為者と悪意のある行為者を区別することは不可能です。そのため、以前に使用されたリフレッシュトークン（すでに失効済み）が認可サーバーへ送信されるたら、発行されたばかりの最新のリフレッシュトークンでさえ即座に失効させることが重要です。これによって、同じトークンファミリー（クライアントに対して発行されたオリジナルのリフレッシュトークンから派生したすべてのリフレッシュトークン）のあらゆるリフレッシュトークンが、新しいアクセストークンの取得に使用されることを防ぎます。

たとえば、以下のシナリオを考えてみてください。

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/33fe73R81Cpm6eTmOWfAnm/eab601bab8b2530dc174be89bd5b0d52/reuse-detection1.png?fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=2f361165f7a0b79bb8ccca6c3d47a235" alt="リフレッシュトークンローテーションの再利用検出状態の図" width="1500" height="1105" data-path="docs/images/ja-jp/cdy7uua7fh8z/33fe73R81Cpm6eTmOWfAnm/eab601bab8b2530dc174be89bd5b0d52/reuse-detection1.png" />
</Frame>

1. 正当なクライアントに**リフレッシュトークン1** があり、それが漏洩したか、悪意のあるクライアントに盗まれました。
2. 正当なクライアントが**リフレッシュトークン1** を使用して、新しいリフレッシュトークンとアクセストークンのペアを取得します。
3. Auth0が**リフレッシュトークン2とアクセストークン2** を返します。
4. 悪意のあるクライアントが**リフレッシュトークン1** を使用してアクセストークンを取得しようとします。Auth0はリフレッシュトークン1が再利用されたことを認識し、即座に**リフレッシュトークン2** を含む関連のリフレッシュトークンを無効にします。
5. Auth0が悪意のあるクライアントにアクセス拒否の応答を返します。
6. **アクセストークン2** が失効したため、正当なクライアントが**リフレッシュトークン2** を使用して新しいトークンのペアを要求します。Auth0が正当なクライアントにアクセス拒否の応答を返します。
7. 再認証が必要になります。

この保護の仕組みは、**リフレッシュトークン1** を新しいトークンのペアに交換できるのが正当なクライアントが先か、悪意のあるクライアントが先かにかかわらず上手く対処します。再利用が検出されると即座に、ユーザーが再認証するまで、後続の要求がすべて拒否されます。Auth0が再利用を検出すると、検出した再利用[イベント](/docs/ja-jp/deploy-monitor/logs/log-event-type-codes)（交換の失敗を示す`ferrt`など）をログに記録します。これをAuth0の[ログストリーミング](/docs/ja-jp/customize/log-streams)機能と併せて利用すれば、疑わしいアクティビティの検知には特に役立ちます。

別の例として、悪意のあるクライアントが**リフレッシュトークン1** を盗んで使用し、正当なクライアントが**リフレッシュトークン1** を使用する前に、アクセストークンを取得したとします。この場合、以下の図が示すように、正当なクライアントが**リフレッシュトークン1** を使用すると即座に**リフレッシュトークン2** （および後続して発行されたすべてのリフレッシュトークン）が自動的に取り消されるため、悪意のあるクライアントがアクセス権を悪用できる期間が短縮されます。

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/36rAUgLOAqW7k7Fdl1eRN1/7c659b1c742aae28fc6c89620d5badd4/reuse-detection2.png?fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=922e7e801be9df34311004988bf08cfa" alt="リフレッシュトークンローテーションの再利用検出状態の図" width="1500" height="1189" data-path="docs/images/ja-jp/cdy7uua7fh8z/36rAUgLOAqW7k7Fdl1eRN1/7c659b1c742aae28fc6c89620d5badd4/reuse-detection2.png" />
</Frame>

## SDKサポート

以下のSDKは、リフレッシュトークンのローテーションと再利用の自動検出に対応しています。

* Auth0 SPA SDK
* Flutter (Web)
* Swift (iOS) SDK
* Android SDK
* Flutter
* React Native SDK
* WPF / Winforms
* Xamarin

これらのSDKに特定のドキュメントについては、[Auth0 SDKライブラリー](/docs/ja-jp/libraries)のページをご覧ください。

トークンの保管場所は、ローカルストレージまたはブラウザーのメモリーを選択することができます。デフォルトはブラウザーのメモリーです。トークンのストレージに関する推奨については、「[トークンのベストプラクティス](/docs/ja-jp/secure/tokens/token-best-practices)」を参照してください。オフラインアクセスを有効にして、クライアントSDKでオフラインアクセスのスコープを要求しなければなりません。

## もっと詳しく

* [リフレッシュトークンのローテーションを構成する](/docs/ja-jp/secure/tokens/refresh-tokens/configure-refresh-token-rotation)
* [リフレッシュトークンのローテーションを無効にする](/docs/ja-jp/secure/tokens/refresh-tokens/disable-refresh-token-rotation)
* [リフレッシュトークンの有効期限を構成する](/docs/ja-jp/secure/tokens/refresh-tokens/configure-refresh-token-expiration)
* [トークンのベストプラクティス](/docs/ja-jp/secure/tokens/token-best-practices)
