Meminta isolasi performa dengan header Origin-Agent-Cluster

Header respons HTTP baru untuk membatasi pembuatan skrip di seluruh domain dan meminta resource khusus dari browser.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster adalah header respons HTTP baru yang menginstruksikan browser untuk mencegah akses skrip sinkron antara halaman lintas origin situs yang sama. Browser juga dapat menggunakan Origin-Agent-Cluster sebagai petunjuk bahwa origin Anda harus mendapatkan resource terpisah yang terpisah, seperti proses khusus.

Kompatibilitas browser

Saat ini header Origin-Agent-Cluster hanya diterapkan di Chrome 88 dan seterusnya. Alat ini dirancang melalui kerja sama erat dengan perwakilan dari Mozilla Firefox yang telah menandainya sebagai berharga membuat prototipe, dan memiliki sebuah positif awal penerimaan sinyal dari perwakilan WebKit, mesin {i>browser<i} yang digunakan oleh Safari.

Namun, sementara itu, tidak ada masalah dengan men-deploy header Origin-Agent-Cluster ke semua saat ini. Browser yang tidak memahaminya akan mengabaikannya. Dan, karena halaman di cluster agen sesuai origin sebenarnya dapat melakukan lebih sedikit hal daripada cluster yang sesuai dengan situs ( default), tidak ada masalah interoperabilitas yang perlu dikhawatirkan.

Alasan browser tidak dapat memisahkan origin situs yang sama secara otomatis

Web dibuat berdasarkan kebijakan origin yang sama, yang merupakan fitur keamanan yang membatasi bagaimana dokumen dan skrip dapat berinteraksi dengan sumber daya dari origin. Misalnya, halaman yang dihosting di https://a.example berada di origin yang berbeda dari satu di https://b.example, atau satu di https://sub.a.example.

Di balik layar, browser menggunakan pemisahan yang disediakan oleh asal dengan cara yang berbeda. Di hari, meskipun origin yang terpisah tidak akan dapat mengakses data satu sama lain, mereka masih berbagi sumber daya seperti {i>thread<i} sistem operasi, proses, dan alokasi memori. Ini berarti jika satu tab lambat, maka akan memperlambat semua tab lainnya. Atau jika satu tab menggunakan terlalu banyak memori, tab itu akan membuat seluruh browser mogok.

Saat ini, browser lebih canggih, dan mencoba memisahkan sumber yang berbeda ke dalam proses-proses tersebut. Cara kerjanya berbeda-beda untuk setiap browser: sebagian besar browser memiliki tingkat pemisahan tertentu antar-tab, tetapi iframe yang berbeda di dalam satu tab mungkin membagikan proses. Karena proses datang dengan beberapa {i>overhead<i} memori, mereka menggunakan heuristik untuk menghindari memunculkan terlalu banyak: misalnya, Firefox memiliki batas proses yang dapat dikonfigurasi oleh pengguna, dan Chrome memvariasikan perilakunya antara desktop (di mana memori lebih banyak) dan seluler (dalam hal ini langka).

Heuristik ini tidak sempurna. Dan mereka memiliki keterbatasan penting: karena ada pengecualian untuk kebijakan origin yang sama yang mengizinkan subdomain seperti https://sub.a.example dan https://a.example agar dapat saling berkomunikasi, browser tidak dapat otomatis memisahkan subdomain dari sama lain.

Perilaku default ini disebut "cluster agen sesuai situs": yaitu, browser mengelompokkan halaman berdasarkan di situs mereka. Header Origin-Agent-Cluster baru meminta browser untuk mengubah setelan default ini untuk halaman tertentu, memasukkannya ke dalam cluster agen sesuai origin, sehingga dikelompokkan hanya dengan halaman lain yang memiliki asal yang sama persis. Khususnya, halaman lintas origin situs yang sama akan dikecualikan dari cluster agen.

Pemisahan keikutsertaan ini memungkinkan browser memberikan sendiri cluster agen baru sesuai kunci origin ini sumber daya khusus, yang tidak digabungkan dengan sumber daya dari sumber lainnya. Misalnya, halaman tersebut bisa mendapatkan prosesnya sendiri, atau dijadwalkan di thread terpisah. Dengan menambahkan Origin-Agent-Cluster ke halaman, Anda menunjukkan kepada browser bahwa halaman akan memanfaatkan sumber daya khusus tersebut.

Namun, untuk melakukan pemisahan, dan mendapatkan manfaat ini, browser harus menonaktifkan beberapa fitur lama.

Yang tidak dapat dilakukan halaman dengan kunci origin

Jika halaman Anda berada di cluster agen sesuai origin, Anda melepaskan beberapa kemampuan untuk berbicara dengan situs yang sama lintas origin yang sebelumnya tersedia. Khususnya:

  • Anda tidak dapat lagi menetapkan document.domain Ini adalah fitur lama yang biasanya memungkinkan halaman lintas origin situs yang sama untuk mengakses masing-masing situs secara sinkron DOM orang lain, namun dalam cluster agen sesuai origin, dinonaktifkan.

  • Anda tidak dapat lagi mengirim WebAssembly.Module objek ke halaman lintas origin situs yang sama lainnya melalui postMessage().

  • (Khusus Chrome) Anda tidak dapat lagi mengirim SharedArrayBuffer atau WebAssembly.Memory ke halaman lintas origin situs yang sama lainnya.

Kapan harus menggunakan cluster agen sesuai origin

Origin yang paling memanfaatkan header Origin-Agent-Cluster adalah yang:

  • Melakukan performa terbaik dengan sumber daya khusus mereka sendiri jika memungkinkan. Contohnya mencakup {i>game<i} yang memerlukan performa intensif, situs konferensi video, atau aplikasi pembuatan multimedia.

  • Berisi iframe intensif resource yang memiliki origin berbeda, tetapi memiliki situs yang sama. Misalnya, jika https://mail.example.com menyematkan https://chat.example.com iframe, kunci origin https://mail.example.com/ memastikan kode yang ditulis oleh tim chat tidak dapat secara tidak sengaja mengganggu kode yang ditulis oleh tim email, dan dapat memberi petunjuk ke browser untuk memberi mereka untuk menjadwalkannya secara terpisah dan mengurangi dampak performanya satu sama lain.

  • Berharap untuk disematkan di halaman asal yang berbeda di situs yang sama, tetapi ketahuilah dan menggunakan banyak resource. Misalnya, jika https://customerservicewidget.example.com ingin menggunakan banyak sumber daya untuk {i>video chat<i}, dan akan disematkan pada berbagai sumber https://*.example.com, tim yang mengelola widget tersebut dapat menggunakan Origin-Agent-Cluster untuk mencoba mengurangi dampak performanya pada sematan.

Selain itu, Anda juga perlu memastikan bahwa Anda setuju untuk menonaktifkan opsi yang jarang digunakan fitur komunikasi lintas asal, dan bahwa situs Anda menggunakan HTTPS.

Namun, pada akhirnya, semua ini hanyalah panduan. Apakah cluster agen sesuai origin akan membantu situs Anda atau tidak pada akhirnya paling baik ditentukan melalui pengukuran. Secara khusus, Anda perlu mengukur Data Web Anda, dan mungkin memori Anda penggunaan, untuk melihat dampak penerapan kunci origin. (Penggunaan memori dalam khususnya merupakan kekhawatiran potensial, karena peningkatan jumlah proses yang terjadi dapat menyebabkan overhead memori per proses.) Anda tidak boleh hanya menerapkan kunci origin dan mengharapkan yang terbaik.

Bagaimana kaitannya dengan isolasi lintas asal?

Origin-keying cluster agen melalui header Origin-Agent-Cluster berkaitan dengan, tetapi terpisah dari isolasi lintas asal melalui Cross-Origin-Opener-Policy dan Cross-Origin-Embedder-Policy header.

Setiap situs yang membuatnya diisolasi lintas origin juga akan menonaktifkan lintas origin situs yang sama fitur komunikasi seperti saat menggunakan header Origin-Agent-Cluster. Namun, Header Origin-Agent-Cluster masih dapat berguna selain isolasi lintas asal, sebagai tambahan petunjuk ke browser untuk memodifikasi heuristik alokasi sumber dayanya. Jadi, Anda tetap harus mempertimbangkan menerapkan header Origin-Agent-Cluster, dan mengukur hasilnya, bahkan pada halaman yang sudah diisolasi lintas origin.

Cara menggunakan header Origin-Agent-Cluster

Untuk menggunakan header Origin-Agent-Cluster, konfigurasi server web Anda untuk mengirim permintaan HTTP berikut header respons:

Origin-Agent-Cluster: ?1

Nilai ?1 adalah atribut terstruktur Sintaksis header untuk boolean true dengan sejumlah nilai.

Header ini harus dikirim pada semua respons dari origin Anda, bukan hanya di beberapa halaman. Jika tidak, Anda bisa mendapatkan hasil yang tidak konsisten, yang menyebabkan browser "mengingat" melihat kunci origin dan sebagainya, serta kunci origin meskipun pada halaman yang tidak memintanya. Atau sebaliknya: jika halaman pertama yang dikunjungi pengguna tidak memiliki header, browser akan mengingat bahwa origin Anda tidak ingin sesuai dengan origin, dan akan mengabaikan header di halaman berikutnya.

Mengapa browser tidak selalu mengikuti header?

Alasan "memori" ini adalah untuk memastikan konsistensi pengaturan kunci untuk origin. Jika beberapa halaman pada berdasarkan origin, sedangkan yang lain tidak, maka Anda dapat memiliki dua halaman origin yang sama ditempatkan ke dalam cluster agen yang berbeda, sehingga tidak diizinkan untuk saling berkomunikasi. Ini akan menjadi sangat aneh, baik untuk pengembang web dan bagian dalam browser. Jadi, spesifikasinya untuk Origin-Agent-Cluster, akan mengabaikan header jika tidak konsisten dengan yang sebelumnya terlihat untuk origin tertentu. Di Chrome, tindakan ini akan menyebabkan peringatan konsol.

Konsistensi ini mencakup grup konteks penjelajahan, yang merupakan grup tab, jendela, atau iframe yang semuanya dapat menjangkau satu sama lain melalui mekanisme seperti window.opener, frames[0], atau window.parent. Hal ini berarti bahwa, setelah kunci asal atau kunci situs asal diselesaikan (oleh {i>browser<i} Anda bisa melihat atau tidak melihat {i>header<i}), mengubahnya akan membutuhkan pembukaan , tidak terhubung ke {i>tab<i} lama dengan cara apa pun.

Detail ini dapat penting untuk menguji header Origin-Agent-Cluster. Saat pertama kali menambahkannya ke situs Anda, hanya memuat ulang halaman tidak akan berfungsi; Anda harus menutup tab dan membuka satu.

Untuk memeriksa apakah header Origin-Agent-Cluster diterapkan, gunakan JavaScript window.originAgentCluster. Nilainya akan menjadi true jika header (atau mekanisme, seperti isolasi lintas asal) menyebabkan penetapan origin; false padahal tidak; dan undefined di browser yang tidak menerapkan header Origin-Agent-Cluster. Mencatat data ini ke platform analisis dapat memberikan pemeriksaan berharga yang telah Anda konfigurasi server Anda dengan benar.

Terakhir, perhatikan bahwa header Origin-Agent-Cluster hanya akan berfungsi di kolom aman konteks, yaitu di HTTPS halaman atau pada http://localhost. Halaman HTTP non-localhost tidak mendukung agen sesuai origin klaster.

Kunci origin bukan fitur keamanan

Saat menggunakan cluster agen sesuai origin, Anda mengisolasi origin Anda dari akses sinkron dari halaman lintas origin situs yang sama, tindakan ini tidak memberikan perlindungan terhadap {i>header<i} yang berhubungan dengan keamanan seperti Cross-Origin-Resource-Policy dan Cross-Origin-Opener-Policy Secara khusus, serangan ini bukan perlindungan yang dapat diandalkan terhadap serangan {i>side channel<i} seperti Spectre.

Hal ini mungkin sedikit mengejutkan, karena kunci origin terkadang dapat menyebabkan origin Anda mendapatkannya sendiri proses terpisah, dan proses terpisah adalah pertahanan penting terhadap serangan {i>side-channel<i}. Tapi ingat, bahwa header Origin-Agent-Cluster hanya merupakan petunjuk dalam hal itu. Browser tidak kewajiban untuk memberikan proses terpisah kepada origin Anda, dan mungkin tidak melakukannya karena berbagai alasan:

  • Browser mungkin tidak menerapkan teknologi untuk melakukannya. Misalnya, saat ini Safari dan Firefox dapat menempatkan tab terpisah ke dalam prosesnya sendiri, namun belum dapat melakukannya untuk iframe.

  • Browser mungkin memutuskan bahwa tidak sepadan dengan overhead proses terpisah. Misalnya, di perangkat Android dengan memori rendah, atau di Android WebView, Chrome menggunakan proses sesedikit mungkin.

  • Browser mungkin ingin mematuhi permintaan yang ditunjukkan oleh header Origin-Agent-Cluster, tetapi cara itu bisa dilakukan dengan menggunakan teknologi isolasi yang berbeda dari proses. Misalnya, Chrome adalah mengeksplorasi menggunakan thread alih-alih proses untuk semacam isolasi kinerja ini.

  • Pengguna, atau kode yang berjalan di situs yang berbeda, mungkin sudah membuka halaman dengan kunci situs tentang asal Anda, sehingga akan menimbulkan jaminan konsistensi dan Header Origin-Agent-Cluster akan diabaikan sepenuhnya.

Oleh karena itu, sebaiknya jangan menganggap cluster agen sesuai origin sebagai fitur keamanan. Melainkan, ini adalah cara membantu browser memprioritaskan alokasi sumber daya, dengan menunjukkan bahwa akan mendapatkan manfaat dari sumber daya khusus (dan Anda bersedia menyerahkan fitur sebagai imbalannya).

Masukan

Tim Chrome ingin mengetahui pendapat Anda jika Anda menggunakan, atau mempertimbangkan untuk menggunakan, Origin-Agent-Cluster {i>header<i}. Minat dan dukungan publik Anda membantu kami memprioritaskan fitur dan menunjukkan vendor browser betapa pentingnya mereka. Tweet di @ChromiumDev dan biarkan Chrome DevRel mengetahui pemikiran dan pengalaman Anda.

Jika ada pertanyaan lain tentang spesifikasi atau detail cara kerja fitur tersebut, Anda dapat masalah di repositori GitHub Standar HTML. Dan jika Anda mengalami masalah apa pun dengan implementasi Chrome, Anda dapat melaporkan bug di new.crbug.com dengan kolom Components yang ditetapkan ke Internals>Sandbox>SiteIsolation.

Pelajari lebih lanjut

Untuk mempelajari lebih lanjut cluster agen sesuai origin, Anda dapat mempelajari detailnya di link berikut: