Cross-Origin-Opener-Policy Memisahkan Konteks Browsing Tingkat Atas

Sebuah window browser tidak otomatis terisolasi hanya karena menampilkan dokumen dari origin lain. Window dapat mempertahankan hubungan melalui mekanisme seperti window.opener, dan hubungan tersebut memengaruhi browsing context mana yang berada dalam browsing context group yang sama.

Cross-Origin-Opener-Policy (COOP) memberi dokumen tingkat atas kendali atas batas pengelompokan tersebut. Policy ini dikirim sebagai header respons HTTP dan dapat menempatkan dokumen cross-origin ke browsing context group yang terpisah.

Kontrol ini berfokus pada hubungan antarkonteks browser. COOP tidak menggantikan pemeriksaan origin, Content Security Policy, autentikasi, otorisasi, atau keamanan transport.

Default mengizinkan hubungan opener yang lebih luas

Tanpa policy yang lebih ketat, sebuah dokumen umumnya berperilaku seolah respons berikut diterapkan:

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none tidak meminta isolasi melalui COOP. Halaman yang dibuka oleh dokumen lain dapat mempertahankan hubungan opener ketika aturan browser lainnya mengizinkan.

Same-origin policy tetap membatasi akses langsung ke banyak properti lintas origin. Batas tersebut penting, tetapi tidak sama dengan memisahkan window ke browsing context group yang berbeda.

COOP menambahkan batas pada tingkat grup, bukan memberikan akses baca cross-origin baru.

same-origin membentuk batas grup yang kuat

Sebuah respons dapat menetapkan:

Cross-Origin-Opener-Policy: same-origin

Dengan policy ini, dokumen tingkat atas dipertahankan dalam browsing context group bersama dokumen yang memenuhi persyaratan same-origin policy tersebut. Hubungan opener cross-origin yang tidak memenuhi persyaratan akan terputus ketika dokumen terkait ditempatkan ke grup yang berbeda.

Kode yang mengharapkan popup cross-origin tetap dapat dijangkau melalui window.opener dapat berperilaku berbeda setelah header ini diterapkan.

Efek tersebut memang bagian dari desainnya. Browser mengubah hubungan antara konteks tingkat atas, bukan sekadar memfilter satu properti JavaScript.

Alur popup dapat memerlukan policy berbeda

Sebagian aplikasi perlu membuka halaman cross-origin dan mempertahankan hubungan opener untuk komunikasi yang sah. Integrasi pembayaran, identitas, dan alur delegasi dapat memakai pola popup semacam ini.

Untuk kasus tersebut, browser mendukung:

Cross-Origin-Opener-Policy: same-origin-allow-popups

Policy ini mempertahankan isolasi yang lebih kuat dari opener cross-origin yang tidak terkait sambil mengizinkan hubungan popup tertentu yang dimulai oleh dokumen terlindungi.

Nilai ini bukan sakelar kompatibilitas universal. Origin opener dan popup, policy masing-masing, urutan navigasi, serta rancangan komunikasi tetap berpengaruh. Deployment perlu menguji keseluruhan alur popup, bukan menyimpulkan perilaku hanya dari header.

noopener menangani masalah yang lebih sempit

Link dan pembuatan window melalui script juga dapat meniadakan hubungan opener dengan rel="noopener" atau perilaku setara.

Contohnya:

<a href="https://external.example/" target="_blank" rel="noopener">
  Layanan eksternal
</a>

Pola ini berguna ketika satu link tidak perlu memberikan referensi opener kepada tujuan.

COOP bekerja pada tingkat policy dokumen yang lebih luas. Ia mengatur pengelompokan browsing context untuk respons tingkat atas dan dapat mencakup hubungan yang tidak praktis dikendalikan satu per satu pada setiap link.

Kedua kontrol saling melengkapi. Atribut link yang aman tidak membentuk batas isolasi tingkat dokumen yang sama dengan COOP, sementara COOP tidak menghilangkan kebutuhan untuk meninjau perilaku navigasi individual.

COOP berperan dalam cross-origin isolation

COOP juga merupakan salah satu bagian dari kondisi browser yang terkait dengan cross-origin isolation. Dokumen yang memerlukan kapabilitas yang dibatasi pada lingkungan cross-origin isolated umumnya membutuhkan nilai COOP yang sesuai bersama Cross-Origin-Embedder-Policy (COEP) yang kompatibel.

Pasangan yang umum adalah:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Kedua header menangani batas berbeda. COOP berkaitan dengan hubungan browsing context tingkat atas. COEP membatasi resource cross-origin yang dapat di-embed kecuali memenuhi kondisi opt-in yang diperlukan.

Menetapkan COOP saja tidak berarti dokumen sudah cross-origin isolated. Aplikasi sebaiknya memeriksa state browser yang disediakan untuk tujuan tersebut, bukan menganggap keberadaan header sebagai bukti.

Mode report-only dapat menampilkan masalah kompatibilitas

Policy opener yang lebih ketat dapat mengganggu integrasi berbasis popup. Browser menyediakan bentuk report-only yang dapat membantu mengevaluasi potensi dampak policy sebelum enforcement:

Cross-Origin-Opener-Policy-Report-Only: same-origin

Dukungan reporting dan detail pengirimannya bergantung pada browser serta konfigurasi reporting. Karena itu, header report-only merupakan alat observasi, bukan bukti bahwa setiap jalur produksi telah diuji.

Pengujian interaktif tetap penting untuk popup autentikasi, alur pembayaran, alat dukungan, konsol administratif, dan fitur lain yang membuka atau dibuka oleh situs berbeda.

Rantai redirect perlu diuji secara eksplisit

Sebuah popup dapat melewati beberapa origin sebelum mencapai dokumen akhir. Sistem autentikasi sering melibatkan redirect antara aplikasi, identity provider, dan route callback.

Evaluasi COOP mengikuti dokumen dan navigasi yang terlibat dalam urutan tersebut. Menguji URL pertama dan terakhir saja dapat melewatkan perubahan hubungan yang terjadi di tengah rantai.

Pengujian yang berguna mencatat state opener pada setiap tahap yang relevan dan memastikan messaging setelah navigasi tetap mencapai konteks yang dituju. Jika aplikasi memakai postMessage, origin pesan dan struktur pesan tetap perlu divalidasi secara terpisah dari COOP.

COOP dapat mengurangi hubungan konteks yang tidak diinginkan; ia tidak mengautentikasi pesan.

Terapkan header pada respons yang membentuk batas

Karena COOP merupakan policy respons, konsistensi penting. Route aplikasi sensitif, target redirect, dokumen error, dan jalur masuk alternatif dapat menghasilkan perilaku berbeda jika mengirim policy berbeda.

Middleware respons bersama dapat menetapkan baseline, tetapi pengecualian sebaiknya tetap eksplisit. Route yang memerlukan same-origin-allow-popups untuk integrasi terdokumentasi tidak seharusnya diam-diam menjadikan nilai tersebut sebagai default untuk halaman lain.

Deployment juga perlu memperhitungkan reverse proxy, konfigurasi edge, dan middleware framework yang dapat menambah, mengganti, atau menghapus security header.

Properti keamanannya adalah pemisahan, bukan kerahasiaan

COOP mempersempit satu hubungan browser tertentu: dokumen tingkat atas mana yang dapat tetap berada dalam browsing context group yang sama. Pemisahan ini dapat mengurangi paparan dari hubungan opener yang tidak diinginkan dan menjadi komponen yang diperlukan pada konfigurasi yang mengejar cross-origin isolation.

COOP tidak membuat konten cross-origin menjadi rahasia, memvalidasi tujuan popup, mengotorisasi pengguna, atau menjadikan resource tertanam tepercaya. Properti tersebut memerlukan kontrol masing-masing.

Deployment yang kokoh memilih policy paling ketat yang tetap kompatibel dengan alur opener yang diperlukan, menguji rantai navigasi nyata, menjaga validasi pesan tetap independen, dan menempatkan COOP sebagai satu batas browser dengan cakupan yang jelas.