A cookie associated with a cross-site resource at <URL> was set without the `SameSite`

2019-12-30 17:07:53

参考地址 非 SSL 、没域名、跨站点、IE 浏览器如何做 Cookie 共享。

原本客户提出了一个需求,要在 ie11 浏览器上做跨站点的 token 共享。比如客户自己有四个网站,想要在其中一个网站上登录,其他三个网站也能登录。

当时我参照淘宝天猫的模式写了一个 Demo,就是在页面里面加载同一个 iframe,然后通过 window.contentWindow.postMessage 给 iframe 发数据写到 cookie 里,然后打开其他三个网站后,新的网站也加载同一个 iframe,让 iframe 通过 window.parent.postMessage 把 cookie 返回来。

Demo 放在外网环境,两个页面和 iframe src 都是通过 https 域名访问的,chrome 和 ie11 都没问题。

当时我展示了这个 Demo,跟客户说是可行的。但是现在去到客户的现场,发现客户这个四个网站是放在内网里的,没有域名,通过 IP 加端口的链接去访问,没有配 ssl,直接就是 http://ip:port 这样的链接去访问。

Demo 立马就跑不通了,ie11 没有任何反应,chrome 也报警告:“A cookie associated with a cross-site resource at http://dev-testboss.justgoai.... 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/... and https://www.chromestatus.com/...”,因为没有配 http,想强行设置 SameSite=None 和 Secure 也没有效果。


我有个简单粗暴的方法你可以考虑试一下,就是安全性差一些,不过都内网了其实也无所谓了吧……

就是你 A、B、C、D 四个站点都单独提供一个页面,这个页面不干别的,专门从 URL 查询字符串里接收参数、然后存到 Cookie 里(不过考虑到你这个情况直接写入 Cookie 的话还需要后端配合做 P3P,如果没有的话可以考虑先写入到 LocalStorage 里,等到真正访问对应站点的时候再取出来写入 Cookie)。

具体流程举个例子(简化流程就当只有两个站点了):

  1. 站点 A 登录,登录成功后内嵌 iframe,指向站点 B 的 set-cookie.html?key1=val1&key2=val2&key3=val3(后面拼的参数就是 Cookie)。

  2. 站点 B 的 set-cookie.html 页面里就一段 JS 代码,从 URL 查询字符串里取参数,先存到站点 B 自己的 LocalStorage 里。

  3. 等到真正访问站点 B 的时(非 iframe),先判断自己的 LocalStorage 里有没有要处理的数据。如果有,取出并写入 Cookie 后、再删掉 LocalStorage 里的数据(防止多次重复处理)。此时 Cookie 已经在站点 A、B 中都存在了。

  4. 如果有 P3P,步骤 2 里站点 B 直接就可以写入 Cookie 了。

这个方案最大的缺点就是 Cookie 不能实时共享……


  1. 自行百度 P3P 跨域

  2. 所以引入了 LocalStorage。


  • 2019-12-19 16:44:01

    根据条件配置多个npm仓库

    scope 是一种很好的包管理方式。统一的“命名空间”,清晰、好辨识;在 registry 中使用统一的 organization 管理,不必担心命名冲突和冒用等。 在实际使用中,一个常见的场景是公司的私有仓库。使用统一的 scope 定义在私有仓库中定义私有包,绝对是一个非常好的方式。 指定 scope 从指定仓库安装

  • 2019-12-20 13:24:58

    瓦片地图生成使用以及原理

    我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需要一个转换过程,这个过程就叫做投影(Projection)。在地球上我们通过经纬度来描述某个位置,而经过投影之后的地图也有自己的坐标系统,本篇文章就来详细介绍在百度地图API中涉及的各种坐标体系。

  • 2019-12-20 13:27:16

    腾讯地图谷歌和高德地图等自定义地图区别

    腾讯、百度、Google的地图投影均采用Web Mercator 投影坐标系;腾讯与Google的地图瓦片分辨率及切片范围是完全相同的,仅仅是命名规则稍有不同,这就使得同一位置和缩放级别的地图瓦片是完全可以重叠的;而百度地图每个缩放级别分辨率与前两者均不相同,而且地图瓦片的坐标原点做了一定的偏移,导致百度地图与前两者的瓦片是无法重叠的,这是因为百度在GCJ-02的基础上又进行了加密处理,形成了百度独有的BD-09坐标系。

  • 2019-12-22 08:06:48

    如何快速撤销上一次的commit

    在平时工作中使用git难免会提交一些错误的文件到git库里,这时候,撤销吧,怕把正确的文件删除了,不撤销重新改又很麻烦,下面,我就从提交的三个阶段,来讲解如何撤销错误的操作。

  • 2019-12-23 14:54:03

    RPC, REST ,GraphQL区别比较优劣

    其实在使用和学习的过程中,有很多文章都对比过它们的异同,但是大部分文章并没有从一个相对客观的角度来对比,更多是为了突显一个的优点而刻意指出另外一个的缺点。这让我想到一句话,脱离业务情景谈技术就是耍流氓。