扩展程序可以存储 Cookie 并访问 Web 存储 API,就像普通网站一样。不过,在某些情况下,这些 API 在扩展程序中的行为会有所不同。
如需了解扩展程序 API,请参阅 browser.storage。
存储
在扩展程序中使用 Web 平台存储 API 通常是理想的做法。本部分将探讨这些 API 在扩展程序上下文中的行为,这有时可能与它们在网络上的行为有所不同。
持久性
当用户清除浏览数据时,系统不会清除扩展程序存储空间。这适用于使用 Web 存储 API(例如 Local Storage 和 IndexedDB)存储的任何数据。
默认情况下,扩展程序会受到存储空间方面的常规配额限制,您可以通过调用 navigator.storage.estimate() 来查看这些限制。在内存压力过大的情况下,存储空间也可能会被逐出,但这种情况很少见。为避免发生这种情况,请执行以下操作:
- 请求
"unlimitedStorage"权限,该权限会影响扩展程序和 Web 存储 API,并使扩展程序免受配额限制和逐出。 - 拨打
navigator.storage.persist()寻求保护,以免被驱逐。
扩展程序存储空间在扩展程序的源(包括扩展程序 Service Worker、任何扩展程序网页(包括弹出式内容(窗口/广告/etc.)和侧边栏)以及离屏文档)之间共享。在内容脚本中,调用 Web 存储 API 会访问内容脚本注入到的宿主网页中的数据,而不是扩展程序中的数据。
服务工作线程中的访问权限
IndexedDB 和 Cache Storage API 可在服务工作线程中使用。不过,本地存储空间和会话存储空间不是。
如果您需要从 Service Worker 访问本地存储空间或会话存储空间,请使用屏幕外文档。
分区
分区是指为存储的数据引入密钥,以限制其可访问的位置。存储空间一直以来都是按来源键控的。
自 Chrome 115 起,存储分区引入了分区键定义方式方面的变化,以防止某些类型的跨网站跟踪。实际上,这意味着如果网站 A 嵌入了包含网站 B 的 iframe,网站 B 将无法访问直接导航到该网站时通常会拥有的存储空间。
为了减轻此变更对扩展程序的影响,我们提供了两项豁免:
- 如果具有
chrome-extension://方案的网页嵌入到任何网站中,则存储分区将不适用,并且扩展程序将有权访问其顶级分区。 - 如果具有
chrome-extension://方案的网页包含 iframe,并且扩展程序对所嵌入的网站具有主机权限,则该网站也将有权访问其顶级分区。
Cookie
Cookie 提供了一种存储与特定网域和路径相关联的键值对的方法。它们在扩展程序中的价值有限,但如果您有特定的使用情形,或者捆绑了在实现中使用它们的第三方脚本,那么了解它们的行为可能会很有用。
安全 Cookie
Secure Cookie 属性仅支持 https:// 方案。因此,chrome-extension:// 网页无法通过此属性设置 Cookie。
这也意味着,扩展程序网页无法使用需要 Secure 属性的其他 Cookie 属性:
分区和 SameSite 行为
在 chrome-extension:// 页面上设置的 Cookie 始终使用 SameSite=Lax。
因此,扩展程序在其自己的来源上设置的 Cookie 永远无法在框架中访问,并且分区不相关。
对于与第三方网站相关联的 Cookie,例如在扩展程序页面上的框架中加载的第三方网站的 Cookie,或者从扩展程序页面向第三方来源发出的请求的 Cookie,其行为与 Web 上的 Cookie 相同,但有两点不同:
- 如果给定标签页的顶级网页是
chrome-extension://网页,即使在子框架中,系统也绝不会屏蔽第三方 Cookie。 - 如果扩展程序具有对第三方的宿主权限,则扩展程序向第三方发出的请求会被视为同网站请求。这意味着可以发送
SameSite=StrictCookie。请注意,此规则仅适用于网络请求,不适用于通过 JavaScript 中的document.cookie进行的访问,并且在第三方 Cookie 被屏蔽时不适用。
请注意,与第三方 Cookie 相关的设置会受到 Privacy Sandbox 工作的影响,并会根据其时间表进行调整。
browser.cookies API 可用于控制要与每个 API 方法搭配使用的分区键。如需了解详情,请参阅 API 参考文档。