Çerezler, doğrudan tarayıcıda depolanan küçük veri dizileridir. Çerezler RFC 6265 teknik şartnamesi tarafından tanımlanan HTTP protokolünün bir parçasıdırlar.
Çoğu zaman, çerezler bir web sunucusu tarafından ayarlanır. Daha sonra aynı etki alanına yapılan her isteğe otomatik olarak eklenirler.
En yaygın kullanım alanlarından biri kimlik doğrulamadır:
- Oturum açıldığında, sunucu “session identifier” içeren bir çerez ayarlamak için, gönderilen isteğe verdiği yanıtta
Set-Cookie
HTTP başlığını kullanır. - Gelecek sefere istek aynı etki alanından yapıldığında, tarayıcı
Cookie
HTTP-header başlağını kullanarak ağ üzerinden gönderir. - Böylece sunucu isteğin kim tarafından yapıldığını bilir.
Ayrıca document.cookie
özelliğini kullarak çerezelere tarayıcıdan da erişebiliriz.
Çerezler ve seçenekleri hakkında birçok ince detay var. Bu bölümde bunları ayrıntılı olarak ele alacağız.
Reading from document.cookie
Bu sitede hiç çerezin var mı? Hadi görelim:
// javascript.info sitesinde, biz istatistikler için Google Analytics kullanırız,
// bu yüzden bazı çerezler olmalı
alert( document.cookie ); // cookie1=value1; cookie2=value2;...
document.cookie
değeri ;
ile ayrılmış name=value
çiftlerinden oluşur. Her biri ayrı bir çerezdir.
Bellirli bir çerezi bulmak için, document.cookie
yi ;
ile ayırabiliriz ve sonra doğru ismi bulabiliriz. Ayrıca bunu yapmak için düzenli ifadeler (regular expresion) veya dizi methodlarını da kullanabiliriz.
Bunu okuyucu için bir egseriz olarak bırakıyoruz. Ayrıca, bu bölümün sonunda yardımcı fonksiyonlar ve üzerinde değişiklik yapabileceğiniz çerezler bulacaksınız.
document.cookie’ ye yazma
document.cookie
ye yazabilir. Ancak bu bir veri özelliği değildir, bu bir erişimdir.
document.cookie
yazılan bir işlemi, tarayıcında sayesinde belirttiğimiz çerezleri günceller fakat bu, diğer çerezleri etkilemez.
Örneğin, bu ismi user
ve değeri John
olan bir çerezi ayarlar :
document.cookie = "user=John"; // sadece 'user' isimli çerezi günceller
alert(document.cookie); // tüm çerezleri göster
Eğer komutu çalıştırırsanız, muhtemelen birden fazla çerez göreceksiniz. Bunun nedeni document.cookie=
işlem tüm çerezleri etkilemediği içindir. Sadece user
adlı çerezi değiştirir.
Tekinik olarak, isim ve değer herhangi bir karakter içerebilir, fakat geçerli bir atama yapmak için encodeURIComponent
yerleşik fonksiyonu kullanılmalıdır:
// special values, need encoding
let name = "my name";
let value = "John Smith"
// encodes the cookie as my%20name=John%20Smith
document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);
alert(document.cookie); // ...; my%20name=John%20Smith
Birkaç kısıtlama vardır:
encodeURIComponent
fonksiyonunu kullanırkenname=value
çifti 4kb yi geçmemelidir. Yani br çerezde çok büyük bir değer tutulamaz.- Kesin sınır tarayıcının türüne bağlı olmakla birlilte, etki alanı başına toplam çerez sayısı 20+ ile sınırlıdır.
Çerezlerin birkaç seçeneği vardır, bunların çoğu önemli ve ayarlanması gerekir.
Seçenekler key=value
ile belirtilmiş ve ;
ile ayrılmış, aşağıdaki gibi listelenir:
document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"
path
path=/mypath
Çerezin URL öneki ulaşılabilir olmalıdır. Tam olmalıdır. Varsayılan olarak, geçerli yoldur.
Eğer bir çerez path=/admin
olarak ayarlandıysa, bu çerez /admin
ve /admin/something
sayfalarında görülebilir, ancak /home
ya da /adminpage
sayfalarında görünmez.
Genelde, biz çerezin tüm web sayfalarında erişebilir olması için path=/
şeklinde ayarlarız.
domain
domain=site.com
Çerezlere etki alanı üzerinden erişilebilir. Ancak pratikte bazı kısıtlamalar vardır. Bu çerezleri herhangi bir etki alanına ayarlayamayız.
Varsayılan olarak, bir çerez sadece onu ayarladığımız etki alanından erişilebilir. Yani, eğer çerez site.com
etki alanına ayarlanmışsa, biz ona other.com
etki alanından erişemeyiz.
…Ancak daha ilginç olanı, forum.site.com
alt etki alnından da çerezlere erişilemez.
// diyelim ki site.com alan adlı sitede şöyle bir çerez ataması yapılmış olsun
document.cookie = "user=John"
// forum.site.com alt etki alanından aynı çereze erişmeye çalıştığımızda çıktı aşağıdaki gibi olur
alert(document.cookie); // kullanıcı yok
Bir çerezin başka 2.seviye bir etki alanından erişilebilmesini sağlamanın bir yolu yok, bu nedenle other.com
sitesi hiçbir zaman site.com
sitesinde ayarlanmış bir çereze erişemeyeektir.
Bunun sebebi, önemli verileri çerezlerde saklamamıza izin veren bir günvelik sınırlamasıdır.
…Ancak forum.site.com
gibi alt alan adlarına erişim izni vermek istiyorsak, bu mümkündür. Bunun için domain
seçeneğini açıkça domain=site.com
seçeneğine ayarlamamız gerekiyor:
// site.com etki alnında, herhangi bir alt etki alanına şöyle ayarlayabiliriz:
document.cookie = "user=John; domain=site.com"
// forum.site.com alt alanından çerezlere erişelim
alert(document.cookie); // çıktı: kullanıcılar
Geçmişten gelen nedenlerden dolayı, domain=.site.com
(başında bir nokta ile) şeklinde de çalışır, çok eski tarayıcıları desteklemek içn noktayı eklemek daha iyi olabilir.
Dolayısıyla, domain
seçeneği, çerezlere alt alan adlarından da erişmeyi izin verir.
expires, max-age
Varsayılan olarak, eğer bir çerez bu seçeneklerden birine sahip değilse, tarayıcı kapatıldığında çerezler de yok olur. Bu tür çerezlere “session cookies” denir.
Tarayıcı kapatıldığında bile çerezlerin yok olmasını engellemek için expires
ya da max-age
seçeneklerinden birini ayarlamak gerekir.
expires=Tue, 19 Jan 2038 03:14:07 GMT
Bu örnekte, tarayıcının 19 Ocak 2038 e kadar çerezi otomatik olarak tutumasını ve süresi dolunca silmesini sağlar.
Tarih, kesinlikle GMT zaman dilimi formatında olmalı. Bu formatı elde etmek için date.toUTCString
methodunu kullanabiliriz. Örneğin, çerezi 1 gün sonra yok olacak şekilde ayarlabiliriz:
// +1 day from now
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = "user=John; expires=" + date;
Eğer çerezin expires
seçeneğini geçmişteki bir tarihe ayarlarsak, çerez silinir.
max-age=3600
expires
seçeneğine alternatif olarak, çerezi geçerli andan itibaren saniye türünden yok olmasını belirtir.
Eğer saniye, sıfır ya da negatif bir sayı olursa, çerez silinir.
// çerez ayarlandığı zamandan bir saat sonra silinir.
document.cookie = "user=John; max-age=3600";
// çerezi sil (çerezin süresinin sona ermesine izin ver)
document.cookie = "user=John; max-age=0";
secure
secure
Çerez sadece HTTPS üzerinden gönderilmelidir.
Varsayılan olarak, eğer http://site.com
sitesi üzerinden bir çerez ayarlarsak, bu aynı zamanda https://site.com
sitesi üzerinden görünür ve tersi de mümkündür.
Yani, çerezler etki alanı tabanlıdır, protokoller arasında ayırım yapmaz.
Bu seçenekle beraber, eğer bir çerez hassas bilgiler içeriyorsa, durum değişir. Yani bir çerez https://site.com
etki alanına ayarlamışsa, bu çereze http://site.com
üzerinden erişem mümkün değildir, çünkü HTTP ile HTTPS arasında S günvelik flagı vardır. Bu da çerezlere erişilmesini engeller. Sonuç olarak hassas bilgilere sahip çerezleriniz varsa HTTPS protokülünü kullanmanız daha doğru olur.
// assuming we're on https:// now
// set the cookie secure (only accessible if over HTTPS)
document.cookie = "user=John; secure";
samesite
Bu, XSRF (siteler arası sahte istek) saldırılarından korunmak için başka bir güvenlik seçeneğidir.
Bu seçeneğin ne zaman işimize yarayacağını anlamak için aşağıdaki senaryoya bakalım.
XSRF attack
bank.com
sitesine giriş yaptığınızı düşünün. Yani: bu siteden bir tane kimlik doğrulama çereziniz var. Tarayıcınızla bank.com
sitesine her giriş yaptığınızda, tarayıcınız bu çerezi bank.com
sitesinin bulunduğu sunucuya gönderir, böylece bank.com
sitesi sizi tanır ve tüm hassas finansal işlemlerinizi gerçekleştirir.
Şimdi, başka bir sekmede internette gezinirken (evil.com
), bu sitede (evil.com
) de bilgisayar korsanına ait bir giriş hesabı var ve bu site zaman zaman