是否可以在 Spring Boot 中设置 Same-Site Cookie 标志?
我在 Chrome 中的问题:
与 http://google.com/ 上的跨站点资源关联的 cookie 设置为没有
SameSite
属性。如果设置了SameSite=None
和Secure
,未来的 Chrome 版本将只提供带有跨站点请求的 cookie。您可以在应用程序>存储>Cookies 下的开发人员工具中查看 cookie,并在 https://www.chromestatus.com/feature/5088147346030592 和 https://www.chromestatus.com/feature/5633521622188032 中查看更多详细信息。
如何解决这个问题呢?
原文由 Nikolas Soares 发布,翻译遵循 CC BY-SA 4.0 许可协议
春季启动 2.6.0
Spring Boot 2.6.0 现在支持配置 SameSite cookie 属性:
通过属性配置
通过代码配置
Spring Boot 2.5.0 及以下
Spring Boot 2.5.0-SNAPSHOT 不支持 SameSite cookie 属性并且没有启用它的设置。
Java Servlet 4.0 规范不支持 SameSite cookie 属性。您可以通过打开 javax.servlet.http.Cookie java 类来查看可用属性。
但是,有几个解决方法。您可以手动覆盖 Set-Cookie 属性。
第一种方法(使用自定义 Spring HttpFirewall)和围绕请求的包装器:
您需要在创建会话后立即包装请求并调整 cookie。您可以通过定义以下类来实现它:
一个bean(如果你想把所有东西都放在一个地方,你可以在SecurityConfig中定义它。为了简洁起见,我只是在上面放了@Component注解)
第一个包装类
第二个包装类
第二种方法(使用 Spring 的 AuthenticationSuccessHandler):
第三种方法(使用 javax.servlet.Filter):
您可以查看 GitHub 上的 这个演示项目,了解有关 org.springframework.security.web.authentication.AuthenticationSuccessHandler 或 javax.servlet.Filter 配置的更多详细信息。
SecurityConfig 包含所有必要的配置。