一个内部使用的网盘系统,同事反馈登录进系统后页面一直在反复刷新,url上的登录token也在疯狂变化。很明显是因为后台没有成功判断到用户已经登录,导致页面一直跳转到登录授权服务器获取token。
这个问题在我到浏览器上也复现了,而我用safari,火狐则没有这个问题。只有Chrome会出现反复刷新。将问题反馈给负责系统后台的同事,神奇的是,他的Chrome并不会反复刷新。
登录同事说登录的token是从登录接口的referer请求头获取的,从日志上看发现我们的请求中referer并没有带上token,只有一个域名。有可能是链接上带的查询参数被Chrome处理掉了。由此,怀疑是Chrome最近有更新才出现了问题。
我查看了我和反馈的同事的Chrome版本是最新的Chrome85,而后台同事的Chrome是77。搜了一下Chrome85的更新内容,发现Chrome真的对请求的referer做了干预。提升了referer的安全性。
referer请求头
开讲referer之前先了解一下 referer 是干什么的:
Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
———— Referer - MDN - Mozilla
除了请求页面,页面里如果有图片等静态资源和接口请求,这些请求的referer就会是当前页面。比如www.a.com请求了api.a.com/login这个接口,api.a.com/login请求头中的referer就是www.a.com。如果www.a.com后面带了查询字符串,如www.a.com?test=1ÿ