環境
- Spring Boot 3.2
- Spring Security 6.2
この記事の内容が該当するのは、Spring Security 5.8以降です。
ある日気づいた
Spring Securityでログイン付きのWebアプリを作ってログインしたら、URLにcontinue
というクエリパラメータが付いていました。
こんなん付いてたっけ?と思ったので調べてみました。
RequestCache
とは
- ログインが必要なURLにアクセス
- 未ログインなのでログイン画面にリダイレクトされる
- ログイン画面に正しいユーザー名・パスワードを入力
- 認証完了後、1.でアクセスしたURLにリダイレクトされる
という流れは、認証付きのWebアプリでよくあります。Spring Securityではこれを実現するために、1.でのリクエスト情報(URLやクエリパラメータなど)をRequestCache
という場所にキャッシュしています。RequestCache
はインタフェースで、デフォルトの実装クラスはHttpSessionRequestCache
です。名前の通りHttpSession
にリクエスト情報をキャッシュします。
このRequestCache
はRequestCacheAwareFilter
で利用されます。Spring Security 5.7まででは、全リクエストでリクエスト保存+取得処理を行っていたようです。
Spring Security 5.8での改修
しかしこのリクエスト保存+取得処理は、ログイン前にログイン必須なURLにアクセスしていた場合のみ必要なはずです。セッションがインメモリならばそんなに問題にはならないと思いますが、Spring Sessionなどを利用してセッションをRedisやRDBなどに保存していた場合は、リクエスト保存+取得処理に(インメモリと比較すると)かなりの時間がかかります。
そこでSpring Security 5.8で、リクエストされたURLにcontinue
クエリパラメータが含まれる場合のみキャッシュされたリクエストを取得するように改修されました。(キャッシュへのリクエスト保存は、相変わらず全リクエストで行われます)
Issue → https://github.com/spring-projects/spring-security/issues/11453
continue
はどこで付加されるか
ログイン成功後に呼ばれるSavedRequestAwareAuthenticationSuccessHandler
がDafaultSavedRequest#getRedirectUrl()
を呼ぶことで付加されます。