cookies在chrome80版本上跨站发送失败

原文

冴羽大佬的github:https://github.com/mqyqingfeng/Blog/issues/157

前言

chrome80版本发布时间大概是2020年2月7日,其中更新了默认屏蔽第三方的cookie。
这个事件当时造成了多困扰,很多iframe嵌套的内容,用户第三方授权,用户行为追踪等都受到了限制,淘宝还专门成立了问题小组来解决这个问题。

情形

天猫和飞猪的页面靠请求淘宝域名下的接口获取登录信息,由于 Cookie 丢失,用户无法登录,页面还会误判断成是由于用户开启了浏览器的“禁止第三方 Cookie”功能导致而给与错误的提示

淘宝部分页面内嵌支付宝确认付款和确认收货页面、天猫内嵌淘宝的登录页面等,由于 Cookie 失效,付款、登录等操作都会失败

阿里妈妈在各大网站比如今日头条,网易,微博等投放的广告,也是用 iframe 嵌入的,没有了 Cookie,就不能准确的进行推荐

一些埋点系统会把用户 id 信息埋到 Cookie 中,用于日志上报,这种系统一般走的都是单独的域名,与业务域名分开,所以也会受到影响。

一些用于防止恶意请求的系统,对判断为恶意请求的访问会弹出验证码让用户进行安全验证,通过安全验证后会在请求所在域种一个Cookie,请求中带上这个Cookie之后,短时间内不再弹安全验证码。在Chrome80以上如果因为Samesite的原因请求没办法带上这个Cookie,则会出现一直弹出验证码进行安全验证。

天猫商家后台请求了跨域的接口,因为没有 Cookie,接口不会返回数据

解决

通过SameSite属性,该属性拥有三个值:

  • Strict: 仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,即当前网页 URL 与请求目标 URL 完全一致。
  • Lax: 允许部分第三方请求携带 Cookie
  • None: 无论是否跨站都会发送 Cookie

我们需要设置SameSite为none,不过也会有两点要注意的地方:

  1. HTTP 接口不支持 SameSite=none
    如果你想加 SameSite=none 属性,那么该 Cookie 就必须同时加上 Secure 属性,表示只有在 HTTPS 协议下该 Cookie 才会被发送。

  2. 需要 UA 检测,部分浏览器不能加 SameSite=none
    IOS 12 的 Safari 以及老版本的一些 Chrome 会把 SameSite=none 识别成 SameSite=Strict,所以服务端必须在下发 Set-Cookie 响应头时进行 User-Agent 检测,对这些浏览器不下发 SameSite=none 属性

你可能感兴趣的:(cookies在chrome80版本上跨站发送失败)