Tarayıcıda çerez okumak için document.cookie özelliğini okursunuz; size "ad=deger; ad2=deger2" biçiminde, noktalı virgülle ayrılmış bir metin döner. Çerez yazmak için aynı özelliğe "ad=deger; max-age=...; path=/; samesite=lax; secure" gibi bir metin atarsınız; her atama yalnızca bir çerezi oluşturur veya günceller. Sunucu tarafında ise çerezi Set-Cookie yanıt başlığı kurar ve HttpOnly işaretli çerezler JavaScript'e hiç görünmez.

Bu yazı çerezlerin teknik tarafını anlatır: document.cookie okuma ve yazma kuralları, Expires, Max-Age, Domain, Path, Secure, HttpOnly, SameSite ve Partitioned öznitelikleri, __Host- gibi önekler ve eş zamansız Cookie Store API. Çerez bandı, aydınlatma metni ve KVKK gibi hukuki konular çerez politikası ve çerez bandı yazısındadır. Dizinin genel haritası için Web API öğrenme rehberi sayfasına bakabilirsiniz.

Çerez nedir, neden hâlâ kullanılır?

Çerez nedir, neden hâlâ kullanılır?

Çerez, sunucunun tarayıcıya gönderdiği küçük bir veri parçasıdır. Tarayıcı onu saklar ve sonraki isteklerde aynı sunucuya Cookie başlığıyla geri yollar. HTTP kendi başına durumsuz olduğu için çerezler, ardışık isteklerin aynı tarayıcıdan geldiğini anlamanın temel yoludur. MDN üç ana kullanım sayar: oturum yönetimi (giriş durumu, sepet), kişiselleştirme (dil, tema) ve izleme.

Eskiden çerezler genel amaçlı istemci deposu olarak da kullanılıyordu. MDN artık bunun yerine localStorage ve sessionStorage ya da IndexedDB önerir. Gerekçesi açıktır: tarayıcılar alan adı başına çerez sayısını (genellikle yüzlerle ifade edilen bir sınır) ve çerez başına boyutu (genellikle 4 KB) kısıtlar; ayrıca her çerez her istekle gönderildiği için çok sayıda çerez özellikle yavaş mobil bağlantılarda performansı düşürür. Kısacası çerezi, sunucunun gerçekten görmesi gereken bilgi için kullanın.

Akış şöyle işler: sunucu yanıtına bir veya daha fazla Set-Cookie başlığı ekler, her başlık ayrı bir çerez kurar. Tarayıcı sonraki isteklerde bu çerezleri tek bir Cookie başlığında birleştirir:

http
HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=chocolate
Set-Cookie: tasty_cookie=strawberry

[sayfa içeriği]
http
GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=chocolate; tasty_cookie=strawberry

İstek ve yanıt mesajlarının genel yapısını HTTP istek ve yanıt yapısı yazısında bulabilirsiniz.

Çerez silme ve güncelleme

Çerezi silmek için ayrı bir yöntem yoktur. Aynı ad, aynı path ve varsa aynı domain ile çerezi yeniden yazar, Expires değerini geçmiş bir tarihe veya Max-Age değerini 0 ya da negatife çekersiniz. Yol veya alan adı farklıysa tarayıcı bunu başka bir çerez sayar ve asıl çerez yerinde kalır; "çerezi sildim ama hâlâ duruyor" sorununun en yaygın nedeni budur.

javascript
// MDN örneğindeki gibi geçmiş bir tarihle silme
document.cookie =
  "doSomethingOnlyOnce=; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=None; Secure";

// Max-Age ile silme; path kurulurken kullanılanla aynı olmalı
document.cookie = "tema=; max-age=0; path=/";

Sunucu tarafında aynı işlem Set-Cookie: id=a3fWa; Max-Age=0 ile yapılır. Bir kayıtlı alan adına ait tüm çerezleri temizlemek için Clear-Site-Data: "cookies" yanıt başlığı da kullanılabilir. Güncellemek için ise aynı adla yeni değeri göndermeniz yeterlidir. MDN ayrıca güvenlik açısından bir uyarı ekler: kullanıcı kimlik doğruladığında oturum çerezini, var olsa bile, yeniden üretip göndermek oturum sabitleme (session fixation) saldırılarına karşı korur.

Çerez önekleri: __Secure- ve __Host-

Sunucu, bir çerezin nereden ve hangi özniteliklerle kurulduğunu doğrulayamaz. Bir alt alan adındaki uygulama Domain ile tüm kardeş alt alan adlarına çerez yazabilir. Önekler bu durumu sınırlayan ek bir savunma katmanıdır. Tüm önekler çift alt çizgiyle başlar ve tireyle biter; tire önekin parçasıdır:

  • __Secure-: Çerez Secure özniteliğiyle ve HTTPS bir sayfa tarafından kurulmalıdır.
  • __Host-: Secure zorunludur, Domain belirtilemez ve Path=/ olmalıdır. Böylece çerez yalnızca kuran ana makineye gider ve hiçbir yolda üzerine yazılamaz.
  • __Http-: Secure ve HttpOnly zorunludur; yani yalnızca Set-Cookie ile kurulabilir, document.cookie veya Cookie Store API ile kurulamaz.
  • __Host-Http-: __Http- kurallarına ek olarak __Host- kısıtlamalarını da taşır.
http
Set-Cookie: __Host-oturum=7yjgj57e4n3d; Path=/; Secure; HttpOnly; SameSite=Lax

Tarayıcı kurallara uymayan önekli çerezleri reddeder. Sunucu tarafında çerez adını önekle birlikte kontrol etmeniz gerekir, çünkü tarayıcı Cookie başlığında öneki çıkarmaz. MDN'in uyarısıyla: önekleri desteklemeyen tarayıcılarda bu ek güvenceye güvenemezsiniz, çünkü orada önekli çerezler her zaman kabul edilir.

Sık yapılan hatalar

Sık yapılan hatalar: Birden fazla çerezi tek atamada yazmaya çalışmak, Silerken path veya domain'i unutmak, HttpOnly çerezi JavaScript'le okumayı denemek, SameSite=None verip...
  • Birden fazla çerezi tek atamada yazmaya çalışmak: MDN'e göre bir atama yalnızca tek bir çerezi kurar veya günceller; her çerez için ayrı atama yapın.
  • Silerken path veya domain'i unutmak: Çerez path=/ ile kurulduysa silerken de path=/ verin.
  • HttpOnly çerezi JavaScript'le okumayı denemek: Görünmemesi tasarım gereğidir; değeri gerekiyorsa sunucudan ayrı bir uç noktayla alın.
  • SameSite=None verip Secure'u unutmak: None değeri Secure olmadan kullanılamaz.
  • Path'i güvenlik sınırı sanmak: Aynı kökendeki her sayfa iframe hilesiyle başka yolun çerezini okuyabilir.
  • Büyük veriyi çereze koymak: Her istekte gönderilir ve boyut sınırına takılır; istemci verisi için Web Storage veya IndexedDB kullanın.

Sık Sorulan Sorular

document.cookie neden bazı çerezleri göstermiyor?

HttpOnly işaretli çerezler JavaScript'e hiç açılmaz; başka bir yol (Path) veya alan adı için kurulmuş çerezler de o sayfaya ait değildir. Ayrıca okunan metinde yalnızca ad ve değerler bulunur, öznitelikler bulunmaz.

Çerez boyutu ve sayısı için sınır nedir?

MDN'in HTTP çerez kılavuzuna göre tarayıcılar alan adı başına çerez sayısını (genellikle yüzlerle sınırlı) ve çerez başına boyutu (genellikle 4 KB) kısıtlar; kesin değerler tarayıcıya göre değişir.

Cookie Store API document.cookie'nin yerini alır mı?

Aynı çerezleri yönetir ama eş zamansızdır ve service worker'da da çalışır. MDN'in HTTP kılavuzu örneklerinde hâlâ document.cookie kullanılır, çünkü en yaygın desteklenen yol odur. Yeni API'yi kullanmadan önce desteği MDN uyumluluk tablosundan kontrol edin.

Oturum çerezi tarayıcı kapanınca kesin silinir mi?

Hayır. Oturumun ne zaman bittiğine tarayıcı karar verir ve oturum geri yükleme özelliği olan tarayıcılar oturum çerezlerini de geri getirebilir. Kritik oturumlar için sunucu tarafında bir zaman aşımı uygulayın.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Web API öğrenme rehberi · Çerez politikası ve KVKK · CSRF ve SameSite · localStorage ve sessionStorage · CORS rehberi · XSS ve CSP