日本語
  • token
  • oidc
  • refresh token
  • rotation
  • security

リフレッシュトークンのローテーションとは何か、それはなぜ重要なのか?

リフレッシュトークンのローテーションが、リフレッシュトークンの安全性を保護するための効果的な方法である理由についてお話しします。

Charles
Charles
Developer

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

リフレッシュトークンは、現在のアクセストークンが期限切れになった際に新しいアクセストークンを取得するために使用される特別なタイプのトークンです。詳しくは、以前の投稿OIDCにおけるトークンの理解をご覧ください。

はじめに、Logtoでは、リフレッシュトークンの安全を保護するために、「リフレッシュトークンのローテーション」メカニズムをデフォルトで実施していることも述べました。

しかし、「リフレッシュトークンのローテーション」とは何か一体どういうものなのでしょうか?それがどのようにエンドユーザーに利益をもたらすのでしょうか?詳しく見ていきましょう!

リフレッシュトークンのローテーションとは?

リフレッシュトークンのローテーションは、新しいアクセストークンを取得するためにリフレッシュトークンが使用された際に、以前のリフレッシュトークンを無効にし、新しいトークンを発行するメカニズムです。このメカニズムは、リフレッシュトークンが期限切れになる前に更新されることを保証します。

なぜリフレッシュトークンのローテーションが必要なのか?

リフレッシュトークンは通常、数週間や数ヶ月という長期間有効です。そして、リフレッシュトークンを使用して新しいアクセストークンを取得できるため、リフレッシュトークンは攻撃者にとって魅力的な標的となります。したがって、OAuth 2.0 BCPによると、認可サーバーはこのような攻撃を防ぐために以下のいずれかの措置を講じる必要があります。

  • 送信者制約付きリフレッシュトークンを発行する:クライアントはリフレッシュリクエストヘッダーに署名(Sec-Token-Binding)を提供し、発行されたリフレッシュトークンが特定のクライアントに暗号的に結び付けられます。しかし、現在では、一部のネイティブクライアントのみが送信者制約付きであり、最新のSPAやモバイルクライアントの多くが公開されています。
  • リフレッシュトークンのローテーション:認可サーバーは(新しいアクセストークンと交換するときに通常)、新しいリフレッシュトークンを発行し、以前のトークンを無効にします。これにより、トークン流出のリスクが軽減されます。

リフレッシュトークンのローテーションを実装するためのベストプラクティス

Logtoでは、ユーザーが正常にサインインすると、最初にDBにGrantオブジェクトが作成され、その後発行されるリフレッシュトークンには、最初のGrantオブジェクトを指すgrantIdが参照として付与されます。

リフレッシュトークンのローテーションが発生すると、以前のリフレッシュトークンは消費済みとしてマークされ、Logto認可サーバーは同じgrantIdで新しいリフレッシュトークンを発行します。

以前のリフレッシュトークンが漏洩した場合、正当なクライアントまたは攻撃者がそれを使用してアクセストークンを交換したことになります。そして、誰がそれを行ったかに関係なく、漏洩したリフレッシュトークンはすでにローテーションされ、消費済みとしてマークされている必要があります。消費済みのリフレッシュトークンを再度使用した一方の情報は、認可サーバーに侵害を通知します。認可サーバーは、同じgrantIdのリフレッシュトークンをすべて失効させます。

上記のケースでは、警報が発動された後、正当なクライアントは新しいリフレッシュトークンを取得するために再認証を行う必要があります。一方で、攻撃者はシステムの制御を失い、ブロックされます。

リフレッシュトークンのローテーションはいつ発生するのか?

Logtoでは、リフレッシュトークンのローテーションのデフォルト動作は以下のように定義されています。

  • クライアントが送信者制約付きかつ非公開(たとえば、サーバーサイドレンダリングのWebアプリケーション)の場合、リフレッシュトークンのローテーションはその全体の有効期限の70%に達したときに発生します。
  • クライアントがパブリッククライアント(たとえば、シングルページWebアプリケーション)の場合、アクセストークンと交換するたびにリフレッシュトークンのローテーションが発生します。トークン交換の応答は、新しいアクセストークンと新しいリフレッシュトークンの両方を返します。

Logtoでリフレッシュトークンのローテーションを有効/無効にする方法

Logto管理コンソールで、Admin Console > Applicationsに移動し、リフレッシュトークンのローテーションを切り替えたいアプリケーションを選びます。アプリケーション詳細ページで、「詳細設定」タブに移動し、一番下までスクロールすると、スイッチと他のいくつかの有用な設定が見つかります。

App details

スイッチをオフにすると、リフレッシュトークンは失効するまで決してローテーションされません。したがって、常にリフレッシュトークンのローテーションを有効にしておくことを強くお勧めします。

まとめ: リフレッシュトークンのローテーションとは何か、それはなぜ重要なのか?

リフレッシュトークンのローテーションは、アプリケーション内でリフレッシュトークンの安全性を確保するためのベストプラクティスです。リフレッシュトークンが新しいアクセストークンを取得するために使用された際に、以前のリフレッシュトークンを無効にし、新しいトークンを発行します。このメカニズムは、トークンの漏洩リスクを軽減し、リフレッシュトークンの安全性を保証します。

Logtoは業界をリードするベストプラクティスに従い、常にユーザーの安全性を最優先に考えています。

このブログがリフレッシュトークンのローテーションメカニズムに関するあなたの疑問をうまく説明できたことを願っています。まだ不明な点がある場合はお知らせください。皆さんのフィードバックとご提案を常にお待ちしています!

今日からLogtoをお試しになり、より安全な認証体験を取り入れましょう。