最近 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,其他浏览器不显示此行为):
如果不存在cookies,用户可以正常登录
但是,如果他想重新登录(在前一个会话之后),就会发生刷新。在第一次调用时,在他的调用中刷新 XSRF 令牌不会被新值替换,它们仍然包含上一个会话中的旧 XSRF 令牌。当我们检查这个请求时,我们看到这个请求上的 cookie 包含正确的值,但标头反映的是旧令牌。
这个带有错误标头的调用会导致后端的会话关闭,因此用户被踢出会话。TLDR;在 Safari 11 中,标头 XSRF-TOKEN 在刷新后不会相应地更新为 cookie 值。我们在旧版本和其他浏览器上进行了这项工作,我们认为这是 Safar 11 的错误。
有没有其他人遇到过类似的问题?在 Safari 11 中刷新页面后,请求的标头值在哪里不更新?
编辑:经过测试,我们发现在 URL 中放置时间戳作为查询参数会强制 Safari 11 发送正确的请求。似乎一些请求被缓存并且更新的标头被忽略了..
非常感谢!