セッション管理の移行

次の手順は、セッション管理サポートの移行を完了する方法に関連しています。

SecurityContextRepository の明示的な保存が必要

Spring Security 5 のデフォルトの動作は、SecurityContextPersistenceFilter を使用して SecurityContextSecurityContextRepository に自動的に保存されることです。保存は、HttpServletResponse がコミットされる直前、および SecurityContextPersistenceFilter の直前に行う必要があります。残念ながら、SecurityContext の自動永続化は、リクエストが完了する前 (つまり、HttpServletResponse をコミットする直前) に行われると、ユーザーを驚かせる可能性があります。また、状態を追跡して保存が必要かどうかを判断するのも複雑で、SecurityContextRepository (つまり HttpSession) への不必要な書き込みが発生することがあります。

Spring Security 6 のデフォルトの動作は、SecurityContextHolderFilter が SecurityContextRepository から SecurityContext のみを読み取り、それを SecurityContextHolder に入力することです。リクエスト間で SecurityContext を保持したい場合、ユーザーは SecurityContext を SecurityContextRepository と共に明示的に保存する必要があります。これにより、必要な場合にのみ SecurityContextRepository (つまり HttpSession) への書き込みが必要になるため、あいまいさがなくなり、パフォーマンスが向上します。

ログアウト時など、コンテキストをクリアするときにもコンテキストを保存する必要があります。詳細については、このセクションを参照してください。

Spring Security 6 の新しいデフォルトを明示的に選択している場合は、次の構成を削除して Spring Security 6 のデフォルトを受け入れることができます。

SecurityContext の明示的な保存
  • Java

  • Kotlin

  • XML

public SecurityFilterChain filterChain(HttpSecurity http) {
	http
		// ...
		.securityContext((securityContext) -> securityContext
			.requireExplicitSave(true)
		);
	return http.build();
}
@Bean
open fun springSecurity(http: HttpSecurity): SecurityFilterChain {
    http {
        securityContext {
            requireExplicitSave = true
        }
    }
    return http.build()
}
<http security-context-explicit-save="true">
	<!-- ... -->
</http>

構成を使用する際、SecurityContextHolder を SecurityContext で設定するコードは、リクエスト間で永続化する必要がある場合、SecurityContext を SecurityContextRepository に保存することも重要です。

例: 次のコード:

SecurityContextPersistenceFilter で SecurityContextHolder を設定する
  • Java

  • Kotlin

SecurityContextHolder.setContext(securityContext);
SecurityContextHolder.setContext(securityContext)

次に置き換える必要があります

SecurityContextHolderFilter で SecurityContextHolder を設定する
  • Java

  • Kotlin

SecurityContextHolder.setContext(securityContext);
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);
SecurityContextHolder.setContext(securityContext)
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse)

複数の SecurityContextRepository

Spring Security 5 では、デフォルトの SecurityContextRepository は HttpSessionSecurityContextRepository でした。

Spring Security 6 では、デフォルトの SecurityContextRepository は DelegatingSecurityContextRepository です。6.0 への更新のみを目的として SecurityContextRepository を構成した場合は、完全に削除できます。

SecurityContextRepository での非推奨

この非推奨のため、これ以上の移行手順はありません。

RequestCache のクエリを最適化する

Spring Security 5 では、デフォルトの動作は、リクエストごとに保存されたリクエストを照会することです。これは、通常のセットアップでは、RequestCache を使用するために、リクエストごとに HttpSession が照会されることを意味します。

Spring Security 6 では、デフォルトでは、HTTP パラメーター continue が定義されている場合にのみ、RequestCache がキャッシュされたリクエストに対してクエリされます。これにより、Spring Security が RequestCache で HttpSession を不必要に読み取ることを回避できます。

Spring Security 5 では、デフォルトで HttpSessionRequestCache が使用され、リクエストごとにキャッシュされたリクエストが照会されます。デフォルトをオーバーライドしない場合 (つまり、NullRequestCache を使用する場合)、次の構成を使用して、Spring Security 5.8 で Spring Security 6 の動作を明示的に選択できます。

 continue パラメーターが存在する場合、RequestCache は保存されたリクエストのみをチェックします
  • Java

  • Kotlin

  • XML

@Bean
DefaultSecurityFilterChain springSecurity(HttpSecurity http) throws Exception {
	HttpSessionRequestCache requestCache = new HttpSessionRequestCache();
	requestCache.setMatchingRequestParameterName("continue");
	http
		// ...
		.requestCache((cache) -> cache
			.requestCache(requestCache)
		);
	return http.build();
}
@Bean
open fun springSecurity(http: HttpSecurity): SecurityFilterChain {
    val httpRequestCache = HttpSessionRequestCache()
    httpRequestCache.setMatchingRequestParameterName("continue")
    http {
        requestCache {
            requestCache = httpRequestCache
        }
    }
    return http.build()
}
<http auto-config="true">
	<!-- ... -->
	<request-cache ref="requestCache"/>
</http>

<b:bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"
	p:matchingRequestParameterName="continue"/>