Spring Boot(Spring Web MVC + Tomcat)でSameSite Cookieを使うにはどのようにすればいいか、調べてみました。
SameSite Cookieとはなにか
MDNのドキュメントを参照してください。
TomcatのSameSite Cookie対応
TomcatではCookieをHTTPレスポンスへ書き出すためjavax.servlet.http.Cookieから文字列へのシリアライズを行います。
シリアライズはorg.apache.tomcat.util.http.CookieProcessorインターフェースを通じて行われます。
実装クラスとしてorg.apache.tomcat.util.http.Rfc6265CookieProcessorが用意されていますが、このRfc6265CookieProcessorクラスのsetSameSiteCookiesメソッドを使用してSameSite属性を付けられます。
SameSite属性を付ける設定をしたRfc6265CookieProcessorはorg.apache.catalina.Contextへセットしないといけませんが、とりあえずSpring Bootで使えればそれで良いのでTomcat単体でのカスタマイズ方法はスキップします。
Spring BootでCookieProcessorをカスタマイズする
Spring Bootではorg.springframework.boot.web.embedded.tomcat.TomcatContextCustomizerインターフェースをimplementsしたコンポーネントを用意するとTomcatのContextをカスタマイズできます。
次のような実装クラスでCookieへSameSite属性を付けられます。
package com.example;
import org.apache.catalina.Context;
import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.stereotype.Component;
@Component
public class SameSiteCookieTomcatContextCustomizer implements TomcatContextCustomizer {
@Override
public void customize(final Context context) {
final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
cookieProcessor.setSameSiteCookies("Lax");
context.setCookieProcessor(cookieProcessor);
}
}
Spring SessionはデフォルトでSameSite属性が付く
@tokuhirom さんに教えてもらったのですがSpring Sessionを使用するとデフォルトでSameSite属性が付くようです。
まとめ
Spring Boot(Spring Web MVC + Tomcat)でSameSite Cookieを使うには次に示す2通りの方法があることがわかりました。
-
TomcatContextCustomizerをimplementsしたコンポーネントを用意してContextへカスタマイズしたRfc6265CookieProcessorをセットする - Spring Sessionを使用する