我有一个Sping Boot Web应用程序(Spring Boot版本2.0.3.RELEASE),并在Apache Tomcat 8.5.5服务器上运行。
根据Google Chrome最近实施的安全策略(自80.0起推出),要求应用新的SameSite
属性,以更安全的方式访问跨站点cookie,而不是CSRF。因为我没有做任何相关的事情,而且Chrome已经为第一方cookie设置了默认值SameSite=Lax
,我的第三方服务集成之一是失败的原因,Chrome是限制访问跨站点的cookie时,SameSite=Lax
和如果第三方响应是来自POST
请求(O* 一旦该过程完成第三-通过POST
请求 * 将第三方服务重定向到我们的网站)。在那里Tomcat无法找到会话,所以它在URL的末尾追加了一个新的JSESSIONID
(带有一个新的会话,而前一个会话已被杀死)。所以Spring拒绝URL,因为它包含一个新的JSESSIONID
append引入的分号。
因此,我需要更改JSESSIONID
cookie属性(SameSite=None; Secure
),并尝试了几种方法,包括WebFilters。我在Stackoverflow中看到了相同的问题和答案,并尝试了其中的大部分,但最终一无所获。
有人能想出一个解决方案来改变Sping Boot 中的这些头吗?
4条答案
按热度按时间blpfk2vs1#
更新于2021年6月7日-添加了正确的
Path
属性和新的sameSite属性,以避免使用GenericFilterBean
方法复制会话cookie。我能想出我自己的解决办法。
我有两种在Sping Boot 上运行的应用程序,它们具有不同的Spring安全配置,它们需要不同的解决方案来解决这个问题。
情况1:无用户认证
方案一
在这里,您可能已经在应用程序中为第三方响应创建了一个端点。在控制器方法中访问httpSession之前,您是安全的。如果您正在访问不同控制器方法中的会话,请发送临时重定向请求到那里,如下所示。
不过,您需要在安全配置中允许3rd_party_response_url。
方案二
您可以尝试下面描述的相同
GenericFilterBean
方法。情况2:用户需要认证/登录
在一个Spring Web应用程序中,您已经通过HttpSecurity或WebSecurity配置了大部分安全规则,请检查此解决方案。
示例安全配置,我已经测试了解决方案:
我想在此配置中强调的要点是,您应该允许来自Spring Security和CSRF保护的第三方响应URL(如果启用)。
然后,我们需要通过扩展GenericFilterBean类(Filter类对我不起作用)并通过拦截每个
HttpServletRequest
并设置响应头将SameSite
属性设置为JSESSIONID
cookie来创建HttpServletRequest Filter。然后通过以下方式将此过滤器添加到Spring Security过滤器链
为了确定您需要将新过滤器放置在Spring的安全过滤器链中的位置,您可以轻松地调试Spring安全过滤器链并确定过滤器链中的正确位置。除了
BasicAuthenticationFilter
,SecurityContextPersistanceFilter之后将是另一个理想的地方。此
SameSite
cookie属性将不支持某些old browser versions,在这种情况下,请检查浏览器并避免在不兼容的客户端中设置SameSite
。在SessionCookieFilter中添加上述检查,如下所示,
此过滤器无法在本地主机环境中工作,因为它需要安全(HTTPS)连接来设置
Secure
cookie属性。有关详细说明,请阅读此blog post。
jgwigjjp2#
我之前也是这样。因为在
javax.servlet.http.Cookie
类中没有类似SameSite
的东西,所以不可能添加它。**第1部分:**所以我写了一个过滤器,它只拦截所需的第三方请求。
**第2部分:**Cookie作为
Set-Cookie
响应头发送。因此,这个CustomHttpServletResponseWrapper
覆盖了addCookie
方法,并检查它是否是所需的cookie(JSESSIONID
),而不是将其添加到cookie中,而是直接添加到具有SameSite=None
属性的响应头Set-Cookie
中。qyzbxkaa3#
正如本答复所述:Same-Site flag for session cookie in Spring Security
但这个看起来更简单
或者......更简单,Sping Boot 自2.6.0起支持在application.properties中设置它。
关于SameSite Cookies的Spring文档
jrcvhitl4#
对于未来的开发者来说,根据spring的版本,通过代码修改配置(如在其他回复中所见)可能只是修改嵌入式tomcat服务器。如果您的项目部署在现有的Tomcat服务器中,则可以通过context.xml将Samesite添加到JSessionid。但是,有几种方法可以设置上下文,因此请检查此参考以确定您的场景。https://octopus.com/blog/defining-tomcat-context-paths