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 pembuatan skrip sinkron antara halaman lintas origin situs yang sama. Browser juga dapat menggunakan Origin-Agent-Cluster sebagai petunjuk bahwa origin Anda harus mendapatkan resource terpisahnya sendiri, seperti proses khusus.

Kompatibilitas browser

Saat ini header Origin-Agent-Cluster hanya diterapkan di Chrome 88 dan yang lebih baru. Prototipe ini dirancang dalam kolaborasi erat dengan perwakilan dari Mozilla Firefox yang telah menandainya sebagai prototipe yang layak, dan memiliki penerimaan awal yang positif dari perwakilan WebKit, mesin browser yang digunakan oleh Safari.

Namun, untuk saat ini, tidak ada masalah dengan men-deploy header Origin-Agent-Cluster ke semua pengguna Anda saat ini. Browser yang tidak memahaminya akan mengabaikannya. Selain itu, karena halaman dalam cluster agen dengan kunci origin sebenarnya dapat melakukan lebih sedikit hal daripada halaman dengan kunci 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 cara dokumen dan skrip dapat berinteraksi dengan resource dari origin lain. Misalnya, halaman yang dihosting di https://a.example berasal dari asal yang berbeda dengan halaman di https://b.example, atau halaman di https://sub.a.example.

Di balik layar, browser menggunakan pemisahan yang disediakan origin dengan cara yang berbeda. Dulu, meskipun asal yang terpisah tidak dapat mengakses data satu sama lain, asal tersebut masih akan berbagi resource seperti thread, proses, dan alokasi memori sistem operasi. Artinya, jika satu tab lambat, semua tab lainnya akan melambat. Atau jika satu tab menggunakan terlalu banyak memori, tab tersebut akan membuat seluruh browser error.

Saat ini browser lebih canggih, dan mencoba memisahkan berbagai origin ke dalam proses yang berbeda. Cara kerjanya bervariasi di setiap browser: sebagian besar browser memiliki tingkat pemisahan antara tab, tetapi iframe yang berbeda di dalam satu tab mungkin berbagi proses. Dan karena memiliki beberapa overhead memori, proses menggunakan heuristik untuk menghindari munculnya terlalu banyak: misalnya, Firefox memiliki batas proses yang dapat dikonfigurasi pengguna, dan Chrome memvariasikan perilakunya antara desktop (dengan memori lebih banyak) dan seluler (jika memorinya langka).

Heuristik ini tidak sempurna. Selain itu, instance tersebut memiliki keterbatasan penting: karena ada pengecualian pada kebijakan origin yang sama yang memungkinkan subdomain seperti https://sub.a.example dan https://a.example saling berkomunikasi, browser tidak dapat otomatis memisahkan subdomain satu sama lain.

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

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

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

Hal yang tidak dapat dilakukan halaman dengan kunci origin

Jika halaman Anda berada dalam cluster agen dengan kunci origin, Anda akan kehilangan beberapa kemampuan untuk berkomunikasi dengan halaman lintas origin situs yang sama 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 DOM satu sama lain secara sinkron, tetapi di cluster agen dengan kunci origin, fitur ini dinonaktifkan.

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

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

Kapan harus menggunakan cluster agen sesuai origin

Asal yang paling banyak mendapatkan manfaat dari header Origin-Agent-Cluster adalah asal yang:

  • Hasil terbaik dengan sumber daya khusus mereka sendiri jika memungkinkan. Contohnya mencakup game yang membutuhkan performa tinggi, situs konferensi video, atau aplikasi pembuatan multimedia.

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

  • Diharapkan untuk disematkan di halaman situs yang sama dengan origin yang berbeda, tetapi diketahui bahwa halaman tersebut membutuhkan banyak resource. Misalnya, jika https://customerservicewidget.example.com mengharapkan untuk menggunakan banyak resource untuk chat video, dan akan disematkan di berbagai origin di seluruh https://*.example.com, tim yang mengelola widget tersebut dapat menggunakan header Origin-Agent-Cluster untuk mencoba mengurangi dampak performanya pada penyematan.

Selain itu, Anda juga harus memastikan bahwa Anda bersedia menonaktifkan fitur komunikasi lintas origin yang jarang digunakan yang dibahas di atas, dan bahwa situs Anda menggunakan HTTPS.

Namun, pada akhirnya, ini hanyalah panduan. Apakah cluster agen sesuai origin akan membantu situs Anda atau tidak, pada akhirnya ditentukan dengan pengukuran. Secara khusus, Anda sebaiknya mengukur Data Vital Web, dan berpotensi penggunaan memori, untuk melihat dampak pemberian kunci origin. (Penggunaan memori khususnya merupakan potensi masalah, karena peningkatan jumlah proses yang sedang berjalan dapat menyebabkan lebih banyak overhead memori per proses.) Anda tidak boleh hanya meluncurkan kunci origin dan berharap yang terbaik.

Bagaimana hubungannya dengan isolasi lintas origin?

Kunci origin cluster agen melalui header Origin-Agent-Cluster terkait dengan, tetapi terpisah dari, isolasi lintas origin melalui header Cross-Origin-Opener-Policy dan Cross-Origin-Embedder-Policy.

Setiap situs yang mengisolasi dirinya sendiri lintas origin juga akan menonaktifkan fitur komunikasi lintas origin situs yang sama yang sama seperti saat menggunakan header Origin-Agent-Cluster. Namun, header Origin-Agent-Cluster masih dapat berguna di atas isolasi lintas origin, sebagai petunjuk tambahan ke browser untuk mengubah heuristik alokasi resource-nya. Jadi, Anda tetap harus mempertimbangkan untuk menerapkan header Origin-Agent-Cluster, dan mengukur hasilnya, bahkan di halaman yang sudah diisolasi lintas origin.

Cara menggunakan header Origin-Agent-Cluster

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

Origin-Agent-Cluster: ?1

Nilai ?1 adalah sintaksis header terstruktur untuk nilai true boolean.

Anda harus mengirimkan header ini di semua respons dari origin, bukan hanya beberapa halaman. Jika tidak, Anda bisa mendapatkan hasil yang tidak konsisten, dengan browser "mengingat" melihat permintaan kunci origin sehingga kunci origin tersebut digunakan bahkan di halaman yang tidak memintanya. Atau sebaliknya: jika halaman pertama yang dikunjungi pengguna tidak memiliki header, browser akan mengingat bahwa origin Anda tidak ingin dimasukkan dengan asal, dan akan mengabaikan header di halaman berikutnya.

Mengapa browser tidak selalu mengikuti header?

Alasan "memori" ini adalah untuk memastikan konsistensi penguncian untuk origin. Jika beberapa halaman di origin memiliki kunci origin, sementara halaman lainnya tidak, Anda dapat memiliki dua halaman dengan origin yang sama yang dimasukkan ke dalam cluster agen yang berbeda, sehingga tidak diizinkan untuk berkomunikasi satu sama lain. Hal ini akan sangat aneh, baik untuk developer web maupun untuk bagian internal browser. Jadi, spesifikasi untuk Origin-Agent-Cluster akan mengabaikan header jika tidak konsisten dengan yang terlihat sebelumnya untuk origin tertentu. Di Chrome, hal ini akan menghasilkan peringatan konsol.

Konsistensi ini dicakup untuk grup konteks penjelajahan, yang merupakan grup tab, jendela, atau iframe yang semuanya dapat saling menjangkau melalui mekanisme seperti window.opener, frames[0], atau window.parent. Artinya, setelah kunci origin atau situs origin diselesaikan (oleh browser baik melihat atau tidak melihat header), mengubahnya akan mengharuskan dibukanya tab yang sama sekali baru, dan tidak terhubung ke tab lama dengan cara apa pun.

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

Untuk memeriksa apakah header Origin-Agent-Cluster diterapkan, gunakan properti window.originAgentCluster JavaScript. Nilai ini akan menjadi true jika header (atau mekanisme lainnya, seperti isolasi lintas origin) menyebabkan kunci origin; false jika tidak; dan undefined di browser yang tidak menerapkan header Origin-Agent-Cluster. Logging data ini ke platform analisis dapat memberikan pemeriksaan berharga bahwa Anda telah mengonfigurasi server dengan benar.

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

Kunci asal bukan fitur keamanan

Meskipun menggunakan cluster agen sesuai origin akan mengisolasi origin Anda dari akses sinkron dari halaman lintas origin di situs yang sama, cluster tersebut tidak memberikan perlindungan header terkait keamanan seperti Cross-Origin-Resource-Policy dan Cross-Origin-Opener-Policy. Secara khusus, ini bukan perlindungan yang andal terhadap serangan side channel seperti Spectre.

Hal ini mungkin sedikit mengejutkan, karena kunci origin terkadang dapat menyebabkan origin Anda mendapatkan proses sendiri, dan proses terpisah merupakan pertahanan penting terhadap serangan side-channel. Namun, ingat bahwa header Origin-Agent-Cluster hanyalah petunjuk dalam hal tersebut. Browser tidak berkewajiban untuk memberikan proses terpisah ke 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, tetapi belum dapat melakukannya untuk iframe.

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

  • Browser mungkin ingin mematuhi permintaan yang ditunjukkan oleh header Origin-Agent-Cluster, tetapi dapat melakukannya menggunakan teknologi isolasi yang berbeda dengan proses. Misalnya, Chrome menjelajahi menggunakan thread, bukan proses, untuk isolasi performa semacam ini.

  • Pengguna, atau kode yang berjalan di situs lain, mungkin telah membuka halaman dengan kunci situs di origin Anda, sehingga jaminan konsistensi akan diterapkan dan header Origin-Agent-Cluster akan diabaikan sepenuhnya.

Oleh karena itu, sebaiknya jangan menganggap cluster agen sesuai origin sebagai fitur keamanan. Sebaliknya, ini adalah cara untuk membantu browser memprioritaskan alokasi resource, dengan mengisyaratkan bahwa origin Anda akan mendapatkan manfaat dari resource khusus (dan bahwa Anda bersedia melepaskan fitur tertentu sebagai gantinya).

Masukan

Tim Chrome ingin mendengar kabar dari Anda jika Anda menggunakan, atau mempertimbangkan untuk menggunakan, header Origin-Agent-Cluster. Minat dan dukungan publik Anda membantu kami memprioritaskan fitur dan menunjukkan kepada vendor browser lain betapa pentingnya fitur tersebut. Kirim tweet ke @ChromiumDev dan beri tahu Chrome DevRel pendapat dan pengalaman Anda.

Jika ada pertanyaan lain tentang spesifikasi, atau detail cara kerja fitur ini, Anda dapat melaporkan masalah di repositori GitHub Standar HTML. Selain itu, jika mengalami masalah terkait penerapan Chrome, Anda dapat melaporkan bug di new.crbug.com dengan kolom Komponen ditetapkan ke Internals>Sandbox>SiteIsolation.

Pelajari lebih lanjut

Untuk mempelajari lebih lanjut cluster agen dengan kunci origin, Anda dapat melihat detailnya di link berikut: