Safeguard
Security Guides•

What do COOP and COEP do, and when do you need them?

COOP and COEP together make a page cross-origin isolated. Learn what each header controls, which browser features need them, and how to roll them out.

Safeguard Security Team
4 min read

COOP (Cross-Origin-Opener-Policy) controls whether your page shares a browsing context group with windows it opens or that open it. COEP (Cross-Origin-Embedder-Policy) controls which cross-origin resources your page may load. Set together, they make a page cross-origin isolated, which unlocks features such as SharedArrayBuffer.

Definitions in plain words

A browsing context group is the set of windows and tabs that can hold references to each other, for example through the value returned by window.open(). By default, a page you open can keep a reference back to you, and you can keep one to it.

COOP lets a page say "do not put me in a group with documents I do not trust." When a page lands in a new group, references between it and its opener are severed, and the browser may give it its own process. MDN notes this also blocks a class of cross-origin attacks known as XS-Leaks, because an attacker can no longer open your page and inspect the returned window.

COEP works on the other side of the page. It decides what the page may embed. Under the default value, unsafe-none, the page can load cross-origin images, scripts and similar resources without anyone's explicit permission. Under require-corp, it can only load resources that are same-origin, that opt in with a Cross-Origin-Resource-Policy header, or that are fetched in CORS mode and allowed by CORS.

Which feature needs them

MDN states that some features, including access to SharedArrayBuffer and unthrottled timers through Performance.now(), are only available when the document is cross-origin isolated. To get there you need all of the following:

  • COOP set to same-origin.
  • COEP set to require-corp or credentialless.
  • The feature not blocked by a Permissions-Policy for cross-origin-isolated.
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

You can confirm the result in the browser. The crossOriginIsolated property is true on a document that qualifies, and your code can check it before creating a SharedArrayBuffer.

Do you need them if you use none of those features?

Not necessarily. COOP has a security benefit by itself, since severing the opener link reduces what other windows can learn about your page. COEP, however, mostly matters as the price of isolation. If you do not need SharedArrayBuffer or precise timers, COEP can break embeds for little gain.

GoalCOOPCOEP
Use SharedArrayBuffersame-originrequire-corp or credentialless
Cut the opener link onlysame-origin or same-origin-allow-popupsnot needed
Leave behaviour unchangedunsafe-none (default)unsafe-none (default)

A rollout path that avoids surprises

  1. List every cross-origin resource the page loads: images, scripts, fonts, iframes, analytics tags.
  2. For each one, decide whether the owner can add a CORP header, whether you can load it with the crossorigin attribute, or whether it should go.
  3. Add a report-to parameter to COEP, with a matching Reporting-Endpoints header, so the browser tells you what was blocked.
  4. Turn on the headers on a staging host first and watch the reports.
  5. Check crossOriginIsolated in the console before shipping the feature that depends on it.

Pages that open a payment or sign-in popup need extra care with COOP. The next post in this series covers the same-origin-allow-popups value that exists for that case: COOP same-origin-allow-popups and OAuth popups.

Quick check

Does COEP replace CORS?

No. MDN says COEP governs resources requested in no-cors mode. Requests made in cors mode are still controlled by CORS, and COEP does not override a CORP or CORS policy the resource already has.

Will COOP same-origin break my site?

It can break flows that rely on a reference to a window you opened or one that opened you, such as some popup logins. Test those flows before enforcing it.

How do I know isolation worked?

Read crossOriginIsolated in the page console. If it is false, check both headers, and any Permissions-Policy that blocks the feature.

Safeguard builds SBOMs and scans dependencies, which helps you see which third-party packages and scripts your front end actually pulls in before you decide what COEP will block. You can try a free scan at gold.safeguard.sh/scan.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.