erezler, dorudan taraycda depolanan kk veri dizileridir. erezler RFC 6265 teknik artnamesi tarafndan tanmlanan HTTP protokolnn bir parasdrlar.
ou zaman, erezler bir web sunucusu tarafndan ayarlanr. Daha sonra ayn etki alanna yaplan her istee otomatik olarak eklenirler.
En yaygn kullanm alanlarndan biri kimlik dorulamadr:
- Oturum aldnda, sunucu session identifier ieren bir erez ayarlamak iin, gnderilen istee verdii yantta
Set-CookieHTTP baln kullanr. - Gelecek sefere istek ayn etki alanndan yapldnda, tarayc
CookieHTTP-header balan kullanarak a zerinden gnderir. - Bylece sunucu istein kim tarafndan yapldn bilir.
Ayrca document.cookie zelliini kullarak erezelere taraycdan da eriebiliriz.
erezler ve seenekleri hakknda birok ince detay var. Bu blmde bunlar ayrntl olarak ele alacaz.
Reading from document.cookie
Bu sitede hi erezin var m? Hadi grelim:
// javascript.info sitesinde, biz istatistikler iin Google Analytics kullanrz,
// bu yzden baz erezler olmal
alert( document.cookie ); // cookie1=value1; cookie2=value2;...
document.cookie deeri ; ile ayrlm name=value iftlerinden oluur. Her biri ayr bir erezdir.
Bellirli bir erezi bulmak iin, document.cookie yi ; ile ayrabiliriz ve sonra doru ismi bulabiliriz. Ayrca bunu yapmak iin dzenli ifadeler (regular expresion) veya dizi methodlarn da kullanabiliriz.
Bunu okuyucu iin bir egseriz olarak brakyoruz. Ayrca, bu blmn sonunda yardmc fonksiyonlar ve zerinde deiiklik yapabileceiniz erezler bulacaksnz.
document.cookie ye yazma
document.cookie ye yazabilir. Ancak bu bir veri zellii deildir, bu bir eriimdir.
document.cookie yazlan bir ilemi, taraycnda sayesinde belirttiimiz erezleri gnceller fakat bu, dier erezleri etkilemez.
rnein, bu ismi user ve deeri John olan bir erezi ayarlar :
document.cookie = "user=John"; // sadece 'user' isimli erezi gnceller
alert(document.cookie); // tm erezleri gster
Eer komutu altrrsanz, muhtemelen birden fazla erez greceksiniz. Bunun nedeni document.cookie= ilem tm erezleri etkilemedii iindir. Sadece user adl erezi deitirir.
Tekinik olarak, isim ve deer herhangi bir karakter ierebilir, fakat geerli bir atama yapmak iin encodeURIComponent yerleik fonksiyonu kullanlmaldr:
// 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 kstlama vardr:
encodeURIComponentfonksiyonunu kullanrkenname=valueifti 4kb yi gememelidir. Yani br erezde ok byk bir deer tutulamaz.- Kesin snr taraycnn trne bal olmakla birlilte, etki alan bana toplam erez says 20+ ile snrldr.
erezlerin birka seenei vardr, bunlarn ou nemli ve ayarlanmas gerekir.
Seenekler key=value ile belirtilmi ve ; ile ayrlm, aadaki gibi listelenir:
document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"
path
path=/mypath
erezin URL neki ulalabilir olmaldr. Tam olmaldr. Varsaylan olarak, geerli yoldur.
Eer bir erez path=/admin olarak ayarlandysa, bu erez /admin ve /admin/something sayfalarnda grlebilir, ancak /home ya da /adminpage sayfalarnda grnmez.
Genelde, biz erezin tm web sayfalarnda eriebilir olmas iin path=/ eklinde ayarlarz.
domain
domain=site.com
erezlere etki alan zerinden eriilebilir. Ancak pratikte baz kstlamalar vardr. Bu erezleri herhangi bir etki alanna ayarlayamayz.
Varsaylan olarak, bir erez sadece onu ayarladmz etki alanndan eriilebilir. Yani, eer erez site.com etki alanna ayarlanmsa, biz ona other.com etki alanndan eriemeyiz.
Ancak daha ilgin olan, forum.site.com alt etki alnndan da erezlere eriilemez.
// diyelim ki site.com alan adl sitede yle bir erez atamas yaplm olsun
document.cookie = "user=John"
// forum.site.com alt etki alanndan ayn ereze erimeye altmzda kt aadaki gibi olur
alert(document.cookie); // kullanc yok
Bir erezin baka 2.seviye bir etki alanndan eriilebilmesini salamann bir yolu yok, bu nedenle other.com sitesi hibir zaman site.com sitesinde ayarlanm bir ereze eriemeyeektir.
Bunun sebebi, nemli verileri erezlerde saklamamza izin veren bir gnvelik snrlamasdr.
Ancak forum.site.com gibi alt alan adlarna eriim izni vermek istiyorsak, bu mmkndr. Bunun iin domain seeneini aka domain=site.com seeneine ayarlamamz gerekiyor:
// site.com etki alnnda, herhangi bir alt etki alanna yle ayarlayabiliriz:
document.cookie = "user=John; domain=site.com"
// forum.site.com alt alanndan erezlere erielim
alert(document.cookie); // kt: kullanclar
Gemiten gelen nedenlerden dolay, domain=.site.com (banda bir nokta ile) eklinde de alr, ok eski tarayclar desteklemek in noktay eklemek daha iyi olabilir.
Dolaysyla, domain seenei, erezlere alt alan adlarndan da erimeyi izin verir.
expires, max-age
Varsaylan olarak, eer bir erez bu seeneklerden birine sahip deilse, tarayc kapatldnda erezler de yok olur. Bu tr erezlere session cookies denir.
Tarayc kapatldnda bile erezlerin yok olmasn engellemek iin expires ya da max-age seeneklerinden birini ayarlamak gerekir.
expires=Tue, 19 Jan 2038 03:14:07 GMT
Bu rnekte, taraycnn 19 Ocak 2038 e kadar erezi otomatik olarak tutumasn ve sresi dolunca silmesini salar.
Tarih, kesinlikle GMT zaman dilimi formatnda olmal. Bu format elde etmek iin date.toUTCString methodunu kullanabiliriz. rnein, erezi 1 gn 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;
Eer erezin expires seeneini gemiteki bir tarihe ayarlarsak, erez silinir.
max-age=3600
expires seeneine alternatif olarak, erezi geerli andan itibaren saniye trnden yok olmasn belirtir.
Eer saniye, sfr 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 sresinin sona ermesine izin ver)
document.cookie = "user=John; max-age=0";
secure
secure
erez sadece HTTPS zerinden gnderilmelidir.
Varsaylan olarak, eer http://site.com sitesi zerinden bir erez ayarlarsak, bu ayn zamanda https://site.com sitesi zerinden grnr ve tersi de mmkndr.
Yani, erezler etki alan tabanldr, protokoller arasnda ayrm yapmaz.
Bu seenekle beraber, eer bir erez hassas bilgiler ieriyorsa, durum deiir. Yani bir erez https://site.com etki alanna ayarlamsa, bu ereze http://site.com zerinden eriem mmkn deildir, nk HTTP ile HTTPS arasnda S gnvelik flag vardr. Bu da erezlere eriilmesini engeller. Sonu olarak hassas bilgilere sahip erezleriniz varsa HTTPS protokln kullanmanz daha doru 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) saldrlarndan korunmak iin baka bir gvenlik seeneidir.
Bu seenein ne zaman iimize yarayacan anlamak iin aadaki senaryoya bakalm.
XSRF attack
bank.com sitesine giri yaptnz dnn. Yani: bu siteden bir tane kimlik dorulama ereziniz var. Taraycnzla bank.com sitesine her giri yaptnzda, taraycnz bu erezi bank.com sitesinin bulunduu sunucuya gnderir, bylece bank.com sitesi sizi tanr ve tm hassas finansal ilemlerinizi gerekletirir.
imdi, baka bir sekmede internette gezinirken (evil.com), bu sitede (evil.com) de bilgisayar korsanna ait bir giri hesab var ve bu site zaman zaman
Yorumlar
<code>kullannz, birka satr eklemek iin ise<pre>kullann. Eer 10 satrdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)