Ã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-CookieHTTP baÅlıÄını kullanır. - Gelecek sefere istek aynı etki alanından yapıldıÄında, tarayıcı
CookieHTTP-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:
encodeURIComponentfonksiyonunu 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
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)