Memuat resource lintas origin tanpa header CORP menggunakan COEP: tanpa kredensial

Resource lintas origin yang disalurkan oleh pihak ketiga sering kali tidak menyertakan header CORP yang memadai. Jika permintaan tersebut dapat diminta tanpa kredensial, kini Anda dapat mengaktifkan isolasi lintas asal dengan menandainya.

Kami telah mengirimkan nilai credentialless Cross-Origin Embedder Policy (COEP) yang baru yang memungkinkan browser memuat resource lintas origin yang tidak menggunakan Cross-Origin Resource Policy (CORP), dengan mengirimkan permintaan tanpa kredensial, seperti cookie. Hal ini membantu developer menerapkan isolasi lintas asal dengan lebih mudah.

Alasan kita memerlukan isolasi lintas asal

Beberapa web API meningkatkan risiko serangan side-channel seperti Spectre. Untuk mengurangi risiko tersebut, browser menawarkan lingkungan terisolasi berbasis keikutsertaan yang disebut isolasi lintas origin. Dengan status terisolasi lintas origin, halaman web dapat menggunakan fitur istimewa termasuk SharedArrayBuffer, performance.measureUserAgentSpecificMemory() dan timer presisi tinggi dengan resolusi yang lebih baik sekaligus mengisolasi origin dari orang lain, kecuali jika diikutsertakan.

Halaman harus mengirim dua header HTTP untuk mengaktifkan isolasi lintas asal:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

Dengan status yang diisolasi lintas origin, semua resource lintas origin harus disalurkan dengan CORS atau tetapkan header Cross-Origin-Resource-Policy untuk dimuat.

Tantangan dalam mengaktifkan isolasi lintas asal

Meskipun isolasi lintas asal menghadirkan keamanan yang lebih baik untuk halaman web dan kemampuan untuk mengaktifkan fitur canggih, men-deploy-nya bisa jadi sulit. Salah satu tantangan terbesar adalah persyaratan untuk mengaktifkan CORS atau CORP untuk semua resource lintas asal. Resource tanpa header tersebut tidak akan dimuat oleh browser di halaman yang diisolasi lintas origin.

Resource lintas asal ini biasanya disalurkan oleh pihak ketiga yang mungkin tidak mudah untuk menambahkan header yang diperlukan.

Namun, bagaimana jika kita tahu bahwa resource cukup aman untuk dimuat? Bahkan, satu-satunya resource yang berisiko adalah resource yang diminta dengan kredensial, karena resource tersebut berpotensi menyertakan informasi sensitif yang tidak dapat dimuat sendiri oleh penyerang. Artinya, resource yang dapat diminta tanpa kredensial akan tersedia untuk publik dan aman untuk dimuat.

credentialless siap membantu

Di sinilah COEP: credentialless berperan. credentialless adalah nilai baru untuk header Cross-Origin-Embedder-Policy. Serupa dengan require-corp, API ini dapat mengaktifkan isolasi lintas asal, tetapi tidak memerlukan header CORP:cross-origin untuk permintaan lintas origin tanpa nilai, melainkan dikirim tanpa kredensial (misalnya, cookie).

Anda dapat mengaktifkan isolasi lintas asal sebagai alternatif dengan dua header berikut:

Cross-Origin-Embedder-Policy: credentialless
Cross-Origin-Opener-Policy: same-origin

Artinya, server lintas origin yang diminta tidak akan dapat merespons dengan resource sensitif dan pemohon selalu dapat berasumsi bahwa responsnya hanya berisi informasi yang tersedia untuk publik.

Hal ini juga sesuai dengan rencana browser untuk menghentikan cookie pihak ketiga.

Demo

Anda dapat mencoba berbagai opsi header dalam demo ini: https://cross-origin-isolation.glitch.me

FAQ

Dapatkah saya mengirim permintaan berkredensial dalam lingkungan credentialless?

Tentu saja, dengan mengorbankan mode permintaan untuk mewajibkan pemeriksaan CORS pada respons. Untuk tag HTML seperti <audio>, <img>, <link>, <script>, dan <video>, cukup tambahkan crossorigin="use-credentials" secara eksplisit untuk memberi tahu browser agar mengirim permintaan berkredensial.

Misalnya, meskipun dokumen pada https://www.example.com memiliki header Cross-Origin-Embedder-Policy: credentialless, <img src="https://images.example.com/avatar.png" crossorigin="use-credentials"> akan mengirim permintaan berkredensial.

Untuk fetch() API, request.mode = 'cors' dapat digunakan.

Asalkan COEP: credentialless, bagaimana COEP: require-corp masih berguna untuk situs saya?

COEP: require-corp tidak mengharuskan Anda mengalihkan mode permintaan secara manual ke CORS jika cookie diperlukan untuk beberapa subresource lintas origin.

Apakah saya juga dapat memuat iframe lintas origin tanpa header khusus dalam lingkungan credentialless?

Tidak. Memuat iframe lintas origin dalam lingkungan credentialless masih memerlukan kondisi yang sama seperti require-corp. dokumen iframe harus ditayangkan dengan dua header:

  • Cross-Origin-Embedder-Policy: credentialless (atau require-corp)
  • Cross-Origin-Resource-Policy: cross-origin

Kabar baiknya adalah, ada pembahasan berkelanjutan tentang mengizinkan pemuatan iframe lintas origin tanpa header tersebut dengan memberikan iframe crossorigin="anonymous". Tindakan ini akan mengizinkan iframe lintas origin dimuat tanpa header, tetapi tanpa kredensial.

Apakah fitur ini akan digunakan oleh browser lain?

Apa yang akan hadir berikutnya

Ada dua update tambahan yang akan hadir untuk memitigasi tantangan lain terkait isolasi lintas origin:

Pengguna yang mendaftar ke uji coba origin Chrome untuk memperluas perubahan SharedArrayBuffer karena berbagai hambatan di atas mungkin ingin tahu kapan pengujian tersebut akan dihentikan. Awalnya kami mengumumkan bahwa update ini akan dihentikan pada Chrome 96, tetapi kami telah memutuskan untuk menundanya ke Chrome 106.

Referensi

Foto oleh Martin Adams di Unsplash