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-07-26 19:31:03

    Guacamole搭建

    因项目需要,经历多天查阅各种文档,几经波折终于功德圆满,写下此篇文章供大家分享。Guacamole就个人理解而言是一个可以通过web浏览器访问远程服务器终端进行操作的可视化工具。主要由web(浏览器)、Guacamole Server(核心)、Remote Desktops(远程桌面)三大模块组成。

  • 2019-07-30 22:36:10

    使用 Spring Initializr 初始化 Spring Boot 项目

    万事开头难,你需要设置一个目录结构存放各种项目内容,创建构建文件,并在其中加入各 种依赖。Spring Boot CLI消除了不少设置工作,但如果你更倾向于传统Java项目结构,那你应该 看看Spring Initializr。

  • 2019-08-06 15:30:08

    小程序展示富文本

    然而rich-text有个问题,它不能够给内联img设置宽度100%,这样图片就容易溢出屏幕。我们只能在后台返回富文本的时候对图片的img标签进行格式化。或者前端进行格式化也行,我赞成使用后端,因为很多种情况我们不一定都能想得到。

  • 2019-08-07 09:07:32

    最全的Service Worker讲解

    Service Worker 最主要的特点是:在页面中注册并安装成功后,运行于浏览器后台,不受页面刷新的影响,可以监听和截拦作用域范围内所有页面的 HTTP 请求。 基于 Service Worker API 的特性,结合 Fetch API、Cache API、Push API、postMessage API 和 Notification API,可以在基于浏览器的 web 应用中实现如离线缓存、消息推送、静默更新等 native 应用常见的功能,以给 web 应用提供更好更丰富的使用体验。

  • 2019-08-07 09:09:19

    windows系统下定时关闭程序

    其中xxx.exe是你要关闭的进程中运行的exe,可以ctrl+alt+del打开任务管理器,进到详细信息查看 然后把.txt文件后缀改成.bat(此时要在查看一栏勾上文件拓展名,要不还是txt文档)

  • 2019-08-07 09:16:43

    一个比较完美的PWA例子

    但就目前来讲,PWA是Google主推的一项技术标准,FireFox,Chrome以及一些基于Blink的浏览器已经支持渐进式Web应用了,Edge上对渐进式Web应用的支持还在开发。Apple公司也表示会考虑在自己Safari支持PWA。然而这项功能已经进入了WebKit内核的五年计划中。长期来看,对浏览器兼容性的支持方面应该已经不算太大问题了。况且在现阶段,在不支持渐进式Web应用的浏览器中,你的应用也只是无法使用渐进式Web应用的离线功能而已,除此之外的功能均可以正常使用。