告别跨站点和域的资源缓存

2020-10-26 21:53:35

当我开始做web开发时,我们都从官方的全球jQuery CDN加载了jQuery。

这个想法很简单:如果每个人都加载相同的jQuery脚本文件(cdn.jquery.com/jquery.latest.js-或当时的任何URL),那么该脚本文件将由浏览器缓存,而其他请求相同脚本的站点将受益于已缓存资源的加速。用户可能已经在浏览器缓存中拥有像jQuery这样的受欢迎的库,因为之前访问过的站点需要它们。

这种缓存行为之所以可能,是因为当时浏览器的HTTP缓存使用资产URL(cdn.jquery.com/jquery.latest.js)作为单个缓存键。浏览器使用缓存键来确定是否以及如何缓存资源。如果这些键仅由资源URL组成,则允许跨站点和域重用资源。

所有这些都工作得很好,但就像网络技术中的许多伟大发明一样,跨站点资源缓存实现了跨不同站点跟踪用户的新方法。

例如,假设Facebook在他们的登录区加载了一个唯一的文件(fb-logo-ajgdmaks839-as.svg-I完全创建了该文件路径);如果我知道这样一个文件的文件路径,在stefan Judis.com上请求它,并看到来自浏览器缓存的快速响应,我几乎可以确定用户最近登录过Facebook。

WebKit(Safari)早在2013年就改变了缓存策略,以阻止通过浏览器缓存进行用户跟踪。其缓存键是请求的资源URL和请求资源的顶级域的组合。

好的一面是,这种键结构阻止了前面提到的跟踪可能性;不幸的是,它还会导致浏览器缓存中的重复资源。

从v86开始,Chrome也将使用组合缓存键。这一变化意味着,是时候告别网络上的第三方资源共享了。由于Chrome的市场份额约为70%,从现在开始,访问我们网站的大多数浏览器都将使用分区的浏览器缓存。Chrome将顶级站点URL、当前框架站点URL和资源URL组合在一起。这种方法比Safari做的更精细,但结果是相同的。

如果您的站点请求全局jQuery、来自unpkg.com的模块、来自Google Fonts或GA';s(Google Analytics)analytics.js的字体文件,用户将重新下载这些资源,无论他们是否已经下载并缓存到其他站点。

这一变化对您意味着什么?如果您的站点依赖于提供CDN并支持HTTP/2的现代主机,那么您可以放弃第三方,而应该自己交付所有资源。在2020年,依赖第三方几乎没有什么价值。

如果您有兴趣了解有关此主题的更多信息,也可以阅读Terence Eden的帖子:请停止使用外部Javascript库的CDN。

我对这些变化的感觉很复杂。浏览器考虑隐私是件好事,但现在看来,任何东西都可能被滥用于追踪目的。我想知道这件事我们要去哪里……。😢