COOP响应头必须由服务端通过HTTP响应头返回,<meta http-equiv>完全无效;其same-origin值仅切断跨源opener引用关系,且须与COEP:require-corp配合并确保所有跨源资源带crossorigin属性,self.crossOriginIsolated才为true。

COOP响应头必须由服务端返回,<meta http-equiv>完全无效
浏览器规范强制要求Cross-Origin-Opener-Policy只能通过 HTTP 响应头传递,<meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin">在 Chrome ≥88、Firefox ≥87、Edge ≥88 中一律被忽略。这不是兼容性问题,而是设计使然——该策略需在 HTML 解析前就生效,而 <meta> 解析发生在 DOM 构建阶段,太晚了。
常见失效场景包括:
- 本地开发时用
file://协议打开 HTML:无 HTTP 服务,自然无响应头机制 - Express 静态托管中漏掉
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin'),或写在中间件之后被覆盖 - Nginx 配置中用了
proxy_hide_header或未启用add_header
Cross-Origin-Opener-Policy: same-origin 实际切断什么
它不阻止弹窗打开,只切断 opener 引用关系。关键行为是:
- 你调用
window.open('https://evil.com'),返回值为null(不是window对象) - 对方页面的
window.opener恒为null,无法反向访问你的全局对象 - 同源弹窗(如
https://a.example.com→https://a.example.com/admin)仍可正常通信 - 协议、端口不同即视为跨源(
http://a.com和https://a.com不互通)
注意:same-origin-allow-popups 允许同源弹窗保留 window.opener,但跨源仍隔离——适合 SSO 或支付跳转场景,防护强度略低。
立即学习“前端免费学习笔记(深入)”;
为什么 self.crossOriginIsolated 总是 false
这是最常被忽略的复合条件问题。self.crossOriginIsolated 为 true 是跨源隔离真正启用的唯一权威信号,它为 false 的根本原因几乎总是:
- 只配置了
Cross-Origin-Opener-Policy,但没同时设置Cross-Origin-Embedder-Policy: require-corp - 页面中某张 CDN 图片、某个
<script src="">没加crossorigin属性(哪怕只漏一个) - 嵌入的
<iframe>页面自己没配 COOP+COEP,父页也会失败 - CDN、Cloudflare 或 Nginx 的
gzip_static等中间件悄悄 strip 掉了响应头
验证方式只有一条:在 DevTools Console 中执行 self.crossOriginIsolated,必须返回 true。仅看 Network 面板里两个 header 存在,不代表成功。
检查 COOP 是否真正生效的实操路径
不要依赖肉眼扫响应头,按顺序做这三件事:
- 打开 Chrome DevTools → Network → 找到主 HTML 请求(路径为
/或/index.html)→ Headers → Response Headers → 确认存在Cross-Origin-Opener-Policy: same-origin和Cross-Origin-Embedder-Policy: require-corp - 在控制台运行
self.crossOriginIsolated,必须为true - 手动测试 opener 行为:新开一个跨源页面,执行
console.log(window.opener),应输出null
复杂点在于:COOP/COEP 必须作用于主 HTML 文档本身,且所有嵌套 iframe、第三方脚本、CDN 资源都需协同适配。任何一个环节断链,隔离就失效。



















