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.

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 hari 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 (secara 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 tempat 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 beberapa tingkat pemisahan antara tab, tetapi iframe yang berbeda di dalam satu tab mungkin berbagi proses. Selain itu, karena proses disertai dengan beberapa overhead memori, proses tersebut menggunakan heuristik untuk menghindari pembuatan terlalu banyak: misalnya, Firefox memiliki batas proses yang dapat dikonfigurasi pengguna, dan Chrome memvariasikan perilakunya antara desktop (tempat memori lebih banyak) dan seluler (tempat memori langka).

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

Perilaku default ini disebut "cluster agen dengan kunci situs": yaitu, browser mengelompokkan halaman berdasarkan situs-nya. Header Origin-Agent-Cluster baru meminta browser untuk mengubah perilaku default ini untuk halaman tertentu, memasukkannya ke dalam cluster agen dengan kunci origin, sehingga hanya dikelompokkan dengan halaman lain yang memiliki origin 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:

  • Berperforma terbaik dengan resource 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 ke 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 tidak keberatan menonaktifkan fitur komunikasi lintas origin yang jarang digunakan yang telah 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 perlu 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 di-key origin, dan akan mengabaikan header di halaman berikutnya.

Alasan "memori" ini adalah untuk memastikan konsistensi kunci 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 mengabaikan header jika tidak konsisten dengan yang sebelumnya dilihat 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 yang melihat atau tidak melihat header), mengubahnya memerlukan pembukaan tab baru sepenuhnya, yang tidak terhubung dengan 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. Mencatat data ini ke platform analisis dapat memberikan pemeriksaan yang 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 prosesnya sendiri, dan proses terpisah adalah pertahanan penting terhadap serangan side-channel. Namun, ingat bahwa header Origin-Agent-Cluster hanyalah petunjuk dalam hal tersebut. Browser tidak terikat 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 mengikuti permintaan yang ditunjukkan 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, penting untuk tidak menganggap cluster agen dengan kunci asal sebagai fitur keamanan. Sebagai gantinya, 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 memiliki pertanyaan lain tentang spesifikasi, atau detail cara kerja fitur, Anda dapat mengajukan masalah di repositori GitHub HTML Standard. 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: