翻译自:https://blog.yoav.ws/posts/how_chromium_cookies_get_evicted/
我最近被问及是否了解 Chromium 浏览器如何清理或回收其 Cookie。当时我并不清楚,但决定深入研究代码以找出答案。以下是我在探索过程中发现的内容,希望对他人(或至少对未来的自己)有所帮助。
这篇文章中没有太多的叙述性内容,主要是代码指引和参考资料。
TL;DR – 如果您希望某些 Cookie 比其他 Cookie 保留得更久,请将它们设置为高优先级并使用安全(Secure
)标记。如果您想明确删除某些 Cookie,请设置一个已过期的 Cookie,其 “domain
” 和 “path
” 与要删除的 Cookie 匹配。
Cookie Monster 的限制
事实证明,Chromium 的网络堆栈中有一个被称为 “Cookie Monster
” 的组件。但即使是怪兽也有其限制。在这种情况下,Cookie Monster 能持有的 Cookie 数量是有限的。它对总的 Cookie 数量(最大 3300 个)以及每个域名的 Cookie 数量(最大 180 个)都有上限。一旦达到这些限制,为了腾出空间,系统会删除一定数量的 Cookie——总共删除 300 个,或每个域名删除 30 个。
鉴于 Cookie 现在是分区存储的,每个分区域名也有相应的限制,但目前这些限制与每个域名的限制相同(即 180 个 Cookie)。
另一个有趣的常量是:在过去 30 天内被访问过的 Cookie 不会被全局清理。也就是说,其他网站无法导致您最近使用的 Cookie 被删除,但如果总的 Cookie 数量超过限制,可能会导致您较旧的 Cookie 被删除。
清理机制
Chromium 的 Cookie Monster 使用了一种变体的最近最少使用(LRU)算法来进行清理。Cookie 会根据访问的时间进行排序,最久未被访问的会首先被删除。访问时间被定义为 Cookie 的创建时间,或最后一次被使用的时间(例如,在请求头中),可能有一分钟的误差。
当设置一个新的 Cookie 时,会触发垃圾回收过程,删除该域名下最久未被访问的 Cookie,以及全局最久未被访问的 Cookie。Cookie Monster 会确定其 “清理目标“——即为了腾出空间需要删除多少个 Cookie。首先,所有已过期的 Cookie 会被删除。然后,清理过程会分轮次进行,直到达到清理目标。
第一轮会针对非安全、低优先级的 Cookie,然后是安全的低优先级 Cookie。至少会保留 30 个此类 Cookie,优先保留安全的。接下来,非安全的中等优先级 Cookie 会被考虑,随后是非安全的高优先级 Cookie。最后,依次考虑安全的中等优先级和高优先级 Cookie。对于中等优先级的 Cookie,至少会保留 50 个(优先保留安全的),而高优先级的则至少保留 100 个。
如果您想明确删除某些较旧的 Cookie,以便为您关心的 Cookie 腾出空间,设置一个已过期的 Cookie 会删除之前的副本,并且不会重新添加它。要设置一个匹配的 Cookie,您需要确保其 “domain
” 和 “path
” 与您要删除的 Cookie 完全相同。
请注意:Cookie 的优先级是 Chromium 的一个专有功能。它确实很有用,因此未被标准化有些可惜。默认情况下,Cookie 的优先级为中等。
总结
再次希望上述内容对您有所帮助。如果您希望确保特定的 Cookie 比其他的存留时间更长,或者您想删除旧的 Cookie,现在您知道该怎么做了(至少在 Chromium 中是这样)。我尚未深入研究其他浏览器引擎如何处理 Cookie,但我猜测 Safari 可能在操作系统层面(且是闭源的)进行处理。
最后,我希望 Cookie 的优先级功能能够被标准化。这似乎是一个有用的功能,在深入研究代码之前,我并未意识到它的存在。
更新:Mike West 告诉我,曾有一个标准化 “priority” 的草案,但未被工作组采纳。此外,”secure
” Cookie 的优先级提升已包含在 RFC6265bis 中。
(本文最初发表于 2024 年 6 月 18 日,作者为 Yoav Weiss。)