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.

Denicola Domenic
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 tersendiri yang terpisah, seperti proses khusus.

Kompatibilitas browser

Saat ini header Origin-Agent-Cluster hanya diterapkan di Chrome 88 dan seterusnya. Browser ini dirancang dengan kolaborasi erat dengan perwakilan dari Mozilla Firefox yang telah menandainya sebagai layak membuat prototipe, dan memiliki penerimaan yang 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 Anda hari ini. Browser yang tidak memahaminya akan mengabaikannya. Selain itu, karena halaman di cluster agen dengan kunci origin sebenarnya dapat melakukan lebih sedikit hal daripada halaman yang dikunci oleh situs (default), tidak ada masalah interoperabilitas yang perlu dikhawatirkan.

Alasan browser tidak dapat otomatis memisahkan asal situs yang sama

Web dibuat berdasarkan kebijakan origin yang sama, yaitu fitur keamanan yang membatasi cara dokumen dan skrip dapat berinteraksi dengan resource dari origin lain. Misalnya, halaman yang dihosting di https://a.example memiliki asal yang berbeda dengan yang ada di https://b.example, atau yang ada di https://sub.a.example.

Di balik layar, browser menggunakan pemisahan yang disediakan origin dengan cara yang berbeda. Dahulu, meskipun sumber yang terpisah tidak dapat mengakses data satu sama lain, keduanya tetap akan berbagi resource seperti thread sistem operasi, proses, dan alokasi memori. Artinya, jika satu tab lambat, semua tab lainnya akan lambat. Atau jika satu tab menggunakan terlalu banyak memori, seluruh {i>tab<i} akan error.

Saat ini, browser lebih canggih, dan mencoba memisahkan asal yang berbeda ke dalam proses yang berbeda. Cara kerjanya berbeda-beda untuk setiap browser: sebagian besar browser memiliki beberapa tingkat pemisahan antartab, tetapi iframe yang berbeda di dalam satu tab dapat berbagi proses. Karena proses memiliki beberapa overhead memori, proses menggunakan heuristik untuk menghindari terlalu banyak kemunculan: misalnya, Firefox memiliki batas proses yang dapat dikonfigurasi pengguna, dan Chrome bervariasi perilakunya antara desktop (jika memori lebih banyak) dan seluler (jika jumlahnya langka).

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

Perilaku default ini disebut "cluster agen dengan kunci situs": yaitu, browser mengelompokkan halaman berdasarkan situsnya. Header Origin-Agent-Cluster baru meminta browser untuk mengubah perilaku default ini untuk halaman tertentu, memasukkannya ke dalam cluster agen dengan kunci origin, sehingga dikelompokkan hanya 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 kepada cluster agen sesuai origin baru ini, yang tidak digabungkan dengan origin lain. Misalnya, halaman tersebut bisa mendapatkan prosesnya sendiri, atau dijadwalkan pada thread terpisah. Dengan menambahkan header Origin-Agent-Cluster ke halaman, Anda menunjukkan ke browser bahwa halaman tersebut akan mendapat manfaat dari resource khusus tersebut.

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

Yang tidak dapat dilakukan oleh halaman dengan kunci origin

Jika halaman Anda berada di cluster agen dengan kunci origin, Anda tidak dapat lagi 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 mengakses DOM masing-masing secara sinkron, tetapi dalam 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 cluster agen sesuai origin digunakan

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

  • Melakukan performa 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 membutuhkan banyak resource dan merupakan origin yang berbeda, tetapi situs yang sama. Misalnya, jika https://mail.example.com menyematkan iframe https://chat.example.com, penguncian origin https://mail.example.com/ memastikan bahwa kode yang ditulis oleh tim chat tidak dapat mengganggu kode yang ditulis oleh tim email secara tidak sengaja, dan dapat menunjukkan ke browser untuk memberikan proses terpisah guna menjadwalkannya secara independen dan saling mengurangi dampaknya terhadap performanya.

  • Anda harus disematkan di halaman situs yang sama dengan origin yang berbeda, tetapi biasanya akan memerlukan banyak resource. Misalnya, jika https://customerservicewidget.example.com ingin menggunakan banyak resource untuk video chat, 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 terhadap penyemat.

Selain itu, Anda juga perlu memastikan bahwa Anda dapat 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 cara terbaik melalui pengukuran. Secara khusus, Anda perlu mengukur Data Web, dan kemungkinan penggunaan memori, untuk melihat dampak dari kunci origin. (Penggunaan memori secara khusus dapat menjadi perhatian utama, karena peningkatan jumlah proses yang sedang dimainkan dapat menyebabkan overhead memori per proses yang lebih banyak.) Anda tidak boleh hanya sekadar meluncurkan kunci asal dan berharap yang terbaik.

Bagaimana hal ini terkait dengan isolasi lintas asal?

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 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 setelah isolasi lintas origin, sebagai petunjuk tambahan bagi browser untuk mengubah heuristik alokasi resource-nya. Jadi, sebaiknya Anda tetap 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 untuk mengirimkan header respons HTTP berikut:

Origin-Agent-Cluster: ?1

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

Penting untuk mengirim header ini di semua respons dari origin Anda, bukan hanya beberapa halaman. Jika tidak, Anda bisa mendapatkan hasil yang tidak konsisten, yaitu browser "mengingat" melihat permintaan kunci origin sehingga browser menyertakan kunci origin 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 menggunakan kunci origin, dan akan mengabaikan header pada halaman berikutnya.

Mengapa browser tidak selalu dapat mematuhi header?

Alasan "memori" ini adalah untuk memastikan konsistensi keying untuk origin. Jika beberapa halaman pada origin menggunakan kunci origin, sementara yang lain tidak, Anda mungkin memiliki dua halaman origin yang sama yang dimasukkan ke dalam cluster agen yang berbeda, sehingga tidak diizinkan untuk berkomunikasi satu sama lain. Hal ini akan menjadi hal yang sangat aneh, baik bagi developer web maupun internal browser. Jadi, spesifikasi untuk Origin-Agent-Cluster akan mengabaikan header jika tidak konsisten dengan yang sebelumnya dilihat untuk asal tertentu. Di Chrome, hal ini akan mengakibatkan peringatan konsol.

Konsistensi ini mencakup grup konteks penjelajahan, yang merupakan grup tab, jendela, atau iframe yang semuanya dapat saling menjangkau satu sama lain melalui mekanisme seperti window.opener, frames[0], atau window.parent. Artinya, setelah origin atau kunci situs origin diselesaikan (oleh browser melihat, atau tidak melihat, header), mengubahnya memerlukan pembukaan tab yang benar-benar baru, 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 Anda, pemuatan 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. Ini akan menjadi true jika header (atau mekanisme lain, seperti isolasi lintas origin) menyebabkan kunci origin; false jika tidak; dan undefined di browser yang tidak mengimplementasikan header Origin-Agent-Cluster. Mencatat 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 dengan kunci origin.

Kunci origin bukan merupakan fitur keamanan

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

Hal ini mungkin sedikit mengejutkan, karena kunci origin terkadang dapat menyebabkan origin mendapatkan prosesnya sendiri, dan proses terpisah merupakan pertahanan penting terhadap serangan side-channel. Namun, perlu diingat bahwa header Origin-Agent-Cluster hanyalah petunjuk terkait hal tersebut. Browser tidak berkewajiban untuk memberikan proses terpisah pada origin, 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.

  • {i>Browser<i} mungkin memutuskan tidak perlunya {i>overhead <i}dari proses yang terpisah. Misalnya, pada perangkat Android bermemori rendah, atau di Android WebView, Chrome menggunakan proses sesedikit mungkin.

  • Browser mungkin perlu 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 yang sesuai dengan situs di origin Anda, yang menyebabkan jaminan konsistensi aktif dan header Origin-Agent-Cluster akan diabaikan sepenuhnya.

Karena alasan ini, penting untuk tidak 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 menyerahkan fitur tertentu sebagai gantinya).

Masukan

Tim Chrome ingin mengetahui jika Anda menggunakan, atau mempertimbangkan untuk menggunakan, header Origin-Agent-Cluster. Kepentingan dan dukungan publik Anda membantu kami memprioritaskan fitur dan menunjukkan kepada vendor browser lain betapa pentingnya fitur tersebut. Tweet di @ChromiumDev dan berikan Chrome DevRel menyampaikan pendapat dan pengalaman Anda.

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

Selengkapnya

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