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を使用する