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. Layanan ini dirancang melalui kerja sama erat dengan perwakilan dari Mozilla Firefox yang telah menandainya sebagai layak untuk dibuat, dan memiliki penerimaan positif awal dari perwakilan WebKit, mesin browser yang digunakan oleh Safari.

Namun, sementara itu, tidak ada masalah dengan men-deploy header Origin-Agent-Cluster ke semua pengguna saat ini. Browser yang tidak memahaminya akan mengabaikannya. Selain itu, karena halaman di cluster agen sesuai origin sebenarnya dapat melakukan lebih sedikit hal daripada halaman yang menyertakan 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 berinteraksi dengan resource dari origin lain. Misalnya, halaman yang dihosting di https://a.example memiliki asal yang berbeda dengan 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 masa lalu, meskipun origin yang terpisah tidak akan dapat mengakses data satu sama lain, origin tersebut masih dapat berbagi resource seperti thread sistem operasi, proses, dan alokasi memori. Artinya jika satu tab lambat, maka semua tab lainnya juga akan diperlambat. Atau jika satu tab menggunakan terlalu banyak memori, maka itu akan membuat seluruh browser {i>crash<i}.

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

Heuristik ini tidak sempurna. Selain itu, subdomain 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 sesuai situs": yaitu, browser mengelompokkan halaman berdasarkan situsnya. 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 memberi cluster agen baru sesuai origin ini sendiri, yang tidak digabungkan dengan resource dari origin lainnya. Misalnya, halaman tersebut bisa 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.

Yang tidak dapat dilakukan halaman dengan kunci origin

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

  • Anda tidak dapat lagi menetapkan document.domain. Ini adalah fitur lama yang biasanya mengizinkan halaman lintas origin situs yang sama untuk mengakses DOM satu sama lain secara sinkron, tetapi di cluster agen sesuai origin, fitur ini dinonaktifkan.

  • Anda tidak dapat lagi mengirim objek WebAssembly.Module ke halaman origin lintas situs yang sama 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

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

  • Melakukan performa terbaik dengan sumber daya khusus mereka sendiri jika memungkinkan. Contohnya mencakup game 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 iframe https://chat.example.com, https://mail.example.com/ pembuatan kunci origin akan memastikan kode yang ditulis oleh tim chat tidak dapat secara tidak sengaja mengganggu kode yang ditulis oleh tim email, dan dapat mengisyaratkan browser untuk memberikan proses terpisah kepada mereka untuk menjadwalkannya secara terpisah dan mengurangi dampak performanya satu sama lain.

  • Berharap untuk disematkan di halaman situs yang sama dengan origin yang berbeda, tetapi ketahuilah bahwa aplikasi itu menggunakan resource yang intensif. Misalnya, jika https://customerservicewidget.example.com ingin menggunakan banyak resource untuk video chat, dan akan disematkan di berbagai asal di seluruh https://*.example.com, tim yang mempertahankan widget tersebut dapat menggunakan header Origin-Agent-Cluster untuk mencoba mengurangi dampak performanya pada sematan.

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, semua ini hanyalah panduan. Apakah cluster agen sesuai origin akan membantu situs Anda atau tidak pada akhirnya ditentukan melalui pengukuran. Secara khusus, Anda perlu mengukur Web Vitals, dan kemungkinan penggunaan memori, untuk melihat dampak dari penetapan origin. (Penggunaan memori khususnya menjadi perhatian potensial, karena peningkatan jumlah proses yang berjalan dapat menyebabkan lebih banyak overhead memori per proses.) Anda tidak boleh hanya menerapkan kunci origin dan mengharapkan yang terbaik.

Bagaimana kaitannya dengan isolasi lintas asal?

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

Setiap situs yang membuatnya sendiri diisolasi lintas origin juga akan menonaktifkan fitur komunikasi lintas origin situs yang sama seperti saat menggunakan header Origin-Agent-Cluster. Namun, header Origin-Agent-Cluster masih dapat berguna selain isolasi lintas asal, sebagai petunjuk tambahan bagi browser untuk mengubah heuristik alokasi resource-nya. Jadi, Anda tetap harus mempertimbangkan untuk 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, konfigurasikan server web Anda untuk mengirim header respons HTTP berikut:

Origin-Agent-Cluster: ?1

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

Header ini harus dikirim pada semua respons dari origin Anda, bukan hanya di beberapa halaman. Jika tidak, Anda bisa mendapatkan hasil yang tidak konsisten, saat browser "mengingat" melihat permintaan kunci origin dan juga kunci origin meskipun 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 menggunakan kunci origin, sementara yang lainnya tidak, Anda mungkin memiliki dua halaman origin yang sama yang dimasukkan ke dalam cluster agen yang berbeda, sehingga tidak diizinkan untuk saling berkomunikasi. Hal ini akan sangat aneh, baik bagi developer web maupun untuk bagian dalam browser. Jadi, spesifikasi untuk Origin-Agent-Cluster akan mengabaikan header jika tidak konsisten dengan yang terlihat sebelumnya 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 saling terhubung 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, halaman ini tidak akan dapat dimuat ulang. Anda harus menutup tab ini dan membuka tab baru.

Untuk memeriksa apakah header Origin-Agent-Cluster diterapkan, gunakan properti window.originAgentCluster JavaScript. Ini akan menjadi true jika header (atau mekanisme lainnya, seperti isolasi lintas origin) menyebabkan penetapan origin; false jika tidak; dan undefined di browser yang tidak mengimplementasikan 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 pada konteks aman, yaitu di halaman HTTPS atau http://localhost. Halaman HTTP non-localhost tidak mendukung cluster agen sesuai asal.

Kunci origin bukan fitur keamanan

Meskipun penggunaan cluster agen sesuai origin mengisolasi origin Anda dari akses sinkron dari halaman lintas origin situs yang sama, cluster ini tidak memberikan perlindungan untuk header terkait keamanan seperti Cross-Origin-Resource-Policy dan Cross-Origin-Opener-Policy. Secara khusus, ini bukan perlindungan yang dapat diandalkan terhadap serangan saluran samping 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, perlu diingat bahwa header Origin-Agent-Cluster hanyalah petunjuk dalam hal itu. 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 masing-masing, tetapi belum dapat melakukannya untuk iframe.

  • Browser mungkin memutuskan bahwa tidak sepadan dengan overhead proses terpisah. Misalnya, pada 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 dapat melakukannya menggunakan teknologi isolasi yang berbeda dengan proses. Misalnya, Chrome menjelajahi menggunakan thread, bukan proses untuk pemisahan performa semacam ini.

  • Pengguna, atau kode yang berjalan di situs lain, mungkin sudah membuka halaman dengan kunci situs di asal Anda, sehingga menyebabkan jaminan konsistensi aktif dan header Origin-Agent-Cluster 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 menunjukkan bahwa origin Anda akan mendapatkan manfaat dari resource khusus (dan Anda bersedia melepaskan fitur tertentu sebagai imbalannya).

Masukan

Tim Chrome ingin mengetahui pendapat 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. Tweet di @ChromiumDev dan beri tahu Chrome DevRel mengetahui 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. Jika mengalami masalah pada implementasi Chrome, Anda dapat melaporkan bug di new.crbug.com dengan kolom Komponen yang ditetapkan ke Internals>Sandbox>SiteIsolation.

Pelajari lebih lanjut

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