İletişim

HttpOnly Çerez Nedir?

Kısa tanım

HttpOnly çerez, sunucunun Set-Cookie başlığında HttpOnly özniteliğiyle işaretlediği ve tarayıcının sayfadaki JavaScript koduna göstermediği çerezdir. document.cookie ile okunamaz, ancak ilgili alan adına giden HTTP isteklerine normal şekilde eklenir. Oturum çerezlerinde kullanıldığında, bir XSS açığı oluşsa bile oturum kimliğinin betikle okunup başka bir yere taşınmasını engeller.

Diğer adları: HttpOnly, HttpOnly cookie, HttpOnly bayrağı, HttpOnly flag

HttpOnly işaretli çerezin HTTP isteklerinde gönderildiğini ancak JavaScript tarafından okunamadığını ve XSS ile çalınamadığını gösteren şema

Çerezi tarayıcıda tutup betikten saklamak

Bir çerez normalde iki kanaldan erişilebilir: tarayıcının HTTP istekleriyle sunucuya gönderdiği Cookie başlığı ve sayfadaki JavaScript'in kullandığı document.cookie. Oturum kimliği taşıyan bir çerez için ikinci kanala çoğu zaman hiç ihtiyaç yoktur; kimliği sunucu okur, sayfanın kodunun bilmesi gerekmez. HttpOnly özniteliği bu kanalı kapatır: çerez isteklerle gitmeye devam eder, ama betikler onu göremez.

Set-Cookie: __Host-oturum=7c2e9f0b41; Path=/; Secure; HttpOnly; SameSite=Lax

Bu satırdaki her parça farklı bir işe yarar: Secure çerezin yalnızca HTTPS üzerinden gönderilmesini, HttpOnly betiklerden gizlenmesini, SameSite siteler arası isteklere eklenmesinin sınırlanmasını sağlar. __Host- öneki ise tarayıcıya ek kurallar dayatır: çerez Secure olmalı, Domain özniteliği taşımamalı ve Path=/ ile ayarlanmalıdır; böylece yalnızca onu ayarlayan host'a gider, alt alan adlarıyla paylaşılmaz.

XSS karşısında ne kazandırır?

Bir sayfada XSS açığı varsa, saldırganın betiği o sayfanın içinde kullanıcının yetkisiyle çalışır. Oturum çerezi HttpOnly değilse betik tek satırla onu okuyup dışarıya gönderebilir; saldırgan da bu kimlikle, kullanıcının tarayıcısından bağımsız olarak, oturum süresi boyunca hesabı kullanabilir. HttpOnly bu en doğrudan senaryoyu engeller: oturum kimliği çalınamaz.

Ancak bu korumanın sınırları nettir ve yanlış anlaşılması sık görülür:

  • XSS'i önlemez. Betik çerezi okuyamasa da sayfa açıkken kullanıcı adına istek gönderebilir, çünkü tarayıcı HttpOnly çerezleri fetch() ile yapılan isteklere de ekler. Asıl çözüm XSS'in kendisini önlemektir.
  • CSRF'e karşı koruma sağlamaz. Siteler arası isteklere çerez eklenmesi HttpOnly ile değil SameSite ve CSRF token'larıyla kontrol edilir.
  • Gizlilik veya şifreleme değildir. Kullanıcı kendi çerezini geliştirici araçlarında görebilir; değer düz metin olarak saklanır. Çerezde hassas veri tutulmamalıdır.

Bu bayrağı yalnızca sunucu koyabilir

RFC 6265'e göre tarayıcı, HTTP dışı bir API'den (yani JavaScript'ten) gelen ve HttpOnly işaretli bir çerezi tamamen yok sayar. Bu yüzden HttpOnly çerez, sunucunun yanıtındaki Set-Cookie başlığıyla oluşturulur. Örneğin Express'te:

res.cookie("__Host-oturum", sessionId, {
  httpOnly: true,
  secure: true,
  sameSite: "lax",
  path: "/",
  maxAge: 1000 * 60 * 60 * 8 // 8 saat
});

Çoğu framework'ün oturum katmanı bu ayarlarla gelir, ama özellikle kendi kimlik doğrulama akışını yazan ekiplerde varsayılanları kontrol etmek gerekir.

Token'ı nerede saklamalı?

Tek sayfalık uygulamalarda sık tartışılan bir soru, JWT gibi token'ların localStorage'da mı, HttpOnly çerezde mi tutulacağıdır. localStorage'daki her şey sayfadaki tüm betiklerin erişimindedir; bir XSS açığı token'ın doğrudan çalınması demektir. HttpOnly çerez bu riski kaldırır, buna karşılık tarayıcı onu otomatik gönderdiği için CSRF önlemlerini zorunlu kılar. Çoğu web uygulaması için kısa ömürlü, HttpOnly, Secure ve SameSite ayarlı bir oturum çerezi, daha az hareketli parçayla daha savunulabilir bir tercihtir.

Hızlı kontrol

Tarayıcı geliştirici araçlarında Uygulama (Application) veya Depolama (Storage) sekmesindeki çerez listesinde her çerez için HttpOnly sütunu görünür. Konsolda document.cookie yazdığınızda oturum çerezinizin değeri listede çıkıyorsa, bayrak eksik demektir.

İlgili terimler

← Sözlüğe dön