Chrome 80+版本,samesite cookie验证跨域问题

起因

网站登录时,本地前端代码请求线上后台不能正常登录,检查跨域不存在问题;
且网站线上登录正常,其他人本地登录也正常。

检查

  1. 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.
  2. 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,并重启浏览器: