Cookie SameSite Membatasi Penyertaan Cookie pada Request Lintas Situs

Session berbasis cookie bergantung pada perilaku browser yang praktis sekaligus sensitif terhadap keamanan: setelah sebuah cookie cocok dengan domain, path, aturan keamanan, dan ketentuan lain yang berlaku untuk suatu request, browser dapat menyertakannya tanpa kode aplikasi memasok kredensial secara eksplisit. Perilaku ambient ini memudahkan session, tetapi juga membuka jalur bagi request yang dimulai dari situs lain untuk tiba bersama status autentikasi.

Atribut cookie SameSite mempersempit jalur tersebut. Atribut ini memberi browser aturan mengenai boleh tidaknya cookie menyertai request ketika konteks situsnya berbeda dari situs cookie. Kontrol ini mengubah penyertaan kredensial pada batas browser; kontrol ini tidak dengan sendirinya membuat endpoint yang mengubah state menjadi operasi yang terotorisasi.

Dokumen lintas situs dapat memicu berbagai aktivitas jaringan: navigasi, pengiriman form, pemuatan gambar, serta request lain yang diizinkan platform browser. SameSite pada umumnya tidak mencegah request tersebut dikirim. Efek keamanannya lebih sempit: untuk cookie yang tunduk pada atribut ini, browser menentukan apakah cookie memenuhi syarat untuk menyertai request.

Perbedaan ini penting dalam analisis CSRF. Server tidak boleh menganggap sebuah request aman hanya karena cookie tidak disertakan. Endpoint tanpa autentikasi tetap dapat memiliki efek, dan aplikasi dapat memakai kredensial atau mekanisme otorisasi lain di luar cookie yang sedang dievaluasi.

Pertanyaan yang relevan pada batas ini adalah apakah state session ambient ikut menyeberang bersama request.

Strict memberikan perilaku lintas situs paling sempit

SameSite=Strict menginstruksikan browser agar mengirim cookie hanya dalam konteks same-site. Request yang dimulai dari situs berbeda tidak memperoleh cookie tersebut, termasuk navigasi top-level menuju situs target.

Batas ini kuat untuk cookie yang tidak perlu bertahan ketika pengguna masuk dari situs eksternal. Konsekuensinya juga dapat terlihat pada alur pengguna. Seseorang yang mengikuti link eksternal dapat mencapai aplikasi tanpa cookie Strict pada request awal, walaupun navigasi same-site berikutnya dapat menyertakannya.

Trade-off tersebut sering cocok untuk state yang sangat sensitif, tetapi deployment perlu memperhitungkan model navigasi nyata dan tidak memperlakukan Strict sebagai pengaturan universal untuk setiap cookie.

Lax mengizinkan kasus navigasi top-level yang terbatas

SameSite=Lax menahan cookie dari banyak subrequest lintas situs, tetapi mengizinkannya pada navigasi top-level yang memenuhi syarat dan menggunakan HTTP method yang aman. Perilaku ini mempertahankan alur umum saat pengguna mengikuti link sambil menahan cookie dari banyak request lintas situs yang dapat dipakai untuk memicu perubahan state.

Perbedaan method sangat penting. Semantik HTTP menggolongkan method seperti GET sebagai aman; aplikasi tidak semestinya menempatkan aksi yang mengubah state di balik method aman lalu bergantung pada kebijakan cookie. Jika request GET menjalankan operasi destruktif, Lax masih dapat mengizinkan session cookie pada navigasi top-level yang memenuhi syarat.

Kebijakan cookie dan disiplin HTTP method saling memperkuat. Salah satunya tidak memperbaiki penyalahgunaan yang lain.

SameSite=None menandai cookie untuk konteks lintas situs. Browser modern mewajibkan cookie dengan SameSite=None juga memiliki atribut Secure, sehingga cookie hanya dikirim melalui transport yang aman.

Mode ini diperlukan oleh sebagian alur embedded, federated, atau aplikasi lintas situs. Pada saat yang sama, mode ini menghilangkan pembatasan penyertaan lintas situs yang diberikan Strict atau Lax. Aplikasi yang memilih None sebaiknya memperlakukannya sebagai kebutuhan eksplisit dan mempertahankan kontrol integritas request yang independen ketika perubahan state bergantung pada autentikasi cookie.

Header yang umum berbentuk:

Set-Cookie: session=opaque-value; Path=/; Secure; HttpOnly; SameSite=Lax

Secure membatasi transport ke koneksi aman. HttpOnly mencegah akses melalui API script seperti document.cookie. SameSite mengatur penyertaan lintas situs. Ketiga atribut tersebut melindungi batas yang berbeda dan bukan pengganti satu sama lain.

Site dan origin adalah konsep keamanan yang berbeda

Pemrosesan SameSite memakai konsep site, bukan tuple origin yang lebih ketat pada same-origin policy. Dua URL dapat bersifat cross-origin tetapi tetap same-site.

Perbedaan ini relevan ketika subdomain saudara dikendalikan komponen dengan tingkat kepercayaan berbeda. Kebijakan cookie yang bergantung pada SameSite tidak menciptakan batas origin di antara setiap subdomain. Aplikasi tetap perlu membatasi domain cookie secara hati-hati dan tidak menganggap SameSite mengisolasi host yang tidak saling dipercaya tetapi masih berada dalam site yang sama.

Untuk validasi request, aplikasi juga dapat memeriksa sinyal terkait origin ketika protokol dan deployment membuatnya dapat diandalkan. Pemeriksaan tersebut menjawab pertanyaan berbeda dari SameSite: provenance request, bukan kelayakan penyertaan cookie.

SameSite adalah satu lapisan pertahanan CSRF

Untuk perubahan state yang diautentikasi dengan cookie, desain yang kuat biasanya menggabungkan beberapa properti: aksi tidak aman memakai HTTP method yang sesuai, otorisasi diperiksa pada setiap operasi, provenance request divalidasi ketika cocok, dan token anti-CSRF dipakai ketika model aplikasi membutuhkannya.

Token anti-CSRF dapat mengikat request yang mengubah state ke state aplikasi yang tidak dapat disediakan penyerang melalui pengiriman lintas situs sederhana. SameSite dapat mengurangi kelompok request lintas situs yang tiba bersama session cookie sejak awal. Kedua kontrol memiliki nilai defensif yang tumpang tindih, tetapi bekerja pada titik yang berbeda.

Pendekatan berlapis juga relevan untuk perbedaan browser, client lama, alur navigasi yang tidak biasa, serta fitur aplikasi yang memang membutuhkan cookie lintas situs.

Atribut Domain dan Path memengaruhi request mana yang memenuhi syarat untuk menerima cookie sebelum kebijakan SameSite dipertimbangkan. Domain yang terlalu luas dapat membuka cookie ke lebih banyak host daripada yang diperlukan. Host-only cookie, yang dibuat dengan tidak menyertakan Domain, dapat memberikan batas host lebih ketat ketika berbagi cookie antar-subdomain tidak diperlukan.

Prefix cookie dapat menambahkan batasan yang ditegakkan browser. Cookie __Host- harus menggunakan Secure, harus memakai Path=/, dan tidak boleh menyertakan atribut Domain pada user agent yang mendukungnya. Persyaratan tersebut membuat cookie terikat ke host dan mengurangi konfigurasi yang dapat memperluas scope.

Tidak satu pun properti ini menggantikan validasi session di sisi server. Semuanya membatasi lokasi tempat browser boleh membawa kredensial.

Deployment memerlukan kebijakan yang eksplisit di sisi browser

Session cookie sebaiknya memiliki nilai SameSite yang disengaja dan tidak bergantung pada default secara kebetulan. Nilai yang tepat mengikuti graf request aplikasi: apakah link eksternal harus mempertahankan session saat masuk, apakah alur embedded atau federated memerlukan state lintas situs, serta endpoint mana yang mengubah data terlindungi.

Pengujian perlu mencakup transisi browser yang penting bagi aplikasi: navigasi same-site, navigasi top-level dari situs eksternal, pengiriman form lintas situs, konteks embedded, dan redirect autentikasi. Hasil yang diharapkan perlu mencatat dua hal secara terpisah: apakah request terjadi dan apakah session cookie menyertainya.

Pemisahan tersebut menjaga klaim keamanan tetap presisi. SameSite dapat secara signifikan mengurangi penyertaan kredensial ambient melintasi batas site. Otorisasi sisi server, integritas request, scope cookie, dan semantik HTTP yang benar tetap menentukan apakah request yang tiba boleh mengubah state terlindungi.