API実装でトークン認証について調べている際に、リフレッシュトークン(アクセストークンの有効期限が一時間ほどなのに比べ、こちらは数か月など)の必要性が分からなかったため調べてみた。
リフレッシュトークンは有効期限が切れる際にサーバーに送信され、両トークンの再発行を行うために使用されるとのこと。
であれば初めからアクセストークンのリフレッシュトークンと同じように長くとれば良いのでは、、、と思ったのが始まり。
アクセストークンを使った認証の流れ
以下の流れ
- ユーザーがログインした際に、サーバー側でアクセストークンを発行
- ブラウザはアクセストークンを受け取り、保持
- ブラウザはエンドポイントにアクセスする時に、ヘッダーにアクセストークンを付与して送信
- サーバーはアクセストークンを受け取って、認証を行い、成功するとレスポンス
- アクセストークンの有効期限が切れたら、ユーザーは再びログイン
引用: 【Python】FastAPIでトークン認証を実装してみた
リフレッシュトークンを使用した、トークンの再取得の流れ
以下の流れ(5までは↑と同じ)
- ユーザーがログインした際に、サーバー側でアクセストークンを発行
- ブラウザはアクセストークンを受け取り、保持
- ブラウザはエンドポイントにアクセスする時に、ヘッダーにアクセストークンを付与して送信
- サーバーはアクセストークンを受け取って、認証を行い、成功するとレスポンス
- アクセストークンの有効期限が切れたら、ユーザーは再びログイン
- アクセストークンの有効期限が切れたら、ブラウザはトークン再取得のエンドポイントにリフレッシュトークンを送信
- サーバーはリフレッシュトークンを受け取り、ユーザーに紐付いたリフレッシュトークンと一致しているか確認し、認証に成功したらトークンを再発行
まとめ
リフレッシュトークンの目的は、セキュリティを向上すること。
各トークンの特徴として以下が挙げられる。
- アクセストークン
- 有効期限が短いため、盗難された場合でも限定された期間しか使用不可
- 一方、エンドポイントにアクセスする毎にサーバーに送信されるため盗難の可能性が比較的高い
- リフレッシュトークン
- 有効期限が切れて両トークンの再発行をする際にのみサーバーに送信される
まとめると、何度も送信されるため盗聴される可能性の高いアクセストークンを、その可能性の低いリフレッシュトークンを使用して定期的に更新する、という欠点の補い合いのような感覚。
参考文献
この記事は以下の情報を参考にして執筆しました。