最近,浏览器通过将samesite cookie默认值增强为Lax来提高安全性以防止CSRF攻击,即,如果在通过响应set-cookie报头设置cookie时服务器未设置samesite属性,则浏览器会将其视为Lax,并且不会存储,因此在后续调用中,cookie不会发送回服务器,从而导致这些请求失败。这发生在跨域通信中,其中跨域应用程序在主网站上的iFrame中运行。
我们有一个这样的服务器应用程序,它在成功的身份验证请求的响应上设置两个cookie,并且这些cookie应该在每次后续调用时发送回服务器,以使服务器相信请求已通过身份验证,以便进一步处理。这些cookie没有显式地设置任何相同的属性,因此新的浏览器(Chrome80)不会在后续调用中将它们发回。
服务器应用程序托管在tomcat上。因此,为了缓解这个问题,我们使用tomcat的cookieprocessor将cookie的samesite属性设置为"none",以便可以进行跨域调用。不幸的是,这并不起作用。尽管通过cookieprocessor显式地设置了相同站点属性,但通过开发人员工具检查时,响应不会显示任何相同站点属性的痕迹。
因此,这里的问题是: tomcat应该修改服务器的响应,以向通过响应中的set-cookie头设置的cookie添加samesite属性,这是正确的吗?我尝试通过设置远程调试来调试cookieprocessor代码,但看起来响应没有被截获,因此cookie标头被修改。我在这里做错了什么?
注意:我已经在应用程序的meta-inf/context.xml中配置了configured处理器。
发布于 2020-02-21 03:23:53
实际上我自己解开了这个谜团。Cookieprocessor仅在通过response.addCookie()方法添加cookies时才起作用。因此,如果cookie是通过set/add头方法设置的,那么cookieporcessor将不会做任何事情。实际上,我们的服务器应用程序使用头方法来添加cookie,而不是addCookie()方法。
发布于 2020-02-19 08:38:04
您使用的是Tomcat,但是您使用的是哪个版本的Tomcat呢?
CookieProcessor SameSite支持的初始版本使用“无”来表示取消设置SameSite值的行为。
https://bz.apache.org/bugzilla/show_bug.cgi?id=63865
Fixed in:
- master for 9.0.28 onwards
- 8.5.x for 8.5.48 onwards
我不确定Tomcat的CookieProcessor是否考虑了客户端的用户代理。
如果以这种方式实现,您的应用程序可能不支持已知的不兼容客户端:Chrome51-66、MacOSX Mojave (10.14) Safari/Embedded、iOS 12、UCBrowser 12.13.2之前的版本
https://www.chromium.org/updates/same-site/incompatible-clients
我们通过使用addHeader来支持SameSite来解决我们的普通cookie。
我们在nginx层中解决了会话cookie。
对于JSESSIONID,似乎还可以使用过滤器来包装HttpServletRequest,以便在创建新会话时使用适当的属性附加会话cookie的副本。虽然它为覆盖的JSESSIONID添加了大约80B。
https://stackoverflow.com/questions/60214654
复制相似问题