事件起因
环境
首先介绍下情况:公司的某个管理系统admin.xxx.com,登录接口走的api.xxx.com。
业务系统只支持http协议,所以对应的访问地址为http://admin.xxx.com,登录接口始终是https://api.xxx.com。
这样就是一个跨协议的情况了。
问题
某一天,登录系统后始终提示“你未登录,请先登录B站”,而且并不是所有人有该问题。经过一系列排查,发现唯一的区别只有Chrome浏览器版本不一致(使用部分其他浏览器也是没有问题的)。
结案
从v88升级到v89后,chrome浏览器内置的schemeful-same-site规则默认值改为启用,导致跨协议也被认定为跨站(cross-site),cookies无法传递。
临时解决方案:地址栏打开chrome://flags/#schemeful-same-site,将选项设置为Disabled。
在Chrome 80版本,SameSite的默认值被改为Lax。
Same-Site的概念
eTLD+1部分一致就可以称之为same-site。
scheme和eTLD+1部分一致则被称为schemeful same-site
下面是一些schemeful same-site的案例:
Origin A | Origin B | scheme same-site |
---|---|---|
https://example.com:443 | https://evil.com:443 | cross-site:域名不同 |
https://example.com:443 | https://login.example.com:443 | schemeful same-site:允许子域名不同 |
https://example.com:443 | http://example.com:443 | cross-site:协议不同 |
https://example.com:443 | https://example.com:80 | schemeful same-site:允许端口不同 |
https://example.com:443 | https://example.com:443 | schemeful same-site:完全匹配 |
https://example.com:443 | https://www.example.com | schemeful same-site:允许端口不同 |
本文主要来自:湖中剑