Which additional boundary do you need?
An origin comprises scheme, host and port. Different subdomains therefore have different origins. The same-origin policy already restricts certain forms of access between them. Additional mechanisms can separate window relationships or prevent certain external responses from entering a document context. Side-channel attacks such as Spectre are one motivation; the headers do not eliminate the underlying class of all side channels.
This does not create a blanket requirement to enable cross-origin isolation on an ordinary information page. For an application that needs shared memory, however, this browser state may be a specific prerequisite. Unsupported clients and working alternatives then belong in the product decision. HTML: cross-origin policies
The Web Security Check reads the headers of the final response after redirects. It can infer a configuration from suitable values. It does not run a browser or measure crossOriginIsolated, your popups' relationships or the compatibility of every resource loaded subsequently.
Three tasks, not interchangeable headers
On narrow screens, scroll the table sideways.
| Mechanism | Location and purpose | Typical limitation |
|---|---|---|
Cross-Origin-Opener-Policy (COOP) | Top-level document; affects assignment to browsing context groups and therefore window relationships. | Can change window.opener and login/payment flows that use it. |
Cross-Origin-Embedder-Policy (COEP) | Document; imposes additional conditions when loading external resources and embedded documents. | Resources or frames that do not meet the conditions may fail. |
Cross-Origin-Resource-Policy (CORP) | The resource's response; restricts its use, particularly for no-cors requests. | Neither server-side access control nor protection against every download. |
COOP: determine the window relationship
same-origin severs the relationship with a different popup when the origins and participating policies do not match. same-origin-allow-popups permits certain popups opened by the document itself with unsafe-none, but does not replace same-origin in the usual COOP/COEP path to isolation. unsafe-none is the default and does not itself require additional separation; the other document's policy may still cause separation.
The HTML Standard also defines noopener-allow-popups. This severs the opener relationship, but does not create a comprehensive security boundary between applications on the same origin: shared storage and other access paths still need consideration. This less common variant and its browser support belong in a targeted architecture review, not a universal header bundle. HTML § 7.1.3
COEP: consider request mode and response together
With require-corp, cross-origin resources requested in no-cors mode need a matching CORP permission. If the element instead loads in CORS mode, CORS access must succeed. An Access-Control-Allow-Origin header on the server alone does not change the mode of an ordinary <img> request.
credentialless permits cross-origin no-cors resources without explicit CORP permission by omitting credentials for those requests. It does not disable an explicitly restrictive CORP policy. CORS requests remain subject to CORS. Personalised resources may look different or fail without their credentials; frames have additional conditions.
This value is not available everywhere: the compatibility data read on 27 September 2026 list credentialless for Chromium and desktop Firefox, but not Safari or Firefox for Android. This is documented implementation status, not our own device acceptance test. unsafe-none imposes no additional COEP restriction. HTML § 7.1.4
CORP: serve the resource for its intended use
same-origin restricts the covered use to the same origin. Under the Fetch rules, same-site permits a broader domain relationship, but does not equate to a trusted organisation. A subdomain managed by someone else may be included. The algorithm also has a transport condition: a resource served over HTTPS is not made available to an HTTP initiator merely because their domains have the same relationship. cross-origin permits the covered use by other origins; this can be precisely the right setting for a public CDN.
CORP does not grant CORS read permission. Nor does it prevent another HTTP client from fetching a publicly reachable file. A blocked image request therefore does not establish a complete hotlinking or access restriction. Fetch § 3.7
An image under require-corp: two permitted paths
Schematic explanation · not a measurement
Four image paths under COEP: require-corp
Source document: COEP require-corp. Target: an image on another origin. These paths concern images, not iframe permission.
1 · no-cors without permission
- Document requests the image in no-cors mode
- Image server provides no matching CORP permission
- Result: use is blocked
2 · no-cors with CORP
- Document requests the image in no-cors mode
- Image server responds with CORP cross-origin
- Result: this check permits use
Other browser rules remain in effect.
3 · no-cors with ACAO alone
- Document requests the image in no-cors mode
- Image server responds only with Access-Control-Allow-Origin: *
- Result: no matching permission for this mode
4 · CORS mode with a CORS response
- Document requests the image with crossorigin="anonymous"
- Image server permits CORS access
- Result: the CORS path can enable use
COEP evaluates the request mode and matching response permission together.
On narrow screens, scroll the table sideways.
Request from the document with COEP: require-corp | Response from the external image server | Expected COEP/CORP decision |
|---|---|---|
<img src="…">, usually no-cors | No matching permission | Image use blocked. |
| The same no-cors request | Cross-Origin-Resource-Policy: cross-origin | Permitted by this check; other rules may still block it. |
| The same no-cors request | Only Access-Control-Allow-Origin: * | Insufficient for this request mode. |
<img crossorigin="anonymous" src="…"> | A matching CORS response | The CORS path can enable use. |
The local Chromium check conducted for the source review confirmed these contrasting cases. This image table is insufficient for frames: under COEP, the embedded documents must also meet the relevant embedder policy conditions. A CORP header on an iframe target alone is therefore not a universal fix.
A starting point for the usual COOP/COEP path to cross-origin isolation is:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corpThis also requires a secure context, a supporting browser and the remaining policy conditions, in particular no denial through the cross-origin-isolated Permissions Policy. CORP is not a mandatory third document header. Check in the relevant document:
console.log({ secure: window.isSecureContext, isolated: window.crossOriginIsolated });The value describes this context. It confirms neither every embedded page, the operating system's actual process allocation nor tested protection against Spectre. Newer alternative mechanisms are covered under additional headers.
Introduce policies around actual user journeys
- Decide whether you need window separation, resource restrictions or cross-origin isolation. Inventory third-party images, fonts, scripts, frames, workers and popups.
- Identify the operator responsible for each response. CORP permission must come from the resource server; a header only on your own homepage cannot fix another server's response.
- Try the intended rules in an isolated environment. COOP/COEP Report-Only can indicate conflicts if reporting is actually configured and supported. An absence of reports does not establish compatibility; see the Reporting API.
- Check positive and negative cases: intended images and frames, sign-in, payment, popup communication and the required API. Inspect console errors, the request modes used and the actual isolation state.
- Roll out to a limited scope. Keep the previous header configuration, matching application version and cache handling ready for rollback. After rollback, documents must be reloaded and window relationships re-established.
There is no universally low-risk sequence of ‘COOP first, then CORP, then COEP’. COOP alone can break a login popup flow, and CORP can block an intended image. Repeated COEP values such as require-corp, require-corp do not strengthen the policy: the structured field becomes invalid and falls back to the default under the standard. Correct the responsible delivery architecture.
Distinguish CORS, permissions and compliance
CORS governs whether browser code may read a particular cross-origin response. The mechanisms described here serve other purposes. None replaces authentication, server-side authorisation, CSP or checking the trustworthiness of a permitted script. For API-specific questions, continue with the API security guide.
Such a configuration does not establish general compliance with NIS2 or PCI requirements. A permitted but compromised script can still act within the document; the headers neither inventory nor authorise payment scripts. The header check also does not measure actual process isolation. Compliance overview
Frequently asked questions
Do I have to set all three headers?
No. CORP is a resource policy, not a required part of the pair of document headers used for the usual isolation path. Choose each mechanism for its purpose and compatibility.
Can credentialless fix every widget?
No. Credentials may be needed for the function to work; CORS, frames, explicit CORP and browser support still need checking.
Why is crossOriginIsolated false despite suitable headers?
Check the secure context, the unambiguous values actually received, Permissions Policy, embedding and browser support. A scanner cannot replace this browser check.
Does CORP protect my files against downloads by others?
It restricts certain uses in browsers. Confidential files still require access control on the server.
Sources and technical status
Source review: 27 September 2026.
HTML: COOP/COEP, Fetch: CORP and the implementation data linked above were checked on 27 September 2026. The source review included local image, window and isolation counterchecks using Chromium 147.0.7727.15. It did not include a real login/payment integration, a Safari device check or a complete browser matrix.