Konuyu Açan
#0
Cookie Yönetimi JavaScript ile
Web uygulamaları geliştirirken kullanıcı deneyimini kişiselleştirmek, oturum bilgilerini tutmak veya basit durum yönetimi yapmak için sıklıkla çerezlere (cookie) başvururuz. Tarayıcı tarafında çalışan bu küçük bilgi parçacıkları, istemci ile sunucu arasında adeta bir hafıza görevi görüyor; ancak onları doğru ve güvenli bir şekilde yönetmek, özellikle de JavaScript ile, bazen detaylı bir dikkat gerektirebiliyor. Gelin, bu konuya biraz daha yakından bakalım, nelere dikkat etmemiz gerekiyor, hangi yöntemleri kullanmalıyız...
Çerezler, aslında HTTP protokolünün "durumsuz" (stateless) yapısını aşmak için tasarlanmış basit metin dosyalarıdır. Bir kullanıcı bir web sitesini ziyaret ettiğinde, sunucu bu kullanıcıya özel bazı bilgileri (örneğin, oturum ID'si, dil tercihi, sepet içeriği) çerez olarak tarayıcıya gönderir. Tarayıcı da bu çerezleri saklar ve aynı sunucuya yapılan sonraki her istekte otomatik olarak geri gönderir. Bu sayede sunucu, aynı kullanıcıyı tanıyabilir ve ona özel bir deneyim sunabilir. JavaScript tarafında çerezlerle çalışmak, bu bilgileri dinamik olarak okuma, yazma ve silme yeteneği kazandırır ki bu da modern web uygulamaları için vazgeçilmez bir yetenek, değil mi? Ancak, GDPR, KVKK gibi veri gizliliği düzenlemeleriyle birlikte çerez yönetimi sadece teknik bir konu olmaktan çıkıp, yasal bir zorunluluk haline de geldi. Kullanıcı rızası olmadan çerez yerleştirmek artık ciddi yaptırımlarla karşılaşılabilecek bir durum. İşte tam da bu noktada, JavaScript ile çerezleri nasıl doğru ve bilinçli bir şekilde yöneteceğimizi bilmek hayati önem taşıyor.
Temel Çerez İşlemleri: Oluşturma, Okuma ve Silme
JavaScript'in çerezlerle etkileşim kurmasını sağlayan temel mekanizma
özelliğidir. Bu özellik biraz garip bir davranışa sahip; hem okuma hem de yazma için kullanılıyor ama her iki durumda da farklı kurallara tabi. Hadi tek tek inceleyelim.
Çerez Oluşturma/Ayarlama:
Bir çerez oluşturmak veya mevcut bir çerezi güncellemek için
özelliğine bir string atarız. Bu string'in formatı oldukça spesifiktir:
şeklinde olmalıdır. Buradaki en kritik nokta, her atama işleminde yalnızca bir çerezin ayarlanabilmesidir. Eğer birden fazla çerez ayarlamak istiyorsanız, her biri için ayrı ayrı atama yapmanız gerekir.
İşte basit bir çerez ayarlama örneği:
Çerez Okuma:
özelliğini okuduğunuzda, mevcut domain ve path için erişilebilir olan tüm çerezleri
formatında tek bir string olarak döner. Bu string'i doğrudan kullanamayız; istediğimiz çerezi bulmak için ayrıştırmamız gerekir.
Çerez Silme:
Bir çerezi silmenin aslında doğrudan bir "deleteCookie" metodu yoktur. Bunun yerine, çerezin
değerini geçmiş bir tarihe ayarlayarak veya
değerini
olarak belirterek tarayıcıya bu çerezi silmesini söyleriz. Buradaki önemli bir detay, çerezi ayarlarken kullandığınız
ve
değerlerinin, silme işlemi sırasında da aynı olması gerektiğidir. Aksi takdirde, tarayıcı silmek istediğiniz çerezi bulamaz ve işlem başarısız olur.
Gelişmiş Yaklaşımlar ve Güvenlik Endişeleri
Çerez Kütüphaneleri:
Yukarıdaki manuel çerez yönetimi fonksiyonları, temel işlemler için yeterli olsa da, özellikle büyük ve karmaşık uygulamalarda bu tarz bir yönetimi sürdürmek hem hata yapmaya açıktır hem de zaman alıcı olabilir. İşte bu noktada, popüler çerez yönetim kütüphaneleri devreye giriyor. Örneğin, js-cookie gibi kütüphaneler, çerez işlemlerini çok daha basit ve okunabilir bir hale getirir.
Bu kütüphaneler, çerez değerlerini otomatik olarak URL-encode/decode eder, tarih formatlama gibi detaylarla uğraşmanıza gerek kalmaz ve daha güvenli varsayılan değerler sunar. Projelerinizde bu tür araçları kullanmak, hem geliştirme hızınızı artırır hem de potansiyel hataları minimize eder.
Güvenlik Endişeleri:
Web uygulamaları geliştirirken kullanıcı deneyimini kişiselleştirmek, oturum bilgilerini tutmak veya basit durum yönetimi yapmak için sıklıkla çerezlere (cookie) başvururuz. Tarayıcı tarafında çalışan bu küçük bilgi parçacıkları, istemci ile sunucu arasında adeta bir hafıza görevi görüyor; ancak onları doğru ve güvenli bir şekilde yönetmek, özellikle de JavaScript ile, bazen detaylı bir dikkat gerektirebiliyor. Gelin, bu konuya biraz daha yakından bakalım, nelere dikkat etmemiz gerekiyor, hangi yöntemleri kullanmalıyız...
Çerezler, aslında HTTP protokolünün "durumsuz" (stateless) yapısını aşmak için tasarlanmış basit metin dosyalarıdır. Bir kullanıcı bir web sitesini ziyaret ettiğinde, sunucu bu kullanıcıya özel bazı bilgileri (örneğin, oturum ID'si, dil tercihi, sepet içeriği) çerez olarak tarayıcıya gönderir. Tarayıcı da bu çerezleri saklar ve aynı sunucuya yapılan sonraki her istekte otomatik olarak geri gönderir. Bu sayede sunucu, aynı kullanıcıyı tanıyabilir ve ona özel bir deneyim sunabilir. JavaScript tarafında çerezlerle çalışmak, bu bilgileri dinamik olarak okuma, yazma ve silme yeteneği kazandırır ki bu da modern web uygulamaları için vazgeçilmez bir yetenek, değil mi? Ancak, GDPR, KVKK gibi veri gizliliği düzenlemeleriyle birlikte çerez yönetimi sadece teknik bir konu olmaktan çıkıp, yasal bir zorunluluk haline de geldi. Kullanıcı rızası olmadan çerez yerleştirmek artık ciddi yaptırımlarla karşılaşılabilecek bir durum. İşte tam da bu noktada, JavaScript ile çerezleri nasıl doğru ve bilinçli bir şekilde yöneteceğimizi bilmek hayati önem taşıyor.
Temel Çerez İşlemleri: Oluşturma, Okuma ve Silme
JavaScript'in çerezlerle etkileşim kurmasını sağlayan temel mekanizma
CODE
1document.cookieözelliğidir. Bu özellik biraz garip bir davranışa sahip; hem okuma hem de yazma için kullanılıyor ama her iki durumda da farklı kurallara tabi. Hadi tek tek inceleyelim.
Çerez Oluşturma/Ayarlama:
Bir çerez oluşturmak veya mevcut bir çerezi güncellemek için
CODE
1document.cookieözelliğine bir string atarız. Bu string'in formatı oldukça spesifiktir:
CODE
1"key=value; attribute1=value1; attribute2=value2"şeklinde olmalıdır. Buradaki en kritik nokta, her atama işleminde yalnızca bir çerezin ayarlanabilmesidir. Eğer birden fazla çerez ayarlamak istiyorsanız, her biri için ayrı ayrı atama yapmanız gerekir.
- key=value: Çerezin adı ve değeri. Değer URL-encoded olmalıdır, özellikle özel karakterler içeriyorsa.
- expires=date veya max-age=seconds: Çerezin ne zaman sona ereceğini belirler.
CODE1
expires
için GMT formatında bir tarih string'i (örneğin,
CODE1
new Date().toUTCString()
ile elde edilebilir) kullanılırken,
CODE1
max-age
için saniye cinsinden bir ömür süresi belirtilir. Eğer ikisi de belirtilmezse, çerez oturum çerezi olur ve tarayıcı kapatıldığında silinir.
- path=path: Çerezin hangi URL yolu altında geçerli olacağını belirler. Varsayılan olarak, çerezin ayarlandığı sayfanın yolu kullanılır. Eğer
CODE1
path=/
olarak ayarlanırsa, çerez tüm domain için geçerli olur.
- domain=domain: Çerezin hangi domain için geçerli olacağını belirler. Güvenlik nedeniyle, yalnızca mevcut domain veya onun bir üst domain'i için ayarlanabilir. Alt domain'ler için çerez ayarlayamazsınız.
- secure: Bu bayrak ayarlanırsa, çerez sadece HTTPS bağlantıları üzerinden gönderilir. Güvenlik için şiddetle tavsiye edilir.
- samesite=Lax|Strict|None: Modern tarayıcılar için önemli bir güvenlik özelliği. CSRF (Cross-Site Request Forgery) saldırılarına karşı koruma sağlar.
- Lax (Varsayılan): Çerezler sadece aynı site kaynaklı isteklerde veya kullanıcı üst düzey navigasyon (linke tıklama, URL çubuğuna yazma) ile siteye yönlendirildiğinde gönderilir.
- Strict: Çerezler sadece istek aynı site kaynaklı olduğunda gönderilir. Daha katıdır.
- None: Çerezler, siteler arası isteklerde de gönderilir. Ancak bu durumda
CODE1
Secure
bayrağı da ayarlanmak zorundadır.
- Lax (Varsayılan): Çerezler sadece aynı site kaynaklı isteklerde veya kullanıcı üst düzey navigasyon (linke tıklama, URL çubuğuna yazma) ile siteye yönlendirildiğinde gönderilir.
- httponly: Bu bayrak JavaScript ile ayarlanamaz, sunucu tarafında ayarlanır. Eğer
CODE1
HttpOnly
ayarlanmışsa, çerez
CODE1
document.cookie
üzerinden JavaScript ile erişilemez hale gelir. Bu, XSS (Cross-Site Scripting) saldırılarında çerez hırsızlığını önlemek için kritik bir güvenlik önlemidir.
İşte basit bir çerez ayarlama örneği:
CODE
1234567891011121314151617
function setCookie(name, value, days) {
let expires = "";
if (days) {
const date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
// Path ve SameSite güvenliği için önemli
document.cookie = name + "=" + (value || "") + expires + "; path=/; SameSite=Lax";
}
// Örnek kullanım: 'username' adında, 'John Doe' değerinde, 7 gün süreli bir çerez
setCookie("username", "John Doe", 7);
// Sadece oturum süresince geçerli olacak bir çerez (expires veya max-age yok)
setCookie("lastVisit", new Date().toISOString(), null);
Çerez Okuma:
CODE
1document.cookieözelliğini okuduğunuzda, mevcut domain ve path için erişilebilir olan tüm çerezleri
CODE
1"key1=value1; key2=value2; key3=value3"formatında tek bir string olarak döner. Bu string'i doğrudan kullanamayız; istediğimiz çerezi bulmak için ayrıştırmamız gerekir.
CODE
123456789101112131415161718192021
function getCookie(name) {
const nameEQ = name + "=";
const ca = document.cookie.split(';'); // Tüm çerezleri ayır
for(let i=0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length); // Baştaki boşlukları temizle
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length); // İstenen çerezin değerini döndür
}
}
return null; // Çerez bulunamazsa null döndür
}
// Örnek kullanım: 'username' çerezini oku
const username = getCookie("username");
if (username) {
console.log("Hoş geldiniz, " + username);
} else {
console.log("Henüz giriş yapmadınız.");
}
Çerez Silme:
Bir çerezi silmenin aslında doğrudan bir "deleteCookie" metodu yoktur. Bunun yerine, çerezin
CODE
1expiresdeğerini geçmiş bir tarihe ayarlayarak veya
CODE
1max-agedeğerini
CODE
10olarak belirterek tarayıcıya bu çerezi silmesini söyleriz. Buradaki önemli bir detay, çerezi ayarlarken kullandığınız
CODE
1pathve
CODE
1domaindeğerlerinin, silme işlemi sırasında da aynı olması gerektiğidir. Aksi takdirde, tarayıcı silmek istediğiniz çerezi bulamaz ve işlem başarısız olur.
CODE
123456789
function eraseCookie(name) {
// Geçmiş bir tarih belirterek çerezi sil
// Path'in doğru ayarlanması kritik!
document.cookie = name + "=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}
// Örnek kullanım: 'username' çerezini sil
eraseCookie("username");
Gelişmiş Yaklaşımlar ve Güvenlik Endişeleri
Çerez Kütüphaneleri:
Yukarıdaki manuel çerez yönetimi fonksiyonları, temel işlemler için yeterli olsa da, özellikle büyük ve karmaşık uygulamalarda bu tarz bir yönetimi sürdürmek hem hata yapmaya açıktır hem de zaman alıcı olabilir. İşte bu noktada, popüler çerez yönetim kütüphaneleri devreye giriyor. Örneğin, js-cookie gibi kütüphaneler, çerez işlemlerini çok daha basit ve okunabilir bir hale getirir.
CODE
123456789
// js-cookie ile çerez ayarlama
Cookies.set('myCookie', 'myValue', { expires: 7, path: '/', sameSite: 'Lax', secure: true });
// js-cookie ile çerez okuma
const myCookieValue = Cookies.get('myCookie');
// js-cookie ile çerez silme
Cookies.remove('myCookie', { path: '/' }); // Silme işlemi için de path'in belirtilmesi gerekebilir
Bu kütüphaneler, çerez değerlerini otomatik olarak URL-encode/decode eder, tarih formatlama gibi detaylarla uğraşmanıza gerek kalmaz ve daha güvenli varsayılan değerler sunar. Projelerinizde bu tür araçları kullanmak, hem geliştirme hızınızı artırır hem de potansiyel hataları minimize eder.
Güvenlik Endişeleri: