在Spring Boot(Spring Web MVC + Tomcat)中的SameSite Cookie
我查找了一下如何在Spring Boot(Spring Web MVC + Tomcat)中使用SameSite Cookie。
同源策略 (SameSite Cookie) 是什么?
请参考MDN文档。
- https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies#SameSite_cookies_experimental_inline
Tomcat对SameSite Cookie的支持
在Tomcat中,我们使用javax.servlet.http.Cookie将Cookie序列化为字符串,并将其写入到HTTP响应中。
序列化过程通过org.apache.tomcat.util.http.CookieProcessor接口进行。
org.apache.tomcat.util.http.Rfc6265CookieProcessor是一个实现类,它提供了setSameSiteCookies方法,可以用来设置SameSite属性。
- https://tomcat.apache.org/tomcat-9.0-doc/config/cookie-processor.html
只需要一种选择,下面是对原文的中文翻译:
要设置一个带有SameSite属性的Rfc6265CookieProcessor,必须将其设置给org.apache.catalina.Context。但是,由于我只是想在Spring Boot中使用它,所以跳过了在Tomcat上进行个性化定制的方法。
使用Spring Boot来自定义CookieProcessor。
在Spring Boot中,您可以准备一个实现了org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer接口的组件,以便自定义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);
}
}
- 完全なコード例 https://github.com/backpaper0/spring-boot-sandbox/tree/master/samesite-cookie-demo
春季会话默认具有SameSite属性。
通过@tokuhirom先生的教导,我了解到使用Spring Session时,默认会添加SameSite属性。
总结
我发现在Spring Boot(Spring Web MVC + Tomcat)中使用SameSite Cookie有两种方法。
Note: It is recommended to always double-check the accuracy of translations with a native speaker.
TomcatContextCustomizerをimplementsしたコンポーネントを用意してContextへカスタマイズしたRfc6265CookieProcessorをセットする
Spring Sessionを使用する