sessionstorage按浏览上下文隔离:同窗口内同源iframe共享,不同窗口(含新标签页、window.open弹窗)即使同域也不共享;新开窗口会快照复制原sessionstorage但后续独立。

sessionStorage 在同域下不是“全局共享”,而是按浏览上下文(browsing context)隔离的。关键在于:它在同一个窗口内的多个 iframe 之间共享,但不同窗口(包括新开标签页、window.open 弹窗)之间互不共享——即使完全同源。
同一窗口内,同域 iframe 共享 sessionStorage
只要主页面和 iframe 的 origin 完全相同(协议、域名、端口一致),它们就运行在同一个浏览上下文实例中,共用一份 sessionStorage。
- 主页面写入
sessionStorage.setItem('token', 'abc'),iframe 内可直接读取该值; - iframe 修改或删除某 key,主页面再次读取时会反映变更;
- 这种共享是实时、双向、无延迟的,本质是同一存储对象引用。
不同窗口间不共享,但新开窗口可能“复制”初始值
通过 window.open() 打开的新窗口(同域),浏览器会把原窗口当时的 sessionStorage 内容“快照式复制”过去,但之后两者完全独立。
- 新窗口无法感知原窗口后续的修改;
- 原窗口也收不到新窗口的变更;
- 关闭任一窗口,只清除对应窗口的 sessionStorage,不影响另一个。
iframe 调用 window.open 的特殊行为
iframe 内执行 window.open() 时,是否携带 sessionStorage 取决于目标 URL 的 origin:
- 打开同源地址(如 iframe src 是
https://a.com/app,openhttps://a.com/panel)→ 复制父级(即 iframe 所属上下文)的 sessionStorage; - 打开主页面同源地址(如主页面是
https://a.com/home)→ 实际复制的是顶层窗口的 sessionStorage; - 打开跨域地址 → 不复制任何 sessionStorage。
注意:重定向会改变 origin 判定依据
iframe 的 src 若被 302 重定向到不同 origin,其 sessionStorage 隔离边界以重定向后的 document.origin 为准,而非原始 src。
比如 iframe 初始 src 是 https://a.com/load,但 302 到 https://b.com/content,那么它的 sessionStorage 就归属 https://b.com,与主页面不再共享。











