所有浏览器都有自己的缓存机制,它们通过将资源缓存到本地,借此加速用户访问客户端的速度,减少服务器压力。
近期发布的 chrome 86 启用了新的浏览器缓存策略,我们一起来看看它是什么,为什么出现,以及带来的影响吧!
在介绍它之前,我们先来看看旧的缓存策略。
旧缓存策略-单键储存
chrome 86 版本以前,引用/储存缓存的键名是资源的 URL。如图:
![](https://pic4.zhimg.com/v2-f331cf30c0e812cdb22ee048e91c76f7_b.png)
也就是说,如果有其他任何网站引用到了同个 URL的资源,浏览器会先去缓存里面查询有无资源,有则加载本地资源,无则远程请求。
新缓存策略-缓存分区(Cache partitioning)
从 chrome 86 版本开始,启用了新的缓存策略-缓存分区。 从前端开发者的角度出发,我得知这个消息的第一反应是:啊!是 chrome 派来解决用户使用缓存里的旧版本,而前端资源已经更新导致的版本一致性问题吧?毕竟本人遇到的浏览器缓存导致唯一问题就是这个,殊不知不同的角度有不同的困惑,缓存分区,主要是解决谁的困惑呢?
为什么要做缓存分区
其实旧的缓存机制一直表现都挺好的,兢兢业业,奈何人算不如天算。广告商和分析公司借此可以在用户不知情的情况下跟踪用户行为,攻击者也可以拿到你的某些网站身份信息。 具体包括:
判断用户是否访问过特定网站 通过检索缓存是否具有特定于某站点的资源(脚本、图片、CSS等)来检测用户的浏览历史记录。例如:通过对缓存内容的查询了解你有哪些社交账号,利用你的帐户名称滥用你的个人信息。
跨站点搜索攻击:判断用户是否搜索过特定内容 存在一些概念的跨站点搜索攻击证据,这些概念利用了一些站点(gmail,google search,…)在搜索结果为空时加载特定图像的事实。通过打开选项卡并执行搜索,然后在缓存中检查该图像,攻击者可以检测搜索结果中是否存在任意字符串。 通过检索与搜索结果相关的图片缓存,判断用户是否搜索过特定内容。
例如:淘宝网在搜索结果为空时才会加载哭哭脸小二的图片,可以借此判断用户是否搜索过。 如果整块搜索结果是图片,图片中有搜索关键词的信息,那么甚至还可以获取用户的搜索关键字。
跨站跟踪:共享身份信息 使用 HTTP 缓存储存类似 Cookie 的身份信息,来进行跨站跟踪。 我们都知道,Cookie 是无法跨域访问的。 但实际上除了第一方 Cookie,还存在一种第三方 Cookie —— 广告商的 Cookie 这种 Cookie是由站点内的广告跟踪器记录的。广告跟踪器相当于嵌入原站点的另一个网站,于是你就有了两份 Cookie :
怎么做缓存分区
可恶,为什么我的隐私在裸奔,想安安静静偷偷摸摸的上网,有那么难吗? 新的策略横空出世(实际上从 chrome 77 版本就一直在测试这个功能)新的 chrome 针对这些问题,做了哪些改变呢? 此前资源的存储键只有一个项,现在则包含三个项,分别为域名 (domain)、当前帧 (domain) 和网址 (URL)。
![](https://pic1.zhimg.com/v2-c1c343d9204066d0d229ec9ee6b9e5e4_b.png)
例如: 用户返回了 a.example ,但是图片是属于 iframe c.example 。 遇到这种情况,资源会不会从缓存里面读取呢? 答案是不会!因为不匹配 Cache Key 为 a.example , c.example ,以及
的资源,所以无法使用 c.example 里面的缓存。
使用缓存分区之后的变化
总结
在网络隐私越来越重要的今天,chrome 为了保护用户选择牺牲一部分不易被察觉的体验,考虑到我们网络的速度以及电脑的配置也在一直升级,相信大多数用户会支持缓存分区。
参考资料