存储空间和 Cookie

扩展程序可以像常规网站一样存储 Cookie 和访问网络存储 API。但在某些情况下,它们在扩展程序中的行为有所不同。

如需了解该扩展程序 API,请参阅 chrome.storage

存储

通常情况下,开发者建议您在扩展程序中使用网络平台存储 API。本部分探讨这些 API 在扩展程序上下文中的行为,这些行为有时可能会因其在网页上的行为方式而异。

持久性

当用户清除浏览数据时,扩展程序存储空间不会被清除。 这适用于使用 Web 存储 API(例如本地存储空间IndexedDB)存储的所有数据。

默认情况下,扩展程序受常规的存储空间配额限制,您可以调用 navigator.storage.estimate() 进行检查。在内存紧张时,也可能会逐出存储,不过这种情况很少见。为避免发生这种情况,请执行以下操作:

  • 请求 "unlimitedStorage" 权限,该权限会影响扩展程序和 Web 存储 API,并让扩展程序不受配额限制和逐出的约束。
  • 调用 navigator.storage.persist() 以防止被逐出。

扩展程序存储空间可供扩展程序的所有来源共享,包括扩展程序 Service Worker、所有扩展程序页面(包括弹出式窗口和侧边栏)和屏幕外文档。在内容脚本中,调用 Web Storage API 会访问注入了内容脚本的主机页面(而不是扩展程序)中的数据。

Service Worker 中的访问权限

可以在 Service Worker 中访问 IndexedDBCache Storage API。但本地存储会话存储不适用。

如果您需要通过 Service Worker 访问本地存储空间或会话存储空间,请使用屏幕外文档

分区

分区是为存储的数据引入键的地方,以限制可以访问这些数据的位置。一直以来,存储都由源进行键控。

从 Chrome 115 开始,存储分区引入了对分区键的定义方式的更改,以防止某些类型的跨网站跟踪。也就是说,如果网站 A 嵌入了包含网站 B 的 iframe,网站 B 将无法访问直接导航到网站 B 时通常具有的存储空间。

为减轻这种扩展程序在延期中造成的影响,需遵循以下两种豁免规则:

  • 如果将采用 chrome-extension:// 架构的页面嵌入到任何网站中,则存储分区将不会被应用,并且该扩展程序将可以访问其顶级分区。
  • 如果采用 chrome-extension:// 架构的网页包含一个 iframe,并且该扩展程序对其嵌入的网站拥有主机权限,则该网站也将可以访问其顶级分区。

Cookie

Cookie 提供了一种存储与特定网域和路径相关联的键值对的方法。扩展程序在扩展程序方面的价值有限,但如果您有特定用例或捆绑了第三方脚本来使用扩展程序,了解它们的行为会很有帮助。

安全 Cookie

只有 https:// 方案支持 Secure Cookie 属性。因此,chrome-extension:// 网页无法使用此属性设置 Cookie。

这也意味着,扩展程序页面无法使用需要 Secure 属性的其他 Cookie 属性:

分区和 SameSite 行为

在 chrome-extension:// 页面上设置的 Cookie 始终使用 SameSite=Lax。 因此,扩展程序在其自身来源上设置的 Cookie 永远无法在框架中访问,并且分区也无关紧要。

对于与第三方网站关联的 Cookie(例如,对于在扩展程序页面上的框架中加载的第三方网站,或者从扩展程序页面向第三方来源发出的请求),Cookie 的行为与网站相同,但存在以下两个方面:

  • 如果给定标签页的顶级网页是 chrome-extension:// 网页,那么即使在子框架中,系统也绝不会屏蔽第三方 Cookie。
  • 如果扩展程序具有第三方的主机权限,则向第三方发送的请求将被视为同一网站。这意味着可以发送 SameSite=Strict 个 Cookie。请注意,这仅适用于网络请求,不适用于在 JavaScript 中通过 document.cookie 进行的访问,在第三方 Cookie 被屏蔽时不适用。

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

chrome.cookies API 可让您控制要与每种 API 方法搭配使用的分区键。如需了解详情,请参阅 API 参考文档