Shared Storage 默认仅限当前 origin 使用,不支持跨 origin 直接读取或联合查询;各站点同名 key 数据相互隔离,跨站聚合必须通过后端统一收口上报实现。

Shared Storage 不是“创建出来就能跨站共享”的存储,它默认只对当前 origin 生效;所谓“跨站”是指多个站点在隐私沙箱约束下,通过受控方式协同写入、再由后端聚合——浏览器本身不提供跨 origin 的直接读取或联合查询能力。
sharedStorage.set() 和 get() 只作用于当前 origin
你调用 sharedStorage.set("user_id", "abc123") 时,数据只会存进 https://a.example.com 自己的 Shared Storage 空间;b.example.com 即使执行完全相同的语句,也只会写入它自己的空间,彼此不可见。
- 没有
sharedStorage.getAcrossOrigins()或类似方法,浏览器明确禁止跨 origin 直接访问 -
sharedStorage.get("user_id")永远返回当前页面所在 origin 存的值,哪怕其他站点用了同名 key - 如果误以为“设了同名 key 就算共享”,会导致调试时发现数据始终为空或旧值——其实是读错了 origin
entries() 返回的只是本 origin 的键值对迭代器
sharedStorage.entries() 是个异步迭代器,但它只遍历当前 origin 下通过 set() 写入的条目,不会合并、排序或过滤其他站点的数据。
- 返回的每个
[key, value]中,value是字符串类型,不是自动解析后的 JSON 或数字,需手动调用JSON.parse()或Number() - 若想统计“所有合作站点的点击总数”,不能靠
entries()拉取全部再累加——它根本拿不到别站的数据 - 常见错误:在广告域写入
sharedStorage.set("clicks", "42"),又在媒体域调sharedStorage.entries()试图汇总,结果只看到空迭代器或自己设的键
真正可行的跨站聚合路径是后端统一收口
Shared Storage 本身不承担聚合职责。合规且可审计的做法是:各参与方把指标写入自己的 Shared Storage,再通过受控信道上报给统一后端。
立即学习“前端免费学习笔记(深入)”;
- 广告域
advertiser.net调用sharedStorage.set("reach_count", "42") - 媒体域
publisher.org同样调用sharedStorage.set("reach_count", "89") - 双方都用
fetch("https://analytics.trusted/api/submit", { method: "POST", body: JSON.stringify({ origin: self.origin, value: "42" }) })上报,附带 origin 签名或 nonce 验证来源 - 后端校验合法性、去重、累加,生成聚合报表——这才是唯一可行路径
remainingBudget() 不是存储配额,而是防滥用计数器
sharedStorage.remainingBudget() 返回的是当前 origin 剩余的“操作点数”,不是内存或存储空间大小。
- 每次
set()、get()、delete()都消耗 1 点;entries()迭代一个条目也消耗 1 点 - 初始预算约 1000 点,用完后后续操作会静默失败(不抛错,但不生效)
- 容易忽略的点:在循环中反复调
sharedStorage.get()而没检查remainingBudget(),可能导致后半段请求全部失效却无提示
最常被绕过的复杂点是:Shared Storage 的“跨站”不是功能开关,而是一套协作契约——它强制你把聚合逻辑移出浏览器,在可信服务端执行;任何试图在前端绕过 origin 隔离的操作,都会在规范层面被拒绝。

















