Uygulama Güvenliği

HTTP Cookie Nedir? Ne işe yarar? Nasıl kullanılır?

Cookie bir çeşit sizi diğerlerinden ayırt eden bir kimlik mekanizmasıdır. HTTP sizin kim olduğunuzu bilmez. Bunu bilmek için sizi diğerlerinden ayırt edecek benzersiz bir kimliğe sahip olmalısınız. Bunu da Cookie aracılığı ile yapar. HTTP kendi başına sizin kimliğinizi bilemez ve buna “Stateless” denir.

İlk çıktığından itibaren güvenli olması için cookie’lere belirli özellikler eklenmiştir. Yapı olarak çıktığı ilk günden itibaren değiştmeden devam etmektedir. Cookie’ler tarayacılar aracılığı ile bilgisayarda 4 KB’lık bir yer kaplamaktadır.

 

Bir web sitesine girdiğiniz zaman o site size bir cookie oluşturacaktır. Bu sizi o web sitesinin tanıması için verilecektir. Örneğin bir web sitesine girdiniz. Kayıt olup giriş yaptınız. Giriş yaptığınızda o web sitesinde her gezindiğinizde, size tekrardan giriş yaptırmak yerine size vermiş olduğu cookie’yi kontrol eder. “Bu cookie ile daha önce “Tayentu” kullanıcısı tarafından giriş yapılmış. Bu o kişidir.” diyerek sizi tanır ve size tekrardan giriş yaptırmak yerine o kullanıcı olarak içeri alır.

 

Tarayıcınızda bir cookie'nin yaşamı, talep ettiği web isteğine cevap olarak yanıtta yer alan alttaki headerlar ile başlar:

 

Set-Cookie: value[; expires=tarih][; domain=alan adı][; path=path][; secure]

 

Bu cookie header’larından yalnızca “Value (İsim)” değeri zorunludur. Expires, Domain, Path, Secure header’ları isteğe bağladır. Opsiyoneldir. Cookie ile birlikte gönderilen header’lar birbirinden ";" noktalı virgül ve space ile ayrılmalıdır.

 

Cookie belirteci içeren örnek bir HTTP yanıtı:

 

HTTP/1.1 200 OK 
Content-Type: text/html 
Set-Cookie: CookieName=CookieValue; path=/;

 

Name: Cookie’nin ilk kısmı “name=value” formatında belirtilmiştir fakat tarayıcılarda bazen sadece isim olarak set edilen cookie'ler görülebilmektedir. Bazı durumlarda web uygulamaları belirteç olarak “name=value” biçiminde set edilmeyen, sadece isim değeri olan cookie'ler set edebilir.

 

Domain: Cookie'nin tarayıcıda kaydedildikten sonra, hangi domain'e yapılan isteklerle birlikte gönderileceğini belirten seçenektir. Bu opsiyonel bir değerdir. Belirtilmediği takdirde tarayıcı, cookie'yi gönderen domain’in adını kullanacaktır. Bir cookie aynı domain’e ait birden fazla subdomain için kullanılabilir.

 

Mesela “Turkcell.com.tr” adresi “deneme.turkcell.com.tr”, gelecegiyazanlar.turkcell.com.tr” adresi için aynı cookie’yi kaydedebilir. Bu tamamen opsiyoneldir. Sistemi yazan kişiyle ilgilidir. İstenmediği takdirde kullanılmayabilir.

 

Örneğin “turkcell.com.tr” sitesi, “Superonline.net” adresine ait bir cookie’yi tarayıcı’da kaydedemez. Bunun sebebi güvenlik önlemidir. Bu tür yapılan istekler hem sunucu hem de istemci tarafından reddedilir.

 

Bu konuyla alakalı örneği alttaki tabloda bulabilirsiniz. (Yazılımcı tarafından istisnai durumlar oluşturulabilir. Genel olarak özel kural yazılmadığında alttaki tablo geçerlidir.)

 

Cookie Set Eden Domain Cookie'nin gönderileceği domainler Cookie'nin gönderilmeyeceği domainler
www.turkcell.com.tr

www.turkcell.com.tr

medya.www.turkcell.com

turkcell.com.tr

m.turkcell.com.tr

medya.turkcell.com.tr

m.turkcell.com.tr

m.turkcell.com.tr

medya.turkcell.com.tr

turkcell.com.tr

www.turkcell.com.tr

medya.turkcell.com.tr

.turkcell.com.tr

turkcell.com.tr

medya.turkcell.com.tr

www.turkcell.com.tr

m.medya.turkcell.com.tr

 

 

path: Cookie'nin belirtilen adreslere de gönderebilecek alandır. Tarayıcı, kullanıcıdan bir URL için istek geldiğinde, sakladığı cookie listesinden hangi cookie'leri göndereceğine karar verir. Domain’den sonra bakılacak alandır.

 

Örnek olarak;

 

Turkcell Geleceği Yazanlar adresinin “/” adresini path olarak belirttiğimizi varsayalım. Bu noktada böyle bir işlem yaptığımızda;

 

https://gelecegiyazanlar.turkcell.com.tr/*” olarak kaydedilecek ve bunların tamımı aynı cookie ile işleme alınacaktır. (“*” ifadesi bütün alt path’leri kapsamaktadır.)

 

Set-Cookie: Turkcell=Gelecek; domain=gelecegiyazanlar.turkcell.com.tr; path=/

 

Şimdi ise Turkcell Geleceği Yazanlar adresinin “/eğitimler” adresini path olarak belirttiğimizi varsayalım. Böyle bir istekte bulunduğumuzda;

 

Set-Cookie: Turkcell=Gelecek; domain=gelecegiyazanlar.turkcell.com.tr; path=/egitimler

 

https://gelecegiyazanlar.turkcell.com.tr/egitimler/*” olarak kaydedilecek ve bunların tamımı aynı cookie ile işleme alınacaktır. (“*” ifadesi bütün alt path’leri kapsamaktadır.)

 

Burada önemli olan nokta ise örneğin ““https://gelecegiyazanlar.turkcell.com.tr/blog/*” adresine giderseniz önceki cookie’niz bu adrese gönderilmeyecek ve size başka bir cookie adresi tanımlanacaktır. Bir önceki cookie’niz burada geçerli olmayacaktır.  Yani blog, forum, topluluk gibi adreslerde cookie’niz geçersiz olacaktır.

 

secure: Cookie'yi secure olarak bildirdiğimizde, yukarıdaki şartlara ilaveten (domain ve path eşleşmesidir) bağlantı tipinin HTTPS olarak gönderilebileceğini belirtiyoruz. Bu seçenek dahil edilmediğinde güvenli ve güvenli olmayan, domain ve path şartına uyan tüm istekler birlikte gönderilir. Unutulmaması gereken bir diğer önemli nokta da secure tanımlı bir cookie'yi ancak HTTPS olarak yapılan bir isteğin cevabında alabiliriz.

 

expires: Cookie'nin tarayıcıda tutulacağı süreyi belirler. Belirtilmediği takdirde tarayıcı açık olduğu sürece tarayıcının belleğinde tutulur. Tarayacının kapanması ile birlikte silinir. "expires" değeri için belirlenmiş format şu şekildedir: HaftanınGünü, Gün-Ay-Yıl Saat:Dakika:Saniye GMT.

 

Set-Cookie: Turkcell=Gelecek; domain=gelecegiyazanlar.turkcell.com.tr; path=/; expires=Sun, 21-02-2016 08:25:01 GMT

 

(Sun-Pazar, İngilizce olarak belirtilmelidir.)

 

"expires" için bir değer belirtilmediği takdirde, cookie "Session" olarak işaretlenecektir. Yani cookie'nin ömrü tarayıcı açık kaldığı sürece devam edecektir. Bir cookie'yi istemci tarayıcıdan silmek istediğinde "expires" değeri olarak eski bir tarih belirlenirse cookie, tarayıcının belleğinden silinecektir.

 

Bir cookie "expires" değeri olarak ileri bir tarih olarak belirlendiyse bu tür cookie'ler, “Persistent Cookie” olarak tanımlanmaktadır.

 

max-age: Expires ile aynı işlevi görmektedir. Cookie'nin tarayıcıda saklanacağı süreyi belirtir. Expires ile belirli bir formatta belirtmek gerekirken max-age ile cookie'nin saklanacağı süreyi saniye cinsinden belirtilir. 0 veya -1 değeri gönderilirse cookie tarayıcının belleğinden silinir. (Eski tarayıcılarda bu işlev çalışmamaktadır. Örneğin IE8 ve altı...)

 

Set-Cookie: Turkcell=Anasayfa; domain=turkcell.com.tr; path=/; max-age= 88752355

 

Cookie'nin parametrelerinden biri değiştiğinde, örneğin “path” değerini "/" değerini “/eğitimler” olarak değiştirip cookie'yi gönderdiğimizde, istemci eski cookie'nin değerinin üzerine yazmaz. Yeni bir cookie oluşturur. Bu hususa çok dikkat edilmelidir.

 

Cookie'lerin tarayıcıın belleğinden otomatik silinmesinin şartları vardır. Bu şartlar:

 

  • Session tipindeki cookie'ler tarayıcı kapandığında otomatik olarak bellekten silinir.
  • Persistent cookie'ler, “expires” ya da “max-age”de belirtilen değerleri aşarsa otomatik olarak silinir.
  • Tarayıcının tutabileceği cookie limiti aşıldığı zaman yeni cookie’ler oluşturabilmek için eski cookie'ler tarayıcıdan silinebilmektedir.

 

Cookie limitleri hem tarayıcıların hem de internet trafiğini korumak için cookie sayılarında ve içerdiği verilerin boyutlarına limit belirlenmiştir. Tarayıcıda tutulan cookie'ler, ilgili web sitelerine istek gönderildiğinde bu istekle birlikte sunucuya gönderildiklerinden sunucu trafiğini doğrudan etkiler.

 

Cookie'lerin boyut olarak 4 KB olarak sabittir.

 

httpOnly:

 

Cookie'ler Javascript tarafından DOM nesnesinin niteliklerine ulaşarak okunabilmektedir. Bazı cookie'ler, örneğin Javascript'in hiç kullanmadığı, sadece kullanıcının yetkili biri olduğunu sunucuya bildirmek için oluşturduğu Session Cookie'leri okuyamamalıdır. Okunabildiği durumlarda, XSS zafiyeti gibi diğer parametrelerle tehlikeli bir hale gelebilir ve verilerin çalınmasına neden olabilir.

 

Bunu engellemek amacıyla güncel tarayıcılardan desteklenen httpOnly parametresi kullanılmaktadır.

 

Sunucu tarafından tarayıcının belleğinde tutulan bir cookie, httpOnly parametresi içeriyorsa bu cookie yalnızca HTTP isteklerine eklenir ve Javascript tarafından okunamaz, manipüle edilemez.

 

httpOnly parametresi Cookie tanımlamak için;

 

Set-Cookie: PHPSESSID=8875235588752355; domain=turkcell.com.tr; path=/; httpOnly

 

Yorumlar

EMRE UZUN
18.12.2021 - 10:51

Merhaba,

Cookie'ler ile alakalı aydınlatıcı bir yazı olmuş, eline sağlık. Ön yazıdaki "Stateless" kavramında bir düzeltme ihtiyacı var gibi geldi bana. 

Bir de bu makaleyi tamamlayan bir Token Authentication, JWT vb bir yazı da iyi olabilir.