(UPDATED: )

COOP (Cross-Origin-Opener-Policy)

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 환경을 구성하면, 더욱 안전한 웹 환경을 구축하고 브라우저의 모든 기능을 활용할 수 있습니다.