COOP单独配置无效,必须与COEP同时通过HTTP响应头设置且所有跨域资源声明crossorigin属性,self.crossOriginIsolated为true才表示隔离生效。

COOP 单独配置无效,必须和 COEP 同时生效,且只认 HTTP 响应头 —— meta、document.write、本地双击打开(file://)全都不行。
COOP 响应头必须由服务端返回,<meta http-equiv> 完全不生效
浏览器规范强制要求:只有通过 HTTP 响应头返回的 Cross-Origin-Opener-Policy 才被识别。哪怕你写成:
<meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin">
在 Chrome ≥88、Firefox ≥87、Edge ≥88 中都**完全忽略**,既不报错也不起效。这不是兼容性问题,是设计如此。
- 常见错误现象:
window.opener仍可被跨源弹窗读取,self.crossOriginIsolated为false - 真实生效路径:必须作用于主 HTML 文档的响应头(如
GET /或GET /index.html) - 若用 Nginx / Apache / Express 等服务端,需确认中间件(如
express.static())没覆盖或 strip 掉该 header
Cross-Origin-Opener-Policy: same-origin 是最常用隔离值,但不是万能解
这个值会让当前页面与所有跨源窗口彻底断开浏览上下文组,window.opener 恒为 null,有效防御 XS-Leaks 和 Spectre 类攻击。
立即学习“前端免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 它不阻止弹窗打开,只切断双向引用 ——
window.open('https://evil.com')仍能执行,但对方拿不到你的window - 同源弹窗(如
https://a.example.com→https://a.example.com/b.html)不受影响,window.opener正常可用 - 若需保留部分跨源弹窗通信能力(如单点登录跳转),可改用
same-origin-allow-popups,但会削弱 Spectre 防护强度 -
unsafe-none是默认值,等同于没配,无隔离效果
为什么 self.crossOriginIsolated 总是 false?大概率漏了 COEP 或资源未声明 crossorigin
self.crossOriginIsolated 为 true 是跨域隔离真正启用的唯一权威信号。它为 false 的根本原因几乎总是:
- 服务端只返回了
Cross-Origin-Opener-Policy,但没同时返回Cross-Origin-Embedder-Policy: require-corp - 页面中某张 CDN 图片、某个
<script src="...">没加crossorigin属性,哪怕只漏一个,整个隔离就失效 - 嵌入的
<iframe>页面自己没配 COOP+COEP,父页的crossOriginIsolated也会是false - CDN、Cloudflare 或反向代理悄悄 strip 了这两个 header(务必用 DevTools Network → Headers 真实验证)
检查是否生效不能只看 header,必须在控制台运行 self.crossOriginIsolated
很多人在 Network 面板里看到两个 header 存在就以为成功了,结果 SharedArrayBuffer 还是 undefined,performance.measureMemory() 报错。真正关键的一步是:
打开 DevTools Console,直接输入:
self.crossOriginIsolated
返回 true 才算真正就绪。返回 false 就说明某个环节断了链 —— 可能是服务端配置、资源加载方式、iframe 嵌套、甚至缓存干扰。
真正难的从来不是加两行 header,而是让整个资源链路(HTML、JS、CSS、图片、iframe、Worker)全部满足 CORP 要求。漏掉任意一环,crossOriginIsolated 就卡在 false。

















