Cross-Origin-Opener-PolicyCross-Origin-Opener-Policy(COOP)는 이 문서가 window.open()이나 링크로 연결된 다른 브라우징 컨텍스트(팝업·opener)와 같은 '브라우징 컨텍스트 그룹'을 공유할지를 통제하는 보안 헤더입니다. same-origin으로 설정하면 교차 출처 문서와의 window.opener 참조가 끊어져 프로세스 수준 격리가 이뤄집니다.
기본 상태에서는 A 페이지가 연 팝업 B와 서로 window.opener·window 참조를 통해 상호작용할 수 있습니다. 이는 tabnabbing이나 XS-Leaks(교차 사이트 정보 유출) 같은 공격의 표면이 됩니다. COOP: same-origin은 교차 출처 문서를 별도의 브라우징 컨텍스트 그룹으로 분리해 이런 참조를 null로 만들고, 브라우저가 이들을 다른 OS 프로세스에 둘 수 있게 해 Spectre류 사이드채널 위험도 줄입니다.
COOP의 가장 중요한 실용적 목적은 Cross-Origin-Embedder-Policy(COEP)와 짝을 이뤄 페이지를 crossOriginIsolated 상태로 만드는 것입니다. COOP: same-origin과 COEP: require-corp(또는 credentialless)가 함께 적용되면 self.crossOriginIsolated가 true가 되고, 그때에만 SharedArrayBuffer, 고정밀 performance.now() 타이머, JS 스레드 간 메모리 공유 같은 강력한 기능이 활성화됩니다.
same-origin-allow-popups는 완화값으로, 자신은 격리하면서도 자신이 연 팝업과의 통신은 유지합니다. OAuth·결제 팝업처럼 opener와의 postMessage가 필요한 흐름을 깨지 않으려 할 때 씁니다. report-to 파라미터로 위반·완화를 Reporting API에 보고해 점진적 도입을 검증할 수 있습니다.
Cross-Origin-Opener-Policy: <unsafe-none | same-origin | same-origin-allow-popups>[; report-to="<group>"]e.g. Cross-Origin-Opener-Policy: same-origin
unsafe-none | 기본값. 다른 문서와 브라우징 컨텍스트 그룹을 공유하며 window.opener 관계를 그대로 유지. |
same-origin | 동일 오리진 문서끼리만 컨텍스트 그룹을 공유. 교차 출처 opener/팝업 참조를 끊어 격리(crossOriginIsolated 조건 중 하나). |
same-origin-allow-popups | 자신은 격리하되 자신이 연 팝업과의 참조는 유지. OAuth 팝업 등 호환을 위한 완화값. |
report-to="<group>" | COOP 위반·완화 상황을 보고할 Reporting-Endpoints 그룹 이름. |