最近,Safari 11在Mac OSX上发布。此更新导致我们的Web应用程序与我们的reuest标头上的XSRF结合使用时出现问题。 我将尝试以逻辑方式描述问题。 这就是好情况的样子:
当用户想要登录时,他会收到服务器的响应,其中包含一个包含XSRF令牌值的Set-Cookie。 Eg: Set-Cookie: XSRF-TOKEN=LKNBX4DZhL708KjXNkgXnlxTDCNuhsZG1kTc2SFy498; Path=/; Secure
页面刷新下一个要执行的调用在标题中包含正确的XSRF值。在服务器端,检查值等。来自前端的每个调用都将包含该XSRF令牌。
如果用户注销并想再次登录,他的XSRF cookie将被新值覆盖,并且能够使用该令牌登录。
我们的问题情况(在Mac OSX上使用Safari 11,其他浏览器不显示此行为):
如果没有Cookie存在,用户可以登录正常的
但是,如果他想重新登录(在上一个会话之后),则会进行刷新。在第一次调用时,刷新其调用的XSRF令牌不会被新值替换,它们仍然包含来自前一会话的旧XSRF令牌。当我们检查此请求时,我们发现此请求中的cookie包含正确的值,但标题反映了旧令牌。
此错误标头的调用导致会话在后端关闭,因此用户被踢出会话。 TLDR;在Safari 11中,标题XSRF-TOKEN在刷新后不会相应地更新cookie值。我们在旧版本和其他浏览器上工作,我们认为这是一个Safar 11错误。
还有其他人遇到过类似的问题吗?在Safari 11中刷新页面后,请求的标头值是否未更新?
编辑:经过测试,我们发现在URL中放置时间戳作为查询参数会强制Safari 11发送正确的请求。似乎有些请求被缓存,更新的标题会被忽略..
非常感谢!
答案 0 :(得分:2)
我无法评论您的令牌问题,但我也怀疑Safari 11存在缓存问题。最近,即使是指定
的JSON请求Cache-Control: no-cache, private
Safari从localhost重新加载页面后,开始缓存这些请求(显示为Cache (Disk)
)。 firefox和chrome都没做。对我来说看起来像个错误?