共通構成
このセクションには、すべてまたはほとんどの Spring Session モジュールに適用される共通の設定が含まれています。これには、次の使用例の構成例が含まれています。
セッション ID の生成方法の変更
デフォルトでは、Spring Session は UuidSessionIdGenerator
を使用し、UuidSessionIdGenerator
は java.util.UUID
を使用してセッション ID を生成します。エントロピーを増やすために他の文字を含めた方がよいシナリオや、セッション ID を生成するために別のアルゴリズムを使用したい場合があります。これを変更するには、カスタム SessionIdGenerator
Bean を指定します。
Java
@Bean
public SessionIdGenerator sessionIdGenerator() {
return new MySessionIdGenerator();
}
class MySessionIdGenerator implements SessionIdGenerator {
@Override
public String generate() {
// ...
}
}
SessionIdGenerator
Bean を公開すると、Spring Session はそれを使用してセッション ID を生成します。
(たとえば @EnableRedisHttpSession
を使用する代わりに) SessionRepository
Bean を手動で構成している場合は、SessionRepository
実装で SessionIdGenerator
を直接設定できます。
SessionIdGenerator
を SessionRepository
実装に直接設定する Java
@Bean
public RedisSessionRepository redisSessionRepository(RedisOperations redisOperations) {
RedisSessionRepository repository = new RedisSessionRepository(redisOperations)
repository.setSessionIdGenerator(new MySessionIdGenerator());
return repository;
}
セッション Cookie のカスタマイズ
Spring Session を設定したら、CookieSerializer
を Spring Bean として公開することにより、セッション Cookie の書き込み方法をカスタマイズできます。Spring Session には DefaultCookieSerializer
が付属しています。DefaultCookieSerializer
を Spring として公開する Bean は、@EnableRedisHttpSession
のような構成を使用する場合、既存の構成を拡張します。次の例は、Spring Session の Cookie をカスタマイズする方法を示しています。
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("JSESSIONID"); (1)
serializer.setCookiePath("/"); (2)
serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); (3)
return serializer;
}
1 | Cookie の名前を JSESSIONID にカスタマイズします。 |
2 | Cookie のパスを(コンテキストルートのデフォルトではなく) / になるようにカスタマイズします。 |
3 | ドメイン名のパターン(正規表現)を ^.?\\.(\\w\\.[a-z]+)$ にカスタマイズします。これにより、ドメインやアプリケーション間でセッションを共有できます。正規表現が一致しない場合、ドメインは設定されず、既存のドメインが使用されます。正規表現が一致する場合、最初のグループ化 [Oracle] (英語) がドメインとして使用されます。これは、child.example.com (英語) へのリクエストがドメインを example.com に設定することを意味します。ただし、localhost:8080/ または 192.168.1.100:8080/ (英語) へのリクエストでは、Cookie が未設定のままであるため、本番環境で変更を加えることなく、開発中も機能します。 |
ドメイン名はレスポンスに反映されるため、有効なドメイン文字のみを照合する必要があります。そうすることで、悪意のあるユーザーが HTTP レスポンスの分割 [Wikipedia] (英語) などの攻撃を実行するのを防ぎます。 |
構成オプション
次の構成オプションが利用可能です。
cookieName
: 使用する Cookie の名前。デフォルト:SESSION
.useSecureCookie
: 安全な Cookie を使用するかどうかを指定します。デフォルト: 作成時のHttpServletRequest.isSecure()
の値を使用します。cookiePath
: クッキーのパス。デフォルト: コンテキストルート。cookieMaxAge
: セッションの作成時に設定される Cookie の最大有効期間を指定します。デフォルト:-1
は、ブラウザーを閉じたときに Cookie を削除する必要があることを示します。jvmRoute
: セッション ID に追加され、Cookie に含まれるサフィックスを指定します。セッションアフィニティのためにルーティングする JVM を識別するために使用されます。一部の実装(つまり、Redis)では、このオプションはパフォーマンス上の利点を提供しません。ただし、特定のユーザーのログを追跡できます。domainName
: Cookie に使用する特定のドメイン名を指定できます。このオプションは理解しやすいですが、多くの場合、開発環境と本番環境の間で異なる構成が必要になります。代わりにdomainNamePattern
を参照してください。domainNamePattern
:HttpServletRequest#getServerName()
からドメイン名を抽出するために使用される大文字と小文字を区別しないパターン。パターンは、Cookie ドメインの値を抽出するために使用される単一のグループ化を提供する必要があります。正規表現が一致しない場合、ドメインは設定されず、既存のドメインが使用されます。正規表現が一致する場合、最初のグループ化 [Oracle] (英語) がドメインとして使用されます。sameSite
:SameSite
cookie ディレクティブの値。SameSite
cookie ディレクティブの直列化を無効にするには、この値をnull
に設定します。デフォルト:Lax
rememberMeRequestAttribute
: remember-me ログインを示すリクエスト属性名。指定した場合、Cookie はInteger.MAX_VALUE
として書き込まれます。
|
WebFlux のカスタム Cookie
WebSessionIdResolver
を Spring Bean として公開することにより、WebFlux アプリケーションでセッション Cookie を書き込む方法をカスタマイズできます。Spring Session はデフォルトで CookieWebSessionIdResolver
を使用します。次の例は、Spring Session の Cookie をカスタマイズする方法を示しています。
@Bean
public WebSessionIdResolver webSessionIdResolver() {
CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver();
resolver.setCookieName("JSESSIONID"); (1)
resolver.addCookieInitializer((builder) -> builder.path("/")); (2)
resolver.addCookieInitializer((builder) -> builder.sameSite("Strict")); (3)
return resolver;
}
1 | Cookie の名前を JSESSIONID にカスタマイズします。 |
2 | Cookie のパスを(コンテキストルートのデフォルトではなく) / になるようにカスタマイズします。 |
3 | SameSite cookie ディレクティブを Strict にカスタマイズします。 |
ReactiveSessionRegistry
の Spring Session 実装を提供する
Spring Session は、Spring Security との統合を提供し、リアクティブ同時セッション制御をサポートします。これにより、1 人のユーザーが同時に実行できるアクティブセッションの数を制限できますが、デフォルトの Spring Security サポートとは異なり、これはクラスター環境でも機能します。これは、Spring Security の ReactiveSessionRegistry
インターフェースの SpringSessionBackedReactiveSessionRegistry
実装を提供することで実現されます。
Java
@Bean
public <S extends Session> SpringSessionBackedReactiveSessionRegistry<S> sessionRegistry(
ReactiveSessionRepository<S> sessionRepository,
ReactiveFindByIndexNameSessionRepository<S> indexedSessionRepository) {
return new SpringSessionBackedReactiveSessionRegistry<>(sessionRepository, indexedSessionRepository);
}
ReactiveSessionRegistry
のその他の使用メソッドについては、Spring Security 同時セッション制御ドキュメントを参照してください。また、サンプルアプリケーションをこちら [GitHub] (英語) で確認することもできます。