リフレッシュトークンとは?再ログインなしでアクセスを更新する
リフレッシュトークンとは、ユーザーに再ログインを強いることなく、アプリケーションが新しく短命なアクセストークンを取得できるようにする、長命の認証情報です。
リフレッシュトークンは OAuth における緊張関係を解決します。アクセストークンは漏洩時の被害を抑えるために短命であるべきですが、数分ごとにユーザーへログインを強いるのは苦痛です。リフレッシュトークンはそのギャップを埋め、バックグラウンドで静かに新しいアクセストークンを発行します。長命であるがゆえに、価値の高い標的でもあります。
アクセストークンとリフレッシュトークン
アクセストークンは API を呼び出すために提示するものであり、すぐに期限切れになります。リフレッシュトークンはクライアントが秘密裏に保持し、古いものが期限切れになったときに認可サーバーで新しいアクセストークンと交換されます。両者はライフタイムも用途も大きく異なります。
リフレッシュフローの仕組み
- クライアントはログイン時にアクセストークンとリフレッシュトークンを取得します。
- アクセストークンを期限切れになるまで使用します。
- リフレッシュトークンを送信して新しいアクセストークンを取得します。ユーザーへの確認は不要です。
なぜこの設計がより安全なのか
短命なアクセストークンは、漏洩したトークンが有用である時間枠を限定します。リフレッシュトークンは API トラフィックの外に留まり、認可サーバーでのみ交換されるため、それが更新するアクセストークンよりもはるかに露出頻度が少なくなります。
リフレッシュトークンを保護する
長期間にわたってアクセストークンを発行できるため、盗まれたリフレッシュトークンは深刻です。優れたシステムはそれを安全に保管し、クライアントに紐付け、ローテーションを使用します。使用のたびに新しいリフレッシュトークンを発行して古いものを無効化するため、盗難が検出可能になります。
CI/CD におけるリフレッシュトークン
CI プラットフォームと他のサービスの間の長時間稼働する統合は、接続を維持するためにリフレッシュトークンに依存することがあります。それらを価値の高いシークレットとして扱い、保管時に暗号化し、アクセスを制限し、統合が削除されたら速やかに失効させましょう。
パイプラインは常設トークンを持たないことを好む
job ごとのパイプラインアクセスでは、現代的なパターンは OIDC 経由で認証情報をその場で発行することにより、保管済みリフレッシュトークンを完全に回避します。各 job は clean な状態で始まり、ephemeral な runner 上で clean な状態で終わるため、保護すべき長命なものが何もありません。
重要なポイント
- リフレッシュトークンは再ログインなしで新しい短命なアクセストークンを発行します。
- 長命かつ価値が高いため、安全に保管し、理想的にはローテーションすべきです。
- job ごとのパイプラインアクセスは、OIDC 経由で認証情報を発行することで保管済みトークンを不要にできます。