COOP(Cross-Origin-Opener-Policy)는 특정 문서가 Cross-origin 팝업 등과 같은 다른 문서와 동일한 Browse context group을 공유하지 않도록 격리하는 보안 헤더입니다. 이를 통해 Cross-origin 문서 간의 상호작용을 제어하여 XS-Leaks와 같은 일부 공격을 방어할 수 있습니다.
The Problem
기본적으로 웹 브라우저는 window.open()
등을 통해 열린 새 창이나 탭(Openee)이 자신을 연 창(Opener)에 접근하는 것을 허용합니다. 만약 Opener와 Openee가 서로 다른 Origin일지라도, window.opener
객체를 통해 제한적인 상호작용이 가능합니다.
이러한 상호작용은 window.opener.closed
로 창이 닫혔는지 확인하거나, window.opener.focus()
로 포커스를 주는 등의 기능을 가능하게 하지만, 보안적인 측면에선 몇 가지 위협을 야기합니다. 예를 들어, 악의적인 페이지가 정상적인 페이지를 팝업으로 연 뒤, window.opener
를 통해 일부 정보를 유추하거나 사용자의 상호작용을 방해할 수 있습니다. (e.g. Tabnabbing)
What is COOP?
COOP는 이러한 문제를 해결하기 위해 도입된 HTTP 응답 헤더입니다. 문서의 최상위 Browse Context를 격리하여 Cross-origin 문서와의 직접적인 window
객체 참조를 끊어버립니다.
만약 어떤 문서가 COOP: same-origin
헤더와 함께 로드된다면, 이 문서가 새로 연 Cross-origin 문서는 window.opener
값이 null
이 됩니다. 따라서 Openee는 Opener에 대한 정보를 얻거나 제어할 수 없게 됩니다.
graph TD subgraph Default Behavior A[Opener Page: a.com] -- window.open() --> B[Popup: b.com]; B -- "window.opener is NOT null" --> A; end subgraph With COOP: same-origin C[Opener Page: a.com with COOP] -- window.open() --> D[Popup: b.com]; D -- "window.opener is null" --> C; end
COOP Directives
COOP 헤더는 세 가지 주요 지시문을 가집니다.
unsafe-none
- 기본값입니다.
- 문서가 Opener의 Browse context group에 추가될 수 있도록 허용합니다. (단, Opener가
same-origin
이나same-origin-allow-popups
가 아닐 경우)
same-origin-allow-popups
- 문서는 자신의 Top-level Browse context를 유지합니다.
- 단, 자신이 여는 팝업 중에서 COOP를 설정하지 않았거나,
unsafe-none
으로 설정하여 격리를 선택 해제한 팝업과는 상호작용을 허용합니다.
same-origin
- 가장 강력한 격리 수준입니다.
- 문서는 자신의 Top-level Browse context를 유지하며, 동일한 Origin을 가진 문서와만 같은 Browse context group에 속할 수 있습니다.
- 이 문서에서 열린 Cross-origin 문서는
window.opener
가 항상null
이 됩니다.
Implementation
COOP는 다른 보안 헤더처럼 HTTP 응답 헤더에 추가하여 적용할 수 있습니다.
HTTP/1.1 200 OK
Content-Type: text/html
Cross-Origin-Opener-Policy: same-origin
COOP and COEP
COOP는 종종 COEP(Cross-Origin-Embedder-Policy)와 함께 사용됩니다. 이 두 헤더를 함께 활성화하면 문서는 Cross-Origin Isolated
상태가 되며, 이는 SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
와 같은 강력한 API를 사용하는 전제 조건이 됩니다. 이는 Spectre와 같은 Side-channel 공격을 방어하기 위한 필수적인 조치입니다.
Conclusion
COOP는 Cross-origin 문서 간의 원치 않는 상호작용을 차단하여 웹 애플리케이션의 보안을 강화하는 간단하면서도 효과적인 방법입니다. 특히 same-origin
정책을 적용하면 XS-Leaks와 같은 공격 표면을 크게 줄일 수 있습니다. COEP와 함께 사용하여 Cross-Origin Isolated
환경을 구성하면, 더욱 안전한 웹 환경을 구축하고 브라우저의 모든 기능을 활용할 수 있습니다.