HTTP cookie nedir, hangi amaçlarla ve nasıl kullanılır?

Bu flood’da HTTP cookie’leri tanıtarak bazı basit kullanım alanlarından bahsedeceğim.

Bilindiği gibi HTTP stateless bir protokoldür. HTTP protokolü, web istemciyi ve sunucuyu sonraki istekler ve cevaplarda kullanılmak üzere protokol seviyesinde bir state (durum bilgisi) tutmasını şart koşmaz. Bununla birlikte web uygulamalarında durumu bilgisini tutmaya ihtiyacımız vardır. Örneğin, kullanıcı uygulamaya parolası ile giriş yaptıktan sonra ziyaret ettiği diğer sayfalarda kullanıcıya tekrar tekrar kullanıcı adı ve parolasını sormak istemeyiz. Kullanıcının önceden uygulamaya giriş yaptığını bilerek onu tanımamız gerekir.

HTTP cookie’lerin bir kullanım amacı yukarıda belirtilen ihtiyacı karşılamaktır. Web sunucu, kendisi ile iletişim kuran tarayıcılara onları birbirinden ayırmak için birer session açar. Sunucu, kendi tarafında tuttuğu Session Id bilgisini aynı tarayıcının diğer isteklerinde de ayırt edebilmek için şifreleyerek tarayıcıya vereceği HTTP cevabın Cookie bölümüne ekler. Tarayıcı bu cookie'yi alır ve web sunucuya göndereceği bütün isteklerde HTTP header'larına ekler. Böylece sunucu gelen istekteki cookie'yi deşifre ederek session bilgisini edinmiş olur.

Yukarıda anlatılan cookie’lere Session Cookie denir. Aşağıdaki iki ekran görüntüsünde, HTTP header'ında sunucudan Set-Cookie header'ı ile gelen cookie'nin sonraki istekte tarayıcı tarafından sunucuya tekrar gönderilmesi gösterilmiştir.

HTTP cevabında Set-Cookie header'ında aşağıda görüldüğü gibi path alanı bulunmaktadır. Bu alan tarayıcının hangi URL'ler için aldığı cookie'yi sunucuya geri göndermesi gerektiğini belirtmektedir. Örnekte path / olduğu için cookie bütün isteklerde gönderilecektir.

Yukarıdaki örnekte path / seçildiği için tarayıcı, aynı domain'e yaptığı js, css, imaj dahil bütün isteklerde header'a sakladığı cookie'yi ekleyecektir. Bu davranış verimlilik açısından hatalı gibi görünse de olanak tanıdığı kullanım alanları oldukça fazladır.

Yukarıda path alanına ek olarak bir de httponly alanının bulunduğunu görülüyor. Sunucu bu flag'i kullanarak tarayıcıya ilgili cookie'ye JavaScript tarafından erişime izin verilmemesini salık vermektedir. Bu flag ile cookie'nin XSS yoluyla çalınmasının önüne geçilir. XSS (Cross-site Scripting) ile web uygulamasındaki bazı zafiyetler nedeniyle kötü amaçlı kişiler tarayıcı üzerinde kendi JS kodlarını çalıştırabilirler. httponly ile JS'in ilgili cookie'yi okuması engellenir ve Session Cookie, XSS atağından korunmuş olur.

Anlaşılacağı üzere Session Cookie'ler kullanıcının güvenle saklaması gereken bilgilerdir. Bu bilgiyi eline geçiren kötü amaçlı kişi, session'a erişim sağlayarak uygulama üzerinde Session Cookie'nin gerçek sahibi gibi hareket edebilir. Buna Session Hijacking adı verilir.

Tarayıcılar web uygulamalarında kullanılan cookie'ler ve özelliklerinin derli toplu görülebileceği araçlara sahiptir. Aşağıda Chrome'un ilgili domain'deki cookie'ler hakkında bilgi verdiği ekran gösterilmiştir.

Ekran görüntüsünde görülen secure da path ve httponly gibi bir Set-Cookie parametresidir. Sunucu bu direktifle tarayıcıya cookie'nin sadece HTTPS üzerinden yapılan güvenli isteklerde gönderilmesi söyler, bu sayede cookie'nin ağı dinleyen kişilerce çalınması engellenir.

Şimdiye kadar hep Session Cookie'lerden bahsettik ve bu cookie'lerin kaydedilmediğini ve browser kapanınca silindiğini belirttik. Session Cookie'lerin aksine kullanıcı bilgisayarında uzun süre kaydedilen cookie'ler de vardır ve bunlara Persistent Cookie denir.

Bir siteye giriş yaparken Beni Hatırla kutucuğunu işaretlendiğinde web sunucunun verdiği cevapta Session Cookie yerine Persistent Cookie bulunur. Aşağıda, yukarıdaki örneklerde kullanılan web uygulamasına Beni Hatırla ile giriş yapılmış ve Expire bu kez yazılmıştır.

Persistent Cookie'lerin bir kullanım alanı da kullanıcının dil tercihini saklamak ve sayfayı tercih edilen dilde göstermektir. Persistent Cookie'ler sayesinde kullanıcı ilgili uygulamayı tekrar açtığında login olması (sunucunun tanıması) beklenmeden dil tercihine uyulabilir.

Persistence Cookie'ler ile kullanıcıların web uygulaması üzerindeki davranışları takip edilebildiği için Tracking Cookie olarak da adlandırılırlar. AB ülkelerinde uzun yıllardır, ülkemizde ise son zamanlarda yasa gereği kullanıcılardan bu cookie'ler için izin istenmektedir.

Hemen bir sonraki flood’da cookie’lerin web sunuculardaki Session yönetiminde nasıl kullanıldığını, cookie'lerin web sunucu ve Load Balancer (yük dağıtıcı)'da kullanılması ile elde edilen geniş ve ferah kullanım alanlarından bahsedeceğim.