Chrome 中 Set-Cookie SameSite 问题

关于 “Chrome 修改对未设置 SameSite 的 cookie,视作 SameSite:Lax 处理的变更” 的问题,目前看,最妥善的解决方案还是按照规矩办事儿,目前 Chrome 是行动最快的,而 FireFox 和 Edge 也在积极跟进,持支持态度。


影响范围:

如果你的项目中有如下跨域场景:

  1. 跨域的 ajax 请求;
  2. 跨域嵌入的 iframe;
  3. 跨域的图片资源请求;
  4. 跨域的 POST FORM 表单;

如果存在这类跨域场景,且在服务端接收请求的时候,需要使用流量中的 cookie,则需要注意:这个 cookie 在设置的时候,是否明确有: SameSite:None; Secure 这两个属性。如果没有的话,就会受到此策略影响。

例子:

a.com 的页面中,加载 b.com 的 iframe,且希望 iframe 请求的流量中,携带 b.com 的 cookie,用其中的 login_token 作为登录凭证。

1+------------------+ +-----------------+ 2| a.com | | b.com | 3| +------------+ | cookie: | | 4| | | | login_token | | 5| | <iframe> +----------x-----------> | 6| | | | | | 7| +------------+ | | | 8+------------------+ +-----------------+ 9 10 +----------------------------------------------------------+ 11 | Set-Cookie: login_token=x.xxxxxx; path=/; domain=b.com | 12 +----------------------------------------------------------+

如果此 token 的 cookie 在设置的时候,未指明 SameSite:None; Secure 这两个属性,如:

set-cookie: login_token=x.xxxxxx; path=/; domain=b.com 

则实际请求中,不会携带 login_token 这条 cookie,因此,iframe 实际处于未登录状态。

其他场景,如 Ajax,与此同理。


变更:

在旧策略中,当 set-cookie 时不显式声明 SameSite 时(或只声明 SameSite,未使用 Secure 时),浏览器会自动视为 SameSite:None,即不限制 cookie。此时上面场景中的 cookie 是可以正常发送的。

在新策略中,如上场景,会视为 SameSite:Lax,即只有在特定情况下,才会携带 cookie。上面场景中的 iframe 的请求中,不会携带 cookie。


解决

最正当的解决方法,就是在对需要跨域发送的 cookie 进行 set-cookie 的时候,显式声明 SameSite:None; Secure 属性,如:

set-cookie: ck01=vl01; Path=/; Secure; SameSite=None 

通过此种方法,允许 cookie 随跨域流量发送。

否则,只能通过调整域、以及携带参数的方式解决。

临时的解决方案,可以暂时让出现问题的浏览器,通过设置解决,方式如下:

  1. 在 chrome 地址栏输入 chrome://flags

1.png

  1. 在配置项中,搜索 samesite

2.png

  1. 将以下几项,设置为 disabled

3.png

  1. 重启浏览器

相关资料

本文转自 https://www.jianshu.com/p/76d026cc4dd7,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )