Pelajari cara menyetel cookie pihak pertama untuk memastikan keamanan, kompatibilitas lintas browser, dan meminimalkan peluang kerusakan setelah cookie pihak ketiga tidak lagi digunakan.
Cookie dapat berupa pihak pertama atau pihak ketiga relatif terhadap konteks pengguna; bergantung pada situs yang sedang dibuka pengguna. Jika domain dan skema cookie yang dapat didaftarkan cocok dengan halaman tingkat atas saat ini, yaitu apa yang ditampilkan di kolom URL browser, cookie dianggap berasal dari situs yang sama dengan halaman tersebut dan umumnya disebut sebagai cookie pihak pertama.
Cookie dari domain selain situs saat ini umumnya disebut sebagai cookie pihak ketiga.
Resep kue pihak pertama yang enak
Jika cookie yang Anda tetapkan tidak digunakan di seluruh situs, misalnya, cookie tersebut digunakan untuk mengelola sesi di situs Anda dan tidak pernah digunakan di iframe lintas situs, maka cookie tersebut selalu digunakan dalam konteks pihak pertama.
Secara default, cookie dapat dibagikan di seluruh situs, diakses oleh JavaScript, dan dikirim melalui koneksi HTTP, yang memiliki beberapa risiko privasi dan keamanan. Meskipun masih ada upaya berkelanjutan untuk meningkatkan perilaku default, melalui Privacy Sandbox dan proposal lainnya seperti cookie yang terikat asal, ada banyak hal yang dapat Anda lakukan saat ini dengan menetapkan atribut tambahan pada cookie Anda.
Konfigurasi berikut adalah praktik terbaik guna memastikan keamanan dan kompatibilitas lintas browser untuk sebagian besar cookie pihak pertama. Hal ini akan memberi Anda fondasi yang aman, yang dapat Anda sesuaikan untuk membuka izin hanya jika diperlukan. Artikel ini juga membahas variasi resep untuk beberapa kasus penggunaan tertentu.
Resep
Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
Host
adalah awalan opsional yang membuat beberapa atribut menjadi wajib dan melarang atribut lainnya:
Secure
harus adaDomain
harus dihilangkanPath
harus/
Dengan menambahkan Host
, Anda dapat mengandalkan browser untuk memeriksa apakah atribut ini ditetapkan sesuai dengan aturan __Host
dan menolak cookie jika tidak.
Secure
melindungi cookie agar tidak dicuri di jaringan yang tidak aman karena hanya mengizinkan pengiriman cookie melalui koneksi HTTPS. Jika Anda belum sepenuhnya memigrasikan situs ke HTTPS, jadikan hal tersebut sebagai prioritas.
Atribut Domain
menentukan host yang dapat menerima cookie. Jika tidak diaktifkan, cookie akan dibatasi ke host dokumen saat ini, tidak termasuk subdomain: cookie untuk example.com
akan dikirim pada setiap permintaan ke example.com
, tetapi tidak pada permintaan ke images.example.com
. Jika Anda memiliki aplikasi berbeda yang berjalan di subdomain yang berbeda, hal ini mengurangi risiko satu domain yang disusupi dan memungkinkan pintu masuk ke domain lainnya.
Path
menunjukkan jalur yang harus ada di URL yang diminta agar browser dapat mengirim header Cookie
. Menyetel Path=/
berarti cookie dikirim ke semua jalur URL di domain tersebut. Kombinasi tanpa Domain
dan Path=/
membuat cookie terikat ke origin sedekat mungkin, sehingga berperilaku mirip dengan penyimpanan sisi klien lainnya seperti LocalStorage
—tidak ada kebingungan bahwa example.com/a
mungkin menerima nilai yang berbeda ke example.com/b
.
Atribut HttpOnly
menambahkan perlindungan terhadap skrip pihak ketiga yang berbahaya di situs Anda dengan membatasi akses JavaScript. Cookie ini memungkinkan cookie dikirim hanya di header permintaan dan membuatnya tidak tersedia untuk JavaScript yang menggunakan document.cookie
.
Max-Age
membatasi masa pakai cookie karena sesi browser dapat bertahan cukup lama dan Anda tidak ingin cookie usang terus ada. Metode ini cocok untuk cookie jangka pendek, seperti sesi pengguna atau bahkan sesi yang lebih singkat seperti token untuk pengiriman formulir. Max-Age
ditentukan dalam detik dan dalam contoh sebelumnya ditetapkan ke 7776000 detik, yaitu 90 hari. Ini adalah default yang wajar, yang dapat Anda ubah tergantung pada kasus penggunaan Anda.
SameSite=Lax
membatasi cookie agar hanya dikirim pada permintaan situs yang sama. Artinya, jika permintaan cocok dengan konteks penjelajahan saat ini–situs tingkat teratas yang sedang dikunjungi pengguna, yang ditampilkan di kolom lokasi mereka. SameSite=Lax
adalah versi default di browser modern, tetapi sebaiknya tentukan kompatibilitas di seluruh browser yang mungkin memiliki default berbeda. Dengan menandai cookie secara eksplisit sebagai situs yang sama saja, Anda membatasinya pada konteks pihak pertama, dan Anda tidak perlu membuat perubahan pada cookie tersebut saat cookie pihak ketiga hilang.
Untuk mempelajari lebih lanjut berbagai atribut cookie, lihat dokumentasi Set-Cookie
di MDN.
Resep cookie pihak pertama untuk situs dengan subdomain
Jika Anda memiliki situs dengan subdomain dan ingin memiliki satu sesi di semua subdomain, awalan Host
bisa terlalu membatasi. Misalnya news.site
dapat memiliki subdomain untuk topik, seperti finance.news.site
dan sport.news.site
dan Anda ingin satu sesi pengguna di semua topik. Dalam hal ini, gunakan awalan __Secure
, bukan __Host
, dan tentukan Domain
.
Resep
Set-Cookie:
__Secure-cookie-name=cookie-value;
Secure;
Domain=news.site;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
Secure
adalah awalan opsional yang menyatakan persyaratan yang lebih sedikit daripada Host
: atribut ini hanya mengharuskan cookie ditetapkan dengan atribut Secure
.
Membatasi akses cookie pihak pertama pada permintaan yang dilakukan dari situs pihak ketiga
Meskipun cookie SameSite=Lax
tidak dikirim di subpermintaan lintas situs (misalnya, saat memuat gambar atau iframe tersemat di situs pihak ketiga), cookie tersebut dikirim saat pengguna membuka situs asal (misalnya, saat mengikuti link dari situs yang berbeda).
Anda dapat lebih membatasi akses cookie dan melarang pengirimannya bersama dengan permintaan yang dimulai dari situs pihak ketiga dengan SameSite=Strict
. Ini berguna saat Anda memiliki cookie yang terkait dengan fungsi yang akan selalu berada di belakang navigasi awal, seperti mengubah sandi atau melakukan pembelian.
Resep
Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Strict;