Gunakan COOP dan COEP untuk menyiapkan lingkungan yang diisolasi lintas origin dan mengaktifkan
fitur canggih seperti SharedArrayBuffer,
performance.measureUserAgentSpecificMemory(), dan timer resolusi tinggi dengan
presisi yang lebih baik.
Dipublikasikan: 13 April 2020, Terakhir diperbarui: 21 Juni 2022
Dokumen ini menunjukkan cara menggunakan COOP dan COEP ini. Anda dapat membaca selengkapnya alasan hal ini penting di Membuat situs Anda "diisolasi lintas origin" menggunakan COOP dan COEP.
Beberapa API web meningkatkan risiko serangan side-channel seperti Spectre. Untuk mengurangi risiko tersebut, browser menawarkan lingkungan terisolasi berbasis keikutsertaan yang disebut diisolasi lintas origin. Dengan status diisolasi lintas origin, halaman web akan dapat menggunakan fitur istimewa, termasuk:
| API | Deskripsi |
|---|---|
SharedArrayBuffer
|
Diperlukan untuk thread WebAssembly. Fitur ini tersedia mulai Chrome 88 Android. Versi desktop diaktifkan secara default dengan bantuan Isolasi Situs, tetapi akan memerlukan status diisolasi lintas origin dan akan dinonaktifkan secara default di Chrome 92. |
performance.measureUserAgentSpecificMemory()
|
Tersedia mulai Chrome 89. |
performance.now(), performance.timeOrigin
|
Tersedia di banyak browser, dengan resolusi terbatas hingga 100 mikrodetik atau lebih tinggi. Dengan isolasi lintas origin, resolusinya dapat mencapai 5 mikrodetik atau lebih tinggi. |
Status diisolasi lintas origin juga mencegah modifikasi
document.domain. (Kemampuan untuk mengubah document.domain memungkinkan komunikasi
antara dokumen dari situs yang sama dan dianggap sebagai celah dalam
kebijakan origin yang sama.)
Untuk ikut serta dalam status diisolasi lintas origin, Anda harus mengirim header HTTP berikut pada dokumen utama:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Header ini menginstruksikan browser untuk memblokir pemuatan resource atau iframe yang belum diizinkan untuk dimuat oleh dokumen lintas origin, dan mencegah jendela lintas origin berinteraksi langsung dengan dokumen Anda. Artinya, resource yang dimuat lintas origin memerlukan keikutsertaan.
Anda dapat menentukan apakah halaman web berada dalam status diisolasi lintas origin dengan
memeriksa
self.crossOriginIsolated.
Glosarium
Dokumen ini menggunakan banyak terminologi yang memiliki nama dan singkatan yang mirip. Untuk memperjelas, kami telah menyusun glosarium mini:
- COEP: Kebijakan Penyemat Lintas Origin
- COOP: Cross Origin Opener Policy
- CORP: Cross Origin Resource Policy
- CORS: Cross Origin Resource Sharing
- CORB: Cross Origin Read Blocking
Membuat situs Anda diisolasi lintas origin
1. Menetapkan Cross-Origin-Opener-Policy: same-origin pada dokumen level teratas
Dengan mengaktifkan COOP: same-origin pada dokumen tingkat atas, jendela dengan origin yang sama
dan jendela yang dibuka dari dokumen memiliki grup konteks penjelajahan
terpisah, kecuali jika berada di origin yang sama dengan setelan COOP yang sama.
Dengan demikian, isolasi diterapkan untuk jendela yang dibuka dan komunikasi timbal balik antara
kedua jendela dinonaktifkan.
Grup konteks penjelajahan adalah kumpulan jendela yang dapat saling merujuk. Misalnya, dokumen tingkat teratas dan dokumen turunannya yang disematkan dengan <iframe>.
Jika situs (https://a.example) membuka jendela dialog (https://b.example),
jendela pembuka dan jendela dialog memiliki konteks penjelajahan yang sama,
sehingga keduanya memiliki akses satu sama lain dengan DOM API seperti window.opener.

Anda dapat memeriksa apakah pembuka jendela dan yang dibuka berada dalam grup konteks penjelajahan yang terpisah dari DevTools.
2. Mengaktifkan CORP atau CORS pada resource
Pastikan semua resource di halaman dimuat dengan header HTTP CORP atau CORS. Langkah ini diperlukan untuk langkah empat, mengaktifkan COEP.
Berikut hal yang perlu Anda lakukan, bergantung pada sifat resource:
- Jika resource diperkirakan akan dimuat hanya dari origin yang sama, tetapkan
header
Cross-Origin-Resource-Policy: same-origin. - Jika resource diharapkan dimuat hanya dari situs yang sama, tetapi lintas
origin, tetapkan header
Cross-Origin-Resource-Policy: same-site. - Jika resource dimuat dari lintas origin di bawah kontrol Anda, tetapkan
header
Cross-Origin-Resource-Policy: cross-originjika memungkinkan. - Untuk resource lintas origin yang tidak Anda kontrol:
- Gunakan atribut
crossorigindi tag HTML pemuatan jika resource disajikan dengan CORS. (Misalnya,<img src="***" crossorigin>.) - Minta pemilik resource untuk mendukung CORS atau CORP.
- Gunakan atribut
- Untuk iframe, ikuti prinsip yang sama dan tetapkan
Cross-Origin-Resource-Policy: cross-origin(atausame-site,same-originbergantung pada konteksnya). - Skrip yang dimuat dengan
WebWorkerharus disajikan dari origin yang sama, sehingga Anda tidak memerlukan header CORP atau CORS. - Untuk dokumen atau worker yang disajikan dengan
COEP: require-corp, subresource lintas origin yang dimuat tanpa CORS harus menetapkan headerCross-Origin-Resource-Policy: cross-originagar dapat disematkan. Misalnya, hal ini berlaku untuk<script>,importScripts,<link>,<video>,<iframe>, dll.
Isolasi dalam iframe
Anda dapat mengaktifkan isolasi lintas origin pada dokumen yang disematkan dalam
iframe dengan menerapkan kebijakan izin allow="cross-origin-isolated" ke
tag <iframe> dan memenuhi kondisi ini. Seluruh rantai dokumen,
termasuk frame induk dan frame turunan, juga harus diisolasi lintas origin.
3. Menggunakan header HTTP COEP Report-Only untuk menilai resource tersemat
Sebelum mengaktifkan COEP sepenuhnya, Anda dapat melakukan uji coba menggunakan
header Cross-Origin-Embedder-Policy-Report-Only untuk memeriksa apakah kebijakan
tersebut benar-benar berfungsi. Anda akan menerima laporan tanpa memblokir konten tersemat.
Terapkan ini secara berulang ke semua dokumen, termasuk dokumen tingkat teratas, iframe, dan skrip worker. Untuk mengetahui informasi tentang header HTTP Report-Only, lihat Mengamati masalah menggunakan Reporting API.
4. Mengaktifkan COEP
Langkah ini hanya dapat dilakukan setelah Anda memastikan resource telah mengaktifkan CORP atau CORS.
Setelah Anda mengonfirmasi bahwa semuanya berfungsi dan semua resource dapat
berhasil dimuat, alihkan header Cross-Origin-Embedder-Policy-Report-Only
ke header Cross-Origin-Embedder-Policy dengan nilai yang sama ke semua
dokumen, termasuk dokumen yang disematkan dengan iframe dan skrip worker.
Menentukan apakah isolasi berhasil
Properti self.crossOriginIsolated menampilkan true saat halaman web berada dalam
status diisolasi lintas origin dan semua resource serta jendela diisolasi dalam
grup konteks penjelajahan yang sama. Anda dapat menggunakan API ini untuk menentukan apakah Anda
telah berhasil mengisolasi grup konteks penjelajahan dan mendapatkan akses ke
fitur seperti performance.measureUserAgentSpecificMemory().
Men-debug masalah
Anda mungkin mengalami masalah dengan COOP dan COEP. Anda dapat menggunakan alat developer browser atau API pelaporan untuk melakukan debug.
Men-debug dengan Chrome DevTools
Untuk resource yang dirender di layar seperti gambar, cukup mudah untuk mendeteksi masalah COEP, karena permintaan diblokir dan halaman akan menunjukkan gambar yang tidak ada. Namun, untuk resource yang tidak memiliki dampak visual, seperti skrip atau gaya, masalah COEP mungkin tidak akan terlihat. Untuk itu, gunakan panel Jaringan DevTools.
Jika ada masalah dengan COEP, Anda akan melihat
(blocked:NotSameOriginAfterDefaultedToSameOriginByCoep) di kolom
Status.

Kemudian, Anda dapat mengklik entri untuk melihat detail selengkapnya.

Anda juga dapat menentukan status iframe dan jendela dialog melalui panel Application. Buka bagian "Frames" di sisi kiri dan luaskan "top" untuk melihat perincian struktur resource.
Anda dapat memeriksa status iframe seperti ketersediaan SharedArrayBuffer,
dll.

Anda juga dapat memeriksa status jendela dialog, seperti apakah jendela tersebut diisolasi lintas origin.

Mengamati masalah menggunakan Reporting API
Reporting API adalah mekanisme lain yang dapat Anda gunakan untuk mendeteksi berbagai masalah. Anda dapat mengonfigurasi Reporting API untuk menginstruksikan browser pengguna agar mengirim laporan setiap kali COEP memblokir pemuatan resource atau COOP mengisolasi jendela dialog. Chrome telah mendukung Reporting API sejak versi 69 untuk berbagai penggunaan, termasuk COEP dan COOP.
Pelajari cara mengonfigurasi Reporting API dan menyiapkan server untuk menerima laporan.
Contoh laporan COEP
Contoh payload laporan COEP saat resource lintas origin diblokir akan terlihat seperti ini:
[{
"age": 25101,
"body": {
"blocked-url": "https://third-party-test.example.org/check.svg?",
"blockedURL": "https://third-party-test.example.org/check.svg?",
"destination": "image",
"disposition": "enforce",
"type": "corp"
},
"type": "coep",
"url": "https://cross-origin-isolation.example.com/?coep=require-corp&coop=same-origin&",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4249.0 Safari/537.36"
}]
Contoh laporan COOP
Contoh payload laporan COOP saat dialog dibuka secara terisolasi akan terlihat seperti ini:
[{
"age": 7,
"body": {
"disposition": "enforce",
"effectivePolicy": "same-origin",
"nextResponseURL": "https://third-party-test.example.org/popup?report-only&coop=same-origin&",
"type": "navigation-from-response"
},
"type": "coop",
"url": "https://cross-origin-isolation.example.com/coop?coop=same-origin&",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
}]
Jika grup konteks penjelajahan yang berbeda mencoba mengakses satu sama lain (hanya dalam
mode "hanya laporan"), COOP juga akan mengirimkan laporan. Misalnya, laporan saat
postMessage() dicoba akan terlihat seperti ini:
[{
"age": 51785,
"body": {
"columnNumber": 18,
"disposition": "reporting",
"effectivePolicy": "same-origin",
"lineNumber": 83,
"property": "postMessage",
"sourceFile": "https://cross-origin-isolation.example.com/popup.js",
"type": "access-from-coop-page-to-openee"
},
"type": "coop",
"url": "https://cross-origin-isolation.example.com/coop?report-only&coop=same-origin&",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
},
{
"age": 51785,
"body": {
"disposition": "reporting",
"effectivePolicy": "same-origin",
"property": "postMessage",
"type": "access-to-coop-page-from-openee"
},
"type": "coop",
"url": "https://cross-origin-isolation.example.com/coop?report-only&coop=same-origin&",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
}]
Poin-poin penting
Gunakan kombinasi header HTTP COOP dan COEP untuk mengikutsertakan halaman web ke dalam status khusus yang diisolasi lintas origin. Anda dapat memeriksa self.crossOriginIsolated untuk
menentukan apakah halaman web berada dalam status diisolasi lintas origin.
Kami akan terus memperbarui postingan ini seiring tersedianya fitur baru untuk status diisolasi lintas origin ini, dan peningkatan lebih lanjut dilakukan pada DevTools seputar COOP dan COEP.
Resource
- Alasan Anda memerlukan "diisolasi lintas origin" untuk fitur canggih
- Panduan untuk mengaktifkan isolasi lintas origin
- Memantau total penggunaan memori halaman web Anda dengan
measureUserAgentSpecificMemory()
Pembaruan dokumen
- 21 Juni 2022: Skrip worker juga perlu diperhatikan saat isolasi lintas origin diaktifkan. Menambahkan beberapa penjelasan.
- 5 Agustus 2021: JS Self-Profiling API telah disebutkan sebagai salah satu API yang memerlukan isolasi lintas origin, tetapi mencerminkan perubahan arah terbaru, API ini dihapus.
- 6 Mei 2021: Berdasarkan masukan dan masalah yang dilaporkan, kami memutuskan untuk menyesuaikan
jadwal penggunaan
SharedArrayBufferdi situs yang tidak diisolasi lintas origin untuk dibatasi di Chrome M92. - 16 April 2021: Menambahkan catatan tentang mode tanpa kredensial COEP dan same-origin-allow-popups COOP menjadi kondisi longgar untuk isolasi lintas origin.
- 5 Maret 2021: Menghapus batasan untuk
SharedArrayBuffer,performance.measureUserAgentSpecificMemory(), dan fungsi proses debug, yang kini diaktifkan sepenuhnya di Chrome 89. Menambahkan kemampuan mendatang,performance.now()danperformance.timeOrigin, yang akan memiliki presisi lebih tinggi. - 19 Februari 2021: Menambahkan catatan tentang kebijakan fitur
allow="cross-origin-isolated"dan fungsi proses debug di DevTools. - 15 Oktober 2020:
self.crossOriginIsolatedtersedia mulai Chrome 87. Untuk mencerminkan hal tersebut,document.domaintidak dapat diubah jikaself.crossOriginIsolatedmenampilkantrue.performance.measureUserAgentSpecificMemory()mengakhiri uji coba origin-nya dan diaktifkan secara default di Chrome 89. Shared Array Buffer di Chrome Android akan tersedia mulai Chrome 88.