Spring Session - カスタムクッキー

このガイドでは、Java 構成でカスタム Cookie を使用するように Spring Session を構成する方法について説明します。このガイドでは、選択したデータストアを使用してプロジェクトに Spring Session がすでに設定されていることを前提としています。例: Redis を使用した HttpSession

完成したガイドはカスタム 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;
	}
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

ドメイン名はレスポンスに反映されるため、有効なドメイン文字のみを照合する必要があります。そうすることで、悪意のあるユーザーが HTTP レスポンスの分割 [Wikipedia] (英語) などの攻撃を実行するのを防ぎます。

このセクションでは、custom-cookie サンプルアプリケーションの操作方法について説明します。

サンプルを実行するには、ソースコードを取得し、次のコマンドを呼び出します。

$ ./gradlew :spring-session-sample-javaconfig-custom-cookie:tomcatRun
サンプルを機能させるには、ローカルホストで Redis 2.8+ をインストールします (英語) を実行し、デフォルトのポート (6379) で実行する必要があります。または、Redis サーバーを指すように RedisConnectionFactory を更新することもできます。もう 1 つのオプションは、Docker (英語) を使用してローカルホストで Redis を実行することです。詳細な手順については、Docker Redis リポジトリ (英語) を参照してください。

これで、localhost:8080/ でアプリケーションにアクセスできるようになります。

これで、アプリケーションを使用できます。フォームに次の情報を記入します。

  • 属性名 : ユーザー名

  • 属性値 : rob

次に、属性を設定するボタンをクリックします。これで、テーブルに表示された値が表示されます。

アプリケーションの Cookie を見ると、Cookie が JSESSIONID のカスタム名で保存されていることがわかります。