LoginSignup
18
15

Spring Securityでログイン後のURLに付くcontinueクエリパラメータの正体

Last updated at Posted at 2024-01-04

環境

  • Spring Boot 3.2
  • Spring Security 6.2

この記事の内容が該当するのは、Spring Security 5.8以降です。

ある日気づいた

Spring Securityでログイン付きのWebアプリを作ってログインしたら、URLにcontinueというクエリパラメータが付いていました。

スクリーンショット 2024-01-04 16.11.02.png

こんなん付いてたっけ?と思ったので調べてみました。

RequestCacheとは

  1. ログインが必要なURLにアクセス
  2. 未ログインなのでログイン画面にリダイレクトされる
  3. ログイン画面に正しいユーザー名・パスワードを入力
  4. 認証完了後、1.でアクセスしたURLにリダイレクトされる

という流れは、認証付きのWebアプリでよくあります。Spring Securityではこれを実現するために、1.でのリクエスト情報(URLやクエリパラメータなど)をRequestCacheという場所にキャッシュしています。RequestCacheはインタフェースで、デフォルトの実装クラスはHttpSessionRequestCacheです。名前の通りHttpSessionにリクエスト情報をキャッシュします。

このRequestCacheRequestCacheAwareFilterで利用されます。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はどこで付加されるか

ログイン成功後に呼ばれるSavedRequestAwareAuthenticationSuccessHandlerDafaultSavedRequest#getRedirectUrl()を呼ぶことで付加されます。

ソース → https://github.com/spring-projects/spring-security/blob/main/web/src/main/java/org/springframework/security/web/authentication/SavedRequestAwareAuthenticationSuccessHandler.java#L89

参考資料

18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15