Spring Session - カスタムクッキー
このガイドでは、Java 構成でカスタム Cookie を使用するように Spring Session を構成する方法について説明します。このガイドでは、選択したデータストアを使用してプロジェクトに Spring Session がすでに設定されていることを前提としています。例: Redis を使用した HttpSession。
完成したガイドはカスタム Cookie サンプルアプリケーションにあります。 |
Spring Java 構成
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
ドメイン名はレスポンスに反映されるため、有効なドメイン文字のみを照合する必要があります。そうすることで、悪意のあるユーザーが HTTP レスポンスの分割 [Wikipedia] (英語) などの攻撃を実行するのを防ぎます。 |
custom-cookie
サンプルアプリケーション
このセクションでは、custom-cookie
サンプルアプリケーションの操作方法について説明します。
custom-cookie
サンプルアプリケーションの実行
サンプルを実行するには、ソースコードを取得し、次のコマンドを呼び出します。
$ ./gradlew :spring-session-sample-javaconfig-custom-cookie:tomcatRun
サンプルを機能させるには、ローカルホストで Redis 2.8+ をインストールします (英語) を実行し、デフォルトのポート (6379) で実行する必要があります。または、Redis サーバーを指すように RedisConnectionFactory を更新することもできます。もう 1 つのオプションは、Docker (英語) を使用してローカルホストで Redis を実行することです。詳細な手順については、Docker Redis リポジトリ (英語) を参照してください。 |
これで、localhost:8080/ でアプリケーションにアクセスできるようになります。