共通構成

このセクションには、すべてまたはほとんどの Spring Session モジュールに適用される共通の設定が含まれています。これには、次の使用例の構成例が含まれています。

セッション ID の生成方法の変更

デフォルトでは、Spring Session は UuidSessionIdGenerator を使用し、UuidSessionIdGenerator は java.util.UUID を使用してセッション ID を生成します。エントロピーを増やすために他の文字を含めた方がよいシナリオや、セッション ID を生成するために別のアルゴリズムを使用したい場合があります。これを変更するには、カスタム SessionIdGenerator Bean を指定します。

セッション ID の生成方法の変更
  • 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;
}

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;
	}
1Cookie の名前を JSESSIONID にカスタマイズします。
2Cookie のパスを(コンテキストルートのデフォルトではなく) / になるようにカスタマイズします。
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 を参照してください。

  • domainNamePatternHttpServletRequest#getServerName() からドメイン名を抽出するために使用される大文字と小文字を区別しないパターン。パターンは、Cookie ドメインの値を抽出するために使用される単一のグループ化を提供する必要があります。正規表現が一致しない場合、ドメインは設定されず、既存のドメインが使用されます。正規表現が一致する場合、最初のグループ化 [Oracle] (英語) がドメインとして使用されます。

  • sameSiteSameSite cookie ディレクティブの値。SameSite cookie ディレクティブの直列化を無効にするには、この値を null に設定します。デフォルト: Lax

  • rememberMeRequestAttribute: remember-me ログインを示すリクエスト属性名。指定した場合、Cookie は Integer.MAX_VALUE として書き込まれます。

SpringSessionRememberMeServices を使用しており、カスタム DefaultCookieSerializer Bean を宣言している場合は、rememberMeRequestAttribute フィールドを設定して、Spring Session が Cookie の有効期限ではなくセッションの有効期限に依存するようにする必要があります。これを行うには、次のコードスニペットを使用できます: defaultCookieSerializer.setRememberMeRequestAttribute(SpringSessionRememberMeServices.REMEMBER_ME_LOGIN_ATTR);

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;
	}
1Cookie の名前を JSESSIONID にカスタマイズします。
2Cookie のパスを(コンテキストルートのデフォルトではなく) / になるようにカスタマイズします。
3SameSite cookie ディレクティブを Strict にカスタマイズします。

ReactiveSessionRegistry の Spring Session 実装を提供する

Spring Session は、Spring Security との統合を提供し、リアクティブ同時セッション制御をサポートします。これにより、1 人のユーザーが同時に実行できるアクティブセッションの数を制限できますが、デフォルトの Spring Security サポートとは異なり、これはクラスター環境でも機能します。これは、Spring Security の ReactiveSessionRegistry インターフェースの SpringSessionBackedReactiveSessionRegistry 実装を提供することで実現されます。

SpringSessionBackedReactiveSessionRegistry を Bean として定義する
  • Java

@Bean
public <S extends Session> SpringSessionBackedReactiveSessionRegistry<S> sessionRegistry(
        ReactiveSessionRepository<S> sessionRepository,
        ReactiveFindByIndexNameSessionRepository<S> indexedSessionRepository) {
    return new SpringSessionBackedReactiveSessionRegistry<>(sessionRepository, indexedSessionRepository);
}

ReactiveSessionRegistry のその他の使用メソッドについては、Spring Security 同時セッション制御ドキュメントを参照してください。また、サンプルアプリケーションをこちら [GitHub] (英語) で確認することもできます。