Resep kue pihak pertama

Pelajari cara menetapkan cookie pihak pertama untuk memastikan keamanan, kompatibilitas lintas browser, dan meminimalkan kemungkinan kerusakan setelah cookie pihak ketiga dihentikan secara bertahap.

Cookie dapat berasal dari pihak pertama atau pihak ketiga, bergantung pada konteks pengguna; bergantung pada situs yang dibuka pengguna saat itu. Jika domain dan skema cookie yang dapat didaftarkan cocok dengan halaman tingkat teratas saat ini, yaitu, yang ditampilkan di kolom URL browser, cookie tersebut dianggap berasal dari situs yang sama dengan halaman dan biasanya disebut sebagai cookie pihak pertama.

Cookie dari domain selain situs saat ini umumnya disebut sebagai cookie pihak ketiga.

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, cookie tersebut akan 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 ada upaya berkelanjutan untuk meningkatkan perilaku default, melalui Privacy Sandbox dan proposal lainnya seperti cookie terikat origin, ada banyak hal yang dapat Anda lakukan saat ini dengan menetapkan atribut tambahan pada cookie.

Konfigurasi berikut adalah praktik terbaik, yang 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;
Detail

Host adalah awalan opsional yang membuat beberapa atribut wajib dan melarang atribut lainnya:

  • Secure harus ada
  • Domain harus dihilangkan
  • Path 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 ini sebagai prioritas.

Atribut Domain menentukan host mana yang dapat menerima cookie. Jika dihilangkan, cookie akan dibatasi untuk 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 yang berbeda yang berjalan di subdomain yang berbeda, hal ini akan mengurangi risiko satu domain yang disusupi membuka pintu ke domain lainnya.

Path menunjukkan jalur yang harus ada di URL yang diminta agar browser dapat mengirim header Cookie. Menetapkan Path=/ berarti cookie dikirim ke semua jalur URL di domain tersebut. Kombinasi tidak ada 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 dengan example.com/b.

Atribut HttpOnly menambahkan beberapa perlindungan terhadap skrip pihak ketiga berbahaya di situs Anda dengan membatasi akses JavaScript. Hal ini memungkinkan cookie hanya dikirim dalam header permintaan dan membuatnya tidak tersedia untuk JavaScript menggunakan document.cookie.

Max-Age membatasi masa berlaku cookie karena sesi browser dapat berlangsung cukup lama dan Anda tidak ingin cookie yang sudah tidak berlaku tetap ada. Ini bagus untuk cookie jangka pendek, seperti sesi pengguna atau bahkan yang lebih singkat seperti token untuk pengiriman formulir. Max-Age ditentukan dalam detik dan dalam contoh sebelumnya ditetapkan ke 7776000 detik yang berarti 90 hari. Ini adalah setelan default yang wajar, yang dapat Anda ubah bergantung pada kasus penggunaan Anda.

SameSite=Lax membatasi cookie agar hanya dikirim pada permintaan situs yang sama. Artinya, saat permintaan cocok dengan konteks penjelajahan saat ini–situs tingkat teratas yang saat ini dikunjungi pengguna yang ditampilkan di kolom lokasinya. SameSite=Lax adalah setelan default di browser modern, tetapi sebaiknya tentukan setelan ini untuk kompatibilitas di seluruh browser yang mungkin memiliki setelan default yang berbeda. Dengan menandai cookie secara eksplisit sebagai khusus situs yang sama, Anda membatasinya ke konteks pihak pertama, dan Anda tidak perlu melakukan perubahan pada cookie tersebut saat cookie pihak ketiga dihapus.

Untuk mempelajari lebih lanjut berbagai atribut cookie, lihat dokumentasi Set-Cookie di MDN.

Jika Anda memiliki situs dengan subdomain dan ingin memiliki satu sesi di semua subdomain tersebut, awalan Host mungkin terlalu ketat. Misalnya, news.site dapat memiliki subdomain untuk topik, seperti finance.news.site dan sport.news.site, dan Anda ingin satu sesi pengguna di semua subdomain tersebut. 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;
Detail

Secure adalah awalan opsional yang menyatakan lebih sedikit persyaratan daripada Host: cookie hanya perlu ditetapkan dengan atribut Secure.

Meskipun cookie SameSite=Lax tidak dikirim pada 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 lain).

Anda dapat lebih membatasi akses cookie dan tidak mengizinkan pengirimannya bersama dengan permintaan yang dimulai dari situs pihak ketiga dengan SameSite=Strict. Hal ini berguna jika Anda memiliki cookie yang terkait dengan fungsi yang akan selalu berada di balik navigasi awal, seperti mengubah sandi atau melakukan pembelian.

Resep

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Strict;