Set-Cookie
Penggunaan
Header Set-Cookie menginstruksikan klien untuk menyimpan sepasang nama-nilai beserta atribut opsional yang mengatur cakupan, masa hidup, dan properti keamanan cookie. Setiap header Set-Cookie menetapkan tepat satu cookie. Server yang mengirim beberapa cookie menyertakan beberapa header Set-Cookie dalam respons yang sama.
Sintaks umumnya berupa nama dan nilai cookie yang dipisahkan tanda sama dengan, diikuti atribut opsional yang dipisahkan titik koma.
Set-Cookie: <name>=<value>; <attributes>
Nama cookie menerima karakter US-ASCII kecuali karakter kontrol, spasi, tab, dan karakter pemisah ( ) < > @ , ; : \ ” / [ ] ? = { }. Nilai cookie menerima karakter US-ASCII kecuali karakter kontrol, spasi putih, tanda kutip ganda, koma, titik koma, dan garis miring terbalik. Nilai secara opsional dapat dibungkus tanda kutip ganda.
Browser memblokir JavaScript frontend dari membaca header Set-Cookie melalui Fetch API dan XMLHttpRequest. Header ini merupakan nama header respons terlarang dalam spesifikasi Fetch. Cookie dalam respons CORS diabaikan kecuali request menyertakan kredensial.
Prefiks cookie
Prefiks nama cookie memberlakukan batasan tambahan yang ditegakkan oleh browser, sehingga memberikan jaminan tentang di mana dan bagaimana sebuah cookie ditetapkan.
Prefiks __Secure- mensyaratkan atribut Secure dan origin HTTPS. Ini mencegah situs yang hanya menggunakan HTTP menetapkan cookie dengan nama yang sama dengan cookie aman.
Set-Cookie: __Secure-ID=abc; Secure; Path=/
Prefiks __Host- menambahkan persyaratan yang lebih ketat: atribut Secure, tanpa atribut Domain, dan Path disetel ke /. Ini mengikat cookie ke nama host origin yang persis, sehingga mencegah gangguan dari subdomain.
Set-Cookie: __Host-ID=abc; Secure; Path=/
Prefiks __Http- mensyaratkan atribut Secure sekaligus HttpOnly dan hanya dapat ditetapkan melalui header Set-Cookie, bukan melalui JavaScript.
Set-Cookie: __Http-ID=abc; Secure; HttpOnly
Prefiks __Host-Http- menggabungkan batasan __Host- dan __Http-, menghasilkan pengikatan cookie paling ketat yang tersedia.
Set-Cookie: __Host-Http-ID=abc; Secure; HttpOnly; Path=/
Catatan
Prefiks __Http- dan __Host-Http- berasal dari proposal prefiks cookie tersendiri, berbeda dari prefiks __Secure- dan __Host- yang sudah mapan dan ditegakkan secara luas oleh browser. Prefiks yang lebih baru ini masih berada pada tahap proposal.
Dampak SEO
Googlebot mengirim cookie ketika cookie ditetapkan oleh origin, tetapi tidak mempertahankan cookie antar sesi crawl yang terpisah. Cookie berukuran besar pada domain aset meningkatkan ukuran request selama rendering. Domain tanpa cookie untuk aset statis menghindari overhead ini. Hindari membatasi konten di balik logika yang bergantung pada cookie sehingga crawler tidak dapat melihat halaman tersebut.
Expires
Atribut Expires menetapkan tanggal kedaluwarsa absolut dalam format HTTP-date. Setelah tanggal tersebut, klien tidak lagi mengirim cookie itu. Jika dihilangkan bersama Max-Age, cookie menjadi cookie Session yang dihapus saat klien ditutup. Browser menyesuaikan penyimpangan jam menggunakan header Date dari respons.
Expires=Thu, 31 Dec 2026 23:59:59 GMT
Catatan
Browser membatasi nilai Expires maksimal 400 hari sejak cookie ditetapkan. Batas ini memungkinkan situs yang dikunjungi kira-kira setahun sekali tetap mempertahankan cookie sekaligus mencegah persistensi tanpa batas waktu.
Max-Age
Atribut Max-Age menetapkan masa hidup cookie dalam detik terhitung sejak klien menerima respons. Nilai nol atau negatif membuat cookie langsung kedaluwarsa. Ketika Expires dan Max-Age sama-sama hadir, Max-Age yang diutamakan.
Max-Age=2592000
Cookie Store API di JavaScript juga mengekspos opsi maxAge melalui metode cookieStore.set(), mencerminkan atribut ini untuk pengelolaan cookie secara programatik. API tersebut tidak mengizinkan penyetelan expires dan maxAge sekaligus pada cookie yang sama.
Catatan
Browser membatasi nilai Max-Age maksimal 400 hari (34.560.000 detik), sesuai dengan batas Expires.
Domain
Atribut Domain menentukan host mana saja yang menerima cookie. Ketika disetel, cookie tersedia untuk domain yang ditentukan beserta seluruh subdomainnya. Ketika dihilangkan, cookie secara bawaan terbatas pada host asal yang persis, tidak termasuk subdomain (cookie khusus host). Hanya domain saat ini atau domain induk dari host saat ini yang valid. Titik di awal diabaikan.
Domain=example.re
Path
Atribut Path membatasi pengiriman cookie hanya pada request yang cocok dengan awalan jalur URL yang ditentukan. Garis miring / memisahkan segmen jalur. Cookie dengan Path=/docs cocok dengan /docs, /docs/, /docs/Web/HTTP tetapi tidak dengan / atau /docsets.
Path=/
Catatan
Atribut Path bukan mekanisme keamanan. Skrip apa pun pada origin yang sama memiliki akses ke semua cookie terlepas dari pembatasan jalur.
Secure
Atribut Secure membatasi cookie hanya pada koneksi HTTPS. Browser tidak pernah mengirim cookie aman melalui HTTP yang tidak terenkripsi. Origin yang tidak aman tidak dapat menetapkan cookie dengan atribut ini. Localhost dikecualikan dari persyaratan HTTPS selama pengembangan.
HttpOnly
Atribut HttpOnly memblokir akses JavaScript ke cookie melalui document.cookie, Cookie Store API, dan antarmuka DOM lainnya. Cookie tetap dikirim bersama request HTTP yang diinisiasi JavaScript melalui fetch() dan XMLHttpRequest. Atribut ini meredam serangan cross-site scripting (XSS) yang berupaya mencuri nilai cookie.
SameSite
Atribut SameSite mengatur apakah browser mengirim cookie bersama request lintas situs. Terdapat tiga nilai yang didefinisikan.
Strict hanya mengirim cookie bersama request same-site. Navigasi lintas situs, termasuk mengeklik tautan dari situs eksternal, tidak menyertakan cookie tersebut.
Lax mengirim cookie bersama request same-site dan navigasi tingkat atas lintas situs yang mengubah bilah alamat. Request subsumber daya, panggilan fetch(), dan navigasi iframe tidak menyertakan cookie tersebut. Sebagian besar browser menggunakan Lax sebagai bawaan ketika atribut SameSite tidak ditentukan.
None mengirim cookie bersama semua request, termasuk request lintas situs. Atribut Secure harus disertakan saat menggunakan SameSite=None. Cookie dari skema yang berbeda (HTTP dibanding HTTPS) diperlakukan sebagai lintas situs.
SameSite=Lax
Partitioned
Atribut Partitioned menyimpan cookie dalam penyimpanan terpartisi yang dikunci oleh origin cookie sekaligus situs tingkat atas. Cookie terpartisi yang ditetapkan oleh cdn.example.re yang disematkan pada shop.example.org hanya dikirim ketika cdn.example.re disematkan pada shop.example.org, bukan ketika disematkan pada situs lain.
Atribut ini merupakan bagian dari proposal Cookies Having Independent Partitioned State (CHIPS). Atribut ini memungkinkan kasus penggunaan cookie lintas situs yang sah seperti widget tersemat, penyeimbangan beban CDN, dan penyedia CMS headless tanpa memberikan kemampuan pelacakan lintas situs sepenuhnya.
Atribut Secure harus disertakan. Prefiks __Host- disarankan untuk mengikat cookie ke origin yang persis.
Set-Cookie: __Host-sess=abc; SameSite=None; Secure; Path=/; Partitioned
Didukung oleh browser berbasis Chromium dan Firefox. Safari mempartisi cookie pihak ketiga secara bawaan melalui mekanisme tersendiri dan tidak menggunakan atribut ini.
Contoh
Cookie sesi tanpa atribut kedaluwarsa. Cookie dihapus ketika sesi klien berakhir.
Set-Cookie: sessionId=38afes7a8
Cookie persisten dengan masa hidup 30 hari. Atribut Max-Age menetapkan waktu kedaluwarsa relatif terhadap waktu saat ini.
Set-Cookie: id=a3fWa; Max-Age=2592000
Cookie dengan atribut keamanan yang cocok untuk token autentikasi. Atribut HttpOnly memblokir akses JavaScript, Secure membatasi ke HTTPS, dan SameSite=Strict mencegah pengiriman lintas situs.
Set-Cookie: __Host-token=eyJhbGci; Secure; HttpOnly; SameSite=Strict; Path=/
Cookie pihak ketiga terpartisi untuk sematan lintas situs. Atribut Partitioned mengisolasi cookie ke situs tingkat atas tertentu tempat sematan tersebut muncul.
Set-Cookie: __Host-embed=34d8g; SameSite=None; Secure; Path=/; Partitioned
Beberapa cookie ditetapkan dalam satu respons. Setiap cookie memerlukan header Set-Cookie tersendiri.
Set-Cookie: theme=dark; Path=/; Max-Age=31536000
Set-Cookie: __Host-sid=x8Kp2; Secure; HttpOnly; SameSite=Lax; Path=/
Pemecahan masalah
Cookie yang gagal bertahan atau tiba pada request yang keliru sering kali berakar pada atribut yang tidak cocok atau kebijakan penegakan browser.
Cookie tidak tersimpan karena flag Secure pada HTTP. Atribut Secure memerlukan koneksi HTTPS. Cookie yang ditetapkan dengan Secure melalui HTTP biasa dibuang secara diam-diam. Periksa protokol pada bilah alamat browser dan inspeksi header Set-Cookie di tab Network pada DevTools. Localhost dikecualikan dari pembatasan ini selama pengembangan.
Cookie tidak dikirim pada request lintas situs (bawaan SameSite). Browser modern menggunakan SameSite=Lax sebagai bawaan ketika atribut SameSite tidak ada. Subrequest lintas situs seperti panggilan fetch(), iframe, dan pemuatan gambar tidak menyertakan cookie tersebut. Tambahkan SameSite=None; Secure ketika cookie harus melintasi situs, atau susun ulang alurnya untuk menghindari ketergantungan lintas situs.
Ketidakcocokan jalur cookie. Cookie yang ditetapkan dengan Path=/app tidak dikirim ke request yang menuju /api atau /. Pastikan nilai Path cocok dengan jalur request yang membutuhkan cookie tersebut. Menyetel Path=/ membuat cookie tersedia di seluruh situs.
Masalah cakupan atribut Domain. Cookie yang ditetapkan dengan Domain=sub.example.re tidak dikirim ke example.re. Menghilangkan atribut Domain menciptakan cookie khusus host yang terbatas pada nama host yang persis. Titik di awal nilai diabaikan oleh browser. Gunakan panel Application > Cookies pada DevTools untuk memeriksa domain efektif setiap cookie yang tersimpan.
Cookie pihak ketiga diblokir oleh fitur privasi browser. Safari memblokir cookie pihak ketiga secara bawaan melalui Intelligent Tracking Prevention. Enhanced Tracking Protection pada Firefox dan Privacy Sandbox pada Chrome menerapkan pembatasan serupa. Atribut Partitioned (CHIPS) menyediakan jalur berbasis standar untuk kasus penggunaan cookie lintas situs yang sah. Uji di beberapa browser untuk memastikan perilakunya.
Cookie melebihi ukuran maksimum. Browser memberlakukan batas sekitar 4096 byte per cookie (nama, nilai, dan atribut digabungkan). Cookie yang terlalu besar dibuang secara diam-diam. Pindahkan payload besar ke sesi sisi server dan simpan hanya satu pengenal sesi di dalam cookie.
Men-debug cookie yang tersimpan. Buka DevTools > Application > Cookies untuk memeriksa semua cookie pada situs saat ini, termasuk atribut, kedaluwarsa, dan ukuran. API document.cookie tidak mengekspos cookie HttpOnly. Gunakan curl -v untuk melihat header Set-Cookie mentah yang dikembalikan server.