とりあえず走り書きです。時間がある時にブラッシュアップします。
refresh_tokenをcookieに保存するのはセキュリティリスクがあるのでは?と考え、ではSPAアプリケーションでどうやってセキュアにaccess_tokenのrefreshをするのかを考えました。
認証
- code_challenge, code_verifierの作成
- 認証リクエスト
- コールバック後、tokenリクエスト
- id_tokenの検証
- refresh_tokenをredisに保存し、session keyを発行
- session_keyとaccess_tokenをcookieに保存
- 画面を表示
- 以後SPA
アクセス時認可
- サーバーサイドでaccess_tokenの有効性を確認
- 無効な場合、token refreshフローへ
- 画面を返す
- 以後SPA
定期的認可
- 一定の間隔(1時間?2時間?)でリロードする
- アクセス時認可が走る
token refresh フロー
- cookieからsession_keyを取り出す
- refresh_tokenをredisから取り出す
- token refresh apiを叩く
- 新しいrefresh_tokenをredisに保存して新しいsession_keyを取得
- access_tokenとsession_keyをcookieに保存
全体として、このフローはセキュリティを確保しつつ、SPAでのUXを最適化するための適切なアプローチを示しています。ただし、実装する際には、セキュリティ設定(特にCookieのHttpOnly、Secure、SameSite属性)や、セキュリティベストプラクティスへの準拠を確実に行うことが重要です。また、トークンの有効期間やリフレッシュ戦略を適切に設計することで、セキュリティリスクをさらに低減することが可能です。
これがベストなのかはわかんないです。もっといい方法を知っている方がいたらコメントお願いします