贴一下原文给打不开 GitHub 的朋友 😂
最近在面试候选人的时候,我一定会问一个问题:a.com 里的 JavaScript 发起了一次获取数据的请求到 b.com 的接口,那么这次请求浏览器携带的是 a.com 的 Cookie 还是 b.com 的 Cookie?大部分人都回答了 a.com,但这是错误的——浏览器携带的永远是请求接收方的 Cookie,不然的话 b.com 岂不是获取了 a.com 所有的 Cookie 数据?
无独有偶,今天刚好关注到一个消息,苹果 WebKit 博客发表了一篇题为《Full Third-Party Cookie Blocking and More》的文章,正式宣布将在 iOS、iPad OS 13.4 和 macOS 上的 Safari 13.1 里默认完全屏蔽第三方 Cookie。
文章里提到了这样做有这些好处:
本文不打算评价这种做法的对错,只是想从技术的角度解释为什么禁用第三方 cookie 会有文章里提到的这些好处。
在这之前,我们先简单解释一下什么是第三方 Cookie。
HTTP 协议是无状态的,但如果要保存用户的登陆状态,网站肯定需要将用户的唯一标识存储在浏览器里,于是有了 Cookie。当用户访问一个网站,并输入用户密码登陆之后,网站会在浏览器里存储一个唯一标识,下次用户再打开这个网站时,这个唯一标识会被浏览器发送到网站的服务器,这样网站就知道,这个用户之前已经登陆过了,不需要再输入用户名和密码了。
但是,文章里说到的第三方 Cookie 是什么?
举个例子,我打开了网站 a.com,这个网站在我的浏览器里写入了一些 Cookie 用于记录我的登陆状态,但同时,a.com 的 HTML 里引用了第三方网站的资源,比如 b.com 下的一张图片、c.com 下的一个脚本文件,这些第三方服务器在返回资源的同时,也可以给浏览器设置它们域下的 Cookie,最终导致的结果就是,虽然我只访问了 a.com,但我的浏览器里现在有了 a.com、b.com 和 c.com 三个域的 Cookie。
在这三个域的 Cookie 中,a.com 属于第一方 Cookie,因为我访问的就是 a.com,但 b.com 和 c.com 的 Cookie 就属于第三方 Cookie 了。
了解了什么是第三方 Cookie 之后,我们再来逐条解释一下文章里说的好处分别说的什么意思。
现在大家可能都喜欢在淘宝和天猫上购物,不知道有没有注意到,我在天猫 https://tmall.com 登陆之后,再打开淘宝 https://taobao.com 的时候不需要重新登陆,淘宝已经知道我是谁了。
我们都知道,不同域名的网站相互之间是不能读取对方的 Cookies 的,那天猫和淘宝是怎么做到共享登陆状态的?其实就是利用了第三方 Cookie 的特点。
天猫的登陆界面 https://login.tmall.com 其实是用 iframe 引用了淘宝的登陆界面 https://login.taobao.com ,登陆成功之后,淘宝在浏览器里写入了 .taobao.com
域的 Cookie,所以用户打开淘宝的时候,浏览器里已经有了淘宝的登陆标识,淘宝当然就知道我们是谁了。
这就是“使用辅助第三方域标识用户的功能”了——等等,后面那句“即使用户删除第一方的网站数据,此类设置也可能保留 ID”是指什么?
假设现在我想清除我在天猫的所有数据,包括 Cookies。在 macOS 的 Safari 浏览器中,你可以打开偏好设置,切换到「隐私」这个标签页,点击「管理网站数据...」按钮,然后在弹出的窗口中搜索 tmall.com,选中之后,点击左下角的「移除」,这样天猫的所有数据都被清除了。
按照预期,我再打开天猫应该是未登陆的状态——但实际上并不是,我打开之后,天猫仍然知道我是谁,我的登陆状态仍然没有被清除。
原因就是,我清除了天猫的数据,但没有清除淘宝的数据,而我的登陆状态是保存在淘宝里的——但这显然不符合用户的预期。
在苹果默认禁用第三方 Cookie 之后,这样的登陆状态共享就做不到了,因为在天猫登陆的时候,浏览器会阻止淘宝把 Cookie 写入浏览器里。
站长们为了利用网站的流量变现,一般会选择给网站加点广告,自己找广告主很麻烦,所以站长一般会直接接入广告联盟,广告联盟会提供一个脚本文件给站长,只要引入了这个脚本,那么就能自动推荐合适的广告给用户。
这听起来简单方便,合情合理,但如果有很多网站都引用了广告联盟的脚本文件呢?
假设有一个广告联盟 ad.com,它提供了一个脚本文件 ad.com/get_ad.js,现在有两个网站 a.com、b.com 都引用了这个脚本,那么会发生什么?
用户第一次访问 a.com 的时候,ad.com 会通过 ad.com/get_ad.js 给用户设置一个 Cookie 到浏览器里,用于唯一标识这个用户;然后这个用户访问 b.com 的时候,浏览器加载 ad.com/get_ad.js 的脚本时会携带上刚才设置的 Cookie,这样广告联盟就能把这两次访问记录关联起来:我有一个用户 xxx,他先是访问了 a.com,然后访问了 b.com。
那如果有成千上万个网站都加入了 ad.com 这个广告联盟呢?恭喜,你在互联网的访问记录,ad.com 都知道的一清二楚了,而在技术如此发达的现在,将 Cookie 关联到你的个人信息一点也不难。
如果禁用了第三方 Cookie,广告联盟就再也不能拿到我们的访问记录了,但与此同时,广告联盟也不能根据用户的访问记录向我们推荐合适的广告了,这对站长和广告联盟行业都是一个沉重的打击。
第三方 Cookie 是一把双刃剑,它能为我们带来便利,但同时也会泄漏我们的隐私。Cookie 未来的走向如何,其实更多的是社会对于便利与隐私之间的取舍。
1
ylw 2020-03-26 19:27:55 +08:00
主要还是隐私 微信 用户状态 探针 用的就是这个
|
2
ylw 2020-03-26 19:28:56 +08:00
第三方统计 js 也是 屏蔽对象 , 之前不是有 邮件不要点击查看邮件自带图片 也是基于这方面考虑
|
3
FourAndHalf 2020-03-27 11:49:50 +08:00
老哥你不要吓我,我司的 app 很大程度上依赖 cookie
|
4
atao0825 2020-03-27 13:13:17 +08:00 1
写的挺好,赞👍
|
5
milklee OP @FourAndHalf 没有吓唬你,之后苹果会默认禁用第三方 Cookie,但是用户是可以关闭的。如果你在 macOS 上的 Safari 打开了禁用第三方 Cookie,再访问淘宝,淘宝就会提示你要关闭禁用第三方 Cookie 才能访问淘宝
|
6
butanediol2d 2020-03-27 15:55:47 +08:00 via iPhone
@milklee 现在的 safari 设定是默认屏蔽但可以手动解除,以后会改为强制屏蔽无法解除吗?
|
7
surfire91 2020-03-27 16:13:43 +08:00
太多没看,是不是指的就是 SameSite ?
|
8
milklee OP @butanediol2d 现在苹果还没有这个打算,但未来会怎样谁也不知道
|
9
myqoo 2020-03-31 14:12:02 +08:00
屏蔽第三方 Cookie 是未来的趋势,现在 Chrome 也逐步推进(使用 samesite 过渡)。
三方 Cookie 问题实在太多,除了 csrf 漏洞,特别是在不安全的网络里,用户访问任何一个 HTTP 页面就可以泄露一大批网站的 cookie 。 |
10
xiaole 2020-04-25 21:24:51 +08:00
今天再看,我觉得可以利用第三方 Cookies 做白名单认证,所有备案域名都必须加载一段三方 Cookies,没有这个的禁止访问...
|