起因
网站登录时,本地前端代码请求线上后台不能正常登录,检查跨域不存在问题;
且网站线上登录正常,其他人本地登录也正常。
检查
console中发现:
1
A cookie associated with a cross-site resource at http://192.168.5.23/ was set without the `SameSite` attribute. A future release of Chrome will only deliver cookies with cross-site requests if they are set with `SameSite=None` and `Secure`. You can review cookies in developer tools under Application>Storage>Cookies and see more details at https://www.chromestatus.com/feature/5088147346030592 and https://www.chromestatus.com/feature/5633521622188032.
network请求中,Set-Cookie中发现黄色感叹号,提示:
1
this set-cookie didn't specify a "SameSite" attribute ......
原因
Chrome 80 版本升级后,提升了Cookie SameSite
的默认安全等级,强推SameSite Cookie
chrome版本 | 默认值 | cookie |
---|---|---|
<80 | SameSite=None | 请求带Cookie |
>=80 | SameSite=Lax | 请求限制带Cookie |
什么是SameSite
SameSite 是 Chrome 51 版本为浏览器的 Cookie 新增的了一个属性, SameSite 阻止浏览器将此 Cookie 与跨站点请求一起发送。其主要目标是降低跨源信息泄漏的风险。同时也在一定程度上阻止了 CSRF(Cross-site request forgery 跨站请求伪造)。
Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险。
它可以设置三个值:
- Strict
- Lax
- None
Strict
Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。
1 | Set-Cookie: username=xxxxx; SameSite=Strict; |
Lax
Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。
1 | Set-Cookie: username=xxxxx; SameSite=Lax; |
设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性。
None
网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
下面的设置无效:
1 | Set-Cookie: widget_session=xxxxx; SameSite=None |
下面的设置有效:
1 | Set-Cookie: widget_session=xxxxx; SameSite=None; Secure |
本地调试解决办法
将如下两项设置为Disabled,并重启浏览器: