存储空间和 Cookie

扩展程序可以存储 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、任何扩展程序页面(包括弹出式内容和侧边栏)和屏幕外文档)之间共享。在内容脚本中,调用 Web 存储 API 会访问内容脚本注入到的宿主网页中的数据,而不是扩展程序中的数据。

服务工作线程中的访问权限

IndexedDB 和 Cache Storage API 可在服务工作线程中使用。不过,本地存储空间和会话存储空间中的数据不会被清除。

如果您需要从 Service Worker 访问 Local Storage 或 Session Storage,请使用屏幕外文档。

分区

分区是指为存储的数据引入密钥,以限制其可访问的位置。存储空间一直以来都是按来源键控的。

自 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=Strict Cookie。请注意,此项限制仅适用于网络请求,不适用于通过 JavaScript 中的 document.cookie 进行的访问,并且在第三方 Cookie 被屏蔽时不适用。

请注意,与第三方 Cookie 相关的设置会受到 Privacy Sandbox 工作的影响,并会根据其时间表进行调整。

browser.cookies API 可用于控制每个 API 方法使用的分区键。如需了解详情,请参阅 API 参考文档。