更新トークンには、少なくとも2つの目的があります。まず、更新トークンは、OAuth2クライアントがユーザーからデータへのアクセス許可をすでに受け取っていることの一種の「証明」であるため、ユーザーがOAuth2フロー全体を実行しなくても、新しいアクセストークンを再度要求できます。そして第二に、それは長命のアクセストークンと比較してセキュリティの全体の流れを増やすのに役立ちます。これらの両方の点についてもう少し詳しく触れます。
ユーザーを煩わせないための手段としてトークンを更新する
最初の目的について例を挙げて話しましょう。ユーザーであるあなたが、YouTubeアカウントデータを操作したいサードパーティのクライアントWebアプリケーションを使用していたとします。クライアントアプリケーションにYouTubeデータの使用を許可したら、クライアントアプリから再度許可を求めるプロンプトを表示しますか?YouTubeトークンの有効期限が切れたのはいつですか?YouTubeトークンの有効期限が5分など、非常に短い場合はどうなりますか。クライアントアプリケーションが少なくとも5分ごとに許可を求めるプロンプトを表示するのは、少し面倒です。OAuth2がこの「問題」に対して提案する解決策は、更新トークンです。更新トークンを使用することで、アクセストークンの有効期間を短くすることができ(アクセストークンがリークされたり、何らかの理由で盗まれた場合に望ましい)、更新トークンの有効期間を長くすることができるため、クライアントは新しいアクセスを取得できます。ユーザーの許可を必要とせずに(再び)期限切れになったときのトークン。
しかし、なぜリフレッシュトークンなのですか?ポイントがアクセス許可要求でユーザーを悩ませないことである場合、なぜクライアントは単に「ねえ、認証サーバー、別のアクセストークンが必要です。今すぐ!」と言うことができないのですか?または、「Hey Authorization Server、これが期限切れのトークンです。新しいトークンをください!」さて、更新トークンは、ある元の時点でクライアントがユーザーによってアクセスを許可されたという一種の「証拠」として機能します。この「証明」は、認証サーバーによってデジタル署名された更新トークンの形式です。クライアントが更新トークンを提示することにより、承認サーバーは、クライアントが過去のある時点でユーザーから許可を受け取ったことを確認でき、クライアントはユーザーに再度プロンプトを表示する必要がありません。
セキュリティを強化する手段としてトークンを更新する
ただし、これにより、「更新トークンがリークまたは盗まれた場合、またはユーザーの要求に応じて更新トークンを削除しない悪意のあるクライアントアプリケーションによって保持された場合はどうなりますか?攻撃者は続行できません。更新トークンを使用して、有効なアクセストークンを無期限に(または有効期限が切れるまで)取得しますか?この質問は、より安全なフローに寄与する更新トークンの2番目の目的について説明します。
アクセストークンで発生する問題は、一度取得すると、リソースサーバー(YouTubeなど)にのみ提示されることです。では、アクセストークンが盗まれたり侵害されたりした場合、そのトークンを信頼しないようにResource Serverにどのように指示しますか?まあ、あなたは本当にできません。これを行う唯一の方法は、認証サーバーの秘密署名キー(最初にトークンに署名したキー)を変更することです。これは不便であり、場合によっては(Auth0など)サポートされていないと思います。
一方、更新トークンは承認サーバーに頻繁に提示する必要があるため、1つが侵害された場合は、更新トークン全体を取り消すか拒否するのは簡単で、署名キーを変更する必要はありません。