nedir? Cookie ve Muadilleri
Tekrardan merhaba, bugün sana tarayıcı tarafında veri saklamanın üç yüzünü göstereceğim. Cookie, LocalStorage ve SessionStorage. Hepsi birbirine benziyor gibi görünür ama aslında arka planda oldukça farklı çalışırlar. Bir kullanıcı oturumunu hatırlamak, bir temayı kaydetmek ya da bir formun doldurulma durumunu saklamak istiyorsan bu üçlü karşına mutlaka çıkar. Fakat aynı zamanda güvenlik tarafında da en sık açıkların oluştuğu yer tam olarak burasıdır.
Cookie’ler web’in en eski hafıza sistemidir. Sunucuyla birlikte çalışır, her istekle beraber tarayıcıdan sunucuya gönderilir. Bu sayede oturum yönetimi yapılır. Örneğin bir siteye giriş yaptığında “oturum=aktif” gibi bir cookie atanır. Sayfayı yenilediğinde bu cookie header’a eklenir ve sunucu senin kim olduğunu anlar. Fakat işte burada en büyük risk devreye girer: XSS. Yani biri sitede bir JavaScript açığı bulursa, bu cookie’yi çalıp kendi sistemine gönderebilir. Özellikle cookie’de HttpOnly ve Secure bayrakları kullanılmamışsa bu risk çok daha büyüktür.
LocalStorage ve SessionStorage biraz daha modern yaklaşımlardır. Bunlar tamamen tarayıcı tarafında, yani senin bilgisayarında tutulur. Sunucuya otomatik gönderilmezler. LocalStorage, veriyi kalıcı tutar. Tarayıcıyı kapatsan bile veri orada kalır. Kullanıcı teması, dil tercihi, en son açık sekme gibi şeyleri saklamak için idealdir. SessionStorage ise tarayıcı sekmesi kapandığında silinir. Yani geçici veriler içindir. Örneğin bir formun doldurulma durumu ya da tek oturumluk bir işlemin ara adımı gibi.
Peki bunların kapasite farkı ne? Cookie’ler genellikle 4KB ile sınırlıdır. LocalStorage ve SessionStorage ise tarayıcıya göre değişmekle birlikte genellikle 5MB civarındadır. Yani büyük veri saklamak için cookie doğru tercih değildir. Ama büyük veri saklamak her zaman iyi bir fikir de değildir çünkü tarayıcıda tuttuğun her şey potansiyel bir saldırı yüzeyi anlamına gelir.
“Tarayıcıda veri tutmak neden risklidir?” sorusuna gelirsek: Çünkü kullanıcı tarafı senin kontrolünde değildir. Cookie, LocalStorage ya da SessionStorage fark etmez; hepsi manipüle edilebilir. Bir saldırgan tarayıcı konsolunu açıp localStorage.setItem('rol', 'admin') diyebilir. Eğer backend bu veriye güveniyorsa, sistem bir anda saldırganın eline geçer. Ayrıca XSS açığı varsa saldırgan tarayıcıdaki tüm LocalStorage verilerini okuyup kendi sunucusuna gönderebilir. Bu yüzden hiçbir zaman hassas bilgiyi (şifre, token, kimlik bilgisi) bu alanlarda saklama. Onun yerine bu tür veriler backend’de tutulmalı, frontend sadece bir referans veya oturum kimliği taşımalı.
Basit bir örnek düşünelim. Diyelim ki bir kullanıcı giriş yaptı ve “karanlık tema” seçeneğini aktif etti. Bu bilgiyi LocalStorage’a kaydedebilirsin. Tarayıcı yeniden açıldığında tema tercihi kalıcı olur. Ama bu sadece bir görünüm tercihidir, kritik bir veri değildir. Fakat bir “kullanıcı_token” bilgisini LocalStorage’a yazarsan, XSS açığı olan bir site bu token’ı alıp hesabına erişebilir. Aynı durum cookie için de geçerli. Aradaki fark, cookie’nin sunucuya otomatik gitmesi, LocalStorage’ın ise sadece JavaScript erişimiyle kullanılabilmesidir. Ama unutma, JavaScript erişimi XSS ile zaten ele geçirilebilir.
Sonuç olarak tarayıcıda veri tutmak pratik görünse de risklidir. Cookie, LocalStorage ve SessionStorage arasında temel fark kullanım amacıdır: Cookie daha çok sunucu-istemci arasında, LocalStorage kalıcı kullanıcı verileri için, SessionStorage ise geçici durumlar için kullanılır. Güvenlik açısından her zaman en az yetkili sistemi kullan, hassas verileri tarayıcıda değil, sunucuda sakla. Çünkü tarayıcı, her zaman kullanıcının elindedir, senin değil.
Bu yazımda yararlı olduğu kadar tehlikeli olabilen Cookieler ve ileri muadillerinden bahsettim. Neyi nasıl depolayacağın en azından kendi projelerinde senin elinde olabilir ama kullanıcıya ait veriyi tarayıcıya emanet ettiğin anda kontrolü kaybedersin. Unutma ki gerçek güvenlik, hiçbir zaman kullanıcı tarafına tam güvenmemekten geçer.
Başka bir yazıda görüşmek üzere…
Kendine iyi bak, iyi şanslar.
yorumlar [ github üzerinden yorum yap ]