所有浏览器都有自己的缓存机制,它们通过将资源缓存到本地,借此加速用户访问客户端的速度,减少服务器压力。

近期发布的 chrome 86 启用了新的浏览器缓存策略,我们一起来看看它是什么,为什么出现,以及带来的影响吧!

在介绍它之前,我们先来看看旧的缓存策略。

旧缓存策略-单键储存

chrome 86 版本以前,引用/储存缓存的键名是资源的 URL。如图:

也就是说,如果有其他任何网站引用到了同个 URL的资源,浏览器会先去缓存里面查询有无资源,有则加载本地资源,无则远程请求。

新缓存策略-缓存分区(Cache partitioning)

从 chrome 86 版本开始,启用了新的缓存策略-缓存分区

从前端开发者的角度出发,我得知这个消息的第一反应是:啊!是 chrome 派来解决用户使用缓存里的旧版本,而前端资源已经更新导致的版本一致性问题吧?毕竟本人遇到的浏览器缓存导致唯一问题就是这个,殊不知不同的角度有不同的困惑,缓存分区,主要是解决谁的困惑呢?

为什么要做缓存分区

其实旧的缓存机制一直表现都挺好的,兢兢业业,奈何人算不如天算。广告商和分析公司借此可以在用户不知情的情况下跟踪用户行为,攻击者也可以拿到你的某些网站身份信息。
具体包括:

判断用户是否访问过特定网站

通过检索缓存是否具有特定于某站点的资源(脚本、图片、CSS等)来检测用户的浏览历史记录。例如:通过对缓存内容的查询了解你有哪些社交账号,利用你的帐户名称滥用你的个人信息。

跨站点搜索攻击:判断用户是否搜索过特定内容

存在一些概念的跨站点搜索攻击证据,这些概念利用了一些站点(gmail,google search,…)在搜索结果为空时加载特定图像的事实。通过打开选项卡并执行搜索,然后在缓存中检查该图像,攻击者可以检测搜索结果中是否存在任意字符串。
通过检索与搜索结果相关的图片缓存,判断用户是否搜索过特定内容。例如:

淘宝网在搜索结果为空时才会加载哭哭脸小二的图片,可以借此用户是否搜索。

购物网站

淘宝网
淘宝网

如果整块搜索结果是图片,图片中有搜索关键词的信息,那么甚至还可以获取用户的搜索关键字。

跨站跟踪:共享身份信息

使用 HTTP 缓存储存类似 Cookie 的身份信息,来进行跨站跟踪。

我们都知道,Cookie 是无法跨域访问的。
但实际上除了第一方 Cookie,还存在一种第三方 Cookie —— 广告商的 Cookie

这种 Cookie是由站点内的广告跟踪器记录的。广告跟踪器相当于嵌入原站点的另一个网站,于是你就有了两份 Cookie :

  • 原站点的 Cookie,用于记住你的登陆。
  • 广告商的 Cookie,用于记住你的身份。

通过第三方 Cookie,两家网站就可以共享同一个Cookie,共享用户的身份识别信息。

当然第三方 cookie 也有好处,例如你在淘宝登录了,去天猫就不需要再登录一次了。

怎么做缓存分区

可恶,为什么我的隐私在裸奔,想安安静静偷偷摸摸的上网,有那么难吗?

新的策略横空出世(实际上从 chrome 77 版本就一直在测试这个功能)新的 chrome 针对这些问题,做了哪些改变呢?

此前资源的存储键只有一个项,现在则包含三个项,分别为域名 (domain)、当前帧 (domain) 和网址 (URL)。

新旧策略对比图

例如:
用户返回了 https://a.example ,但是图片是属于 iframe https://c.example
遇到这种情况,资源会不会从缓存里面读取呢?

答案是不会!因为不匹配 Cache Key 为 https://a.examplehttps://c.example ,以及https://x.example/doge.png 的资源,所以无法使用 https://c.example 里面的缓存。

使用缓存分区之后的变化

总结

在网络隐私越来越重要的今天,chrome 为了保护用户选择牺牲一部分不易被察觉的体验,考虑到我们网络的速度以及电脑的配置也在一直升级,相信大多数用户会支持缓存分区。

参考资料