sessionstorage 在 iframe 中按“同源 + 同标签页上下文”共享:同源 iframe 共享同一实例,跨源 iframe 完全隔离,沙盒 iframe 启用 allow-same-origin 时存在安全风险,刷新或导航不中断共享,关闭标签页才清除。

sessionStorage 在 iframe 中的存储范围,取决于同源性与上下文隔离两个核心规则:它既不是完全隔离,也不是无条件共享,而是严格按“同源 + 同标签页上下文”来划分作用域。
同源 iframe 可以共享 sessionStorage
如果 iframe 的 src 地址与父页面协议、域名、端口完全一致(即同源),那么 iframe 内部脚本可以直接读写父页面的 sessionStorage。例如:
- 父页地址:https://app.example.com/dashboard
- iframe src:https://app.example.com/widget
- 此时 iframe 中执行
sessionStorage.getItem('token')能正常获取父页存入的数据
这是因为浏览器将同源 iframe 视为同一页面会话的延伸,共用同一个 sessionStorage 实例。
跨源 iframe 完全无法访问
只要 iframe 与父页不同源(哪怕只是协议不同、子域不同、或端口不同),就会触发同源策略拦截:
- https://app.example.com 加载 http://app.example.com 的 iframe → 不同源,拒绝访问
- https://app.example.com 加载 https://api.example.com 的 iframe → 子域/主域不一致,拒绝访问
- https://app.example.com:8080 加载 https://app.example.com:3000 的 iframe → 端口不同,拒绝访问
此时 iframe 内调用 sessionStorage 相关 API 不会报错,但只能操作自己独立的一份存储空间,与父页互不可见。
沙盒 iframe 的特殊风险
当 iframe 使用 sandbox="allow-same-origin" 属性时,即使原本跨源,也会被浏览器临时赋予“同源身份”——这时它会获得与父页共享 sessionStorage 的能力,带来安全隐患:
- 恶意第三方组件若被嵌入并启用该 sandbox 权限,可直接读取父页存的 token、用户角色等敏感数据
- 它甚至能调用
sessionStorage.setItem()修改父页状态,造成权限提升或逻辑篡改 - 因此,除非绝对必要,不应为不可信 iframe 添加
allow-same-origin
刷新与导航不影响同源 iframe 的 sessionStorage 连续性
只要标签页未关闭,以下操作都不会清空 sessionStorage,且 iframe 与父页仍保持共享状态:
- 父页面刷新(F5 或 location.reload)
- iframe 自身 src 更换(如从 /form 切到 /preview)
- 浏览器崩溃后自动恢复标签页
- 用户切换到其他网站再切回
这种稳定性使其适合用于 iframe 内表单草稿保存、路由状态缓存等短周期场景,但需注意:所有数据在关闭整个标签页时一并清除。











