Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] Express ile Cookie Okuma ve Yazma
Cookie'ler HTTP protokolünün durumsuz (stateless) doğasını aşmak için kullanılan mekanizmadır. Sunucu istemciye bir cookie gönderir, istemci bu cookie'yi saklar ve sonraki isteklerde otomatik olarak sunucuya geri gönderir. Kullanıcı tercihleri, oturum yönetimi, takip ve kişiselleştirme gibi birçok alanda cookie'ler kullanılır.
Express'te cookie yazmak için res.cookie() metodunu kullanırsınız. Bu metod Set-Cookie header'ını response'a ekler. Cookie okumak için ise cookie-parser middleware'ini kurmanız gerekir. Bu middleware Cookie header'ını parse eder ve req.cookies objesine yazar. npm install cookie-parser ile kurup app.use(cookieParser()) ile etkinleştirirsiniz.
Ben cookie'lerle ilk çalışırken en çok yapılan hatayı yaptım: hassas verileri düz cookie'de sakladım. Kullanıcı ID'sini şifrelenmemiş cookie'de tutuyordum ve birisi bu cookie'yi değiştirerek başka bir kullanıcı gibi giriş yapabiliyordu. O zamandan beri hassas veriler için signed cookie veya session kullanıyorum.
Cookie opsiyonları güvenlik açısından çok önemli. httpOnly true olduğunda cookie JavaScript'ten erişilemez, bu XSS saldırılarına karşı koruma sağlar. secure true olduğunda cookie sadece HTTPS üzerinden gönderilir. sameSite opsiyonu CSRF saldırılarına karşı koruma sağlar: 'Strict' en güvenli, 'Lax' yaygın kullanım, 'None' ise cross-site isteklerde gerekli.
maxAge veya expires opsiyonlarıyla cookie'nin ömrünü belirlersiniz. maxAge milisaniye cinsinden süre alır. Session cookie (expire belirtilmeyen) tarayıcı kapatıldığında silinir. Persistent cookie ise belirtilen süre boyunca kalır. Gereksiz yere uzun ömürlü cookie oluşturmaktan kaçının.
Signed cookie'ler cookie değerinin manipüle edilip edilmediğini tespit etmenizi sağlar. cookie-parser'a bir secret verirsiniz ve res.cookie() çağırırken signed: true yaparsınız. Cookie'nin değeri değiştirilirse req.signedCookies'te undefined olur. Bu cookie'nin şifrelendiği anlamına gelmez, sadece bütünlüğünü doğrular.
Cookie boyutu sınırlıdır, genellikle 4KB. Büyük verileri cookie'de saklamayın. Ayrıca her istekte cookie'ler sunucuya gönderildiği için büyük cookie'ler gereksiz ağ trafiği oluşturur. Büyük verileri sunucu tarafında session'da tutup sadece session ID'sini cookie'de saklayın.
Third-party cookie'ler giderek kısıtlanıyor. Chrome başta olmak üzere tarayıcılar üçüncü parti cookie'leri engelliyor. Bu reklam ve takip amaçlı kullanılan cookie'leri etkiliyor. Eğer uygulamanız farklı domain'ler arasında cookie paylaşıyorsa bu değişiklikleri takip etmeniz önemli.
KVKK ve GDPR gibi düzenlemeler cookie kullanımı konusunda kullanıcı izni almayı zorunlu kılıyor. Özellikle analitik ve reklam amaçlı cookie'ler için cookie consent banner'ı göstermeniz ve kullanıcının tercihlerini saklmanız gerekiyor. Zorunlu cookie'ler (oturum yönetimi gibi) genellikle izin gerektirmez ama bilgilendirme yapmanız yine de iyi bir pratik.
JavaScript:
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
// Cookie parser middleware - secret ile signed cookie destegi
const COOKIE_SECRET = process.env.COOKIE_SECRET || 'gizli-cookie-anahtari-2024';
app.use(cookieParser(COOKIE_SECRET));
app.use(express.json());
app.use(express.urlencoded({{ extended: true }}));
// ===== COOKIE YAZMA ORNEKLERI =====
// Basit cookie
app.get('/cookie/yaz', (req, res) => {{
// Temel cookie
res.cookie('ziyaretci', 'true', {{
maxAge: 7 * 24 * 60 * 60 * 1000, // 7 gun
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'Lax',
}});
// Tercih cookie'si
res.cookie('tema', req.query.tema || 'acik', {{
maxAge: 365 * 24 * 60 * 60 * 1000, // 1 yil
httpOnly: false, // JavaScript'ten erisilebilir (tema degisikligi icin)
sameSite: 'Lax',
}});
// Dil tercihi
res.cookie('dil', req.query.dil || 'tr', {{
maxAge: 365 * 24 * 60 * 60 * 1000,
httpOnly: false,
sameSite: 'Lax',
}});
// Signed cookie (degistirilemez)
res.cookie('kullaniciId', '42', {{
signed: true,
maxAge: 24 * 60 * 60 * 1000, // 1 gun
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'Strict',
}});
res.json({{
mesaj: 'Cookie\'ler yazildi',
ipucu: '/cookie/oku adresini ziyaret ederek okuyabilirsiniz',
}});
}});
// ===== COOKIE OKUMA =====
app.get('/cookie/oku', (req, res) => {{
res.json({{
normalCookieler: req.cookies,
signedCookieler: req.signedCookies,
ziyaretci: req.cookies.ziyaretci || 'Yok',
tema: req.cookies.tema || 'Ayarlanmamis',
dil: req.cookies.dil || 'Ayarlanmamis',
kullaniciId: req.signedCookies.kullaniciId || 'Yok',
}});
}});
// ===== COOKIE SILME =====
app.get('/cookie/sil', (req, res) => {{
res.clearCookie('ziyaretci');
res.clearCookie('tema');
res.clearCookie('dil');
res.clearCookie('kullaniciId');
res.json({{ mesaj: 'Tum cookie\'ler silindi' }});
}});
// ===== PRATIK ORNEK: ZIYARET SAYACI =====
app.get('/sayac', (req, res) => {{
let ziyaretSayisi = parseInt(req.cookies.ziyaretSayisi) || 0;
ziyaretSayisi++;
res.cookie('ziyaretSayisi', ziyaretSayisi.toString(), {{
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 gun
httpOnly: true,
}});
let sonZiyaret = req.cookies.sonZiyaret || 'Ilk ziyaretiniz';
res.cookie('sonZiyaret', new Date().toISOString(), {{
maxAge: 30 * 24 * 60 * 60 * 1000,
httpOnly: true,
}});
res.json({{
ziyaretSayisi,
sonZiyaret,
mesaj: `Bu sayfayi ${{ziyaretSayisi}}. kez ziyaret ediyorsunuz`,
}});
}});
// ===== TEMA TERCIHI =====
app.get('/tema/:mod', (req, res) => {{
const gecerliTemalar = ['acik', 'koyu', 'otomatik'];
const tema = req.params.mod;
if (!gecerliTemalar.includes(tema)) {{
return res.status(400).json({{
hata: 'Gecersiz tema',
gecerliDegerler: gecerliTemalar,
}});
}}
res.cookie('tema', tema, {{
maxAge: 365 * 24 * 60 * 60 * 1000,
httpOnly: false,
sameSite: 'Lax',
}});
res.json({{ mesaj: `Tema '${{tema}}' olarak ayarlandi` }});
}});
// ===== COOKIE TABANLI BASIT AUTH =====
app.post('/giris', (req, res) => {{
const {{ kullanici, sifre }} = req.body;
if (kullanici === 'admin' && sifre === 'sifre123') {{
// Signed ve httpOnly cookie ile oturum
res.cookie('oturum', JSON.stringify({{
id: 1,
kullanici: 'admin',
girisZamani: Date.now(),
}}), {{
signed: true,
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'Strict',
maxAge: 2 * 60 * 60 * 1000, // 2 saat
}});
return res.json({{ mesaj: 'Giris basarili' }});
}}
res.status(401).json({{ hata: 'Hatali kullanici adi veya sifre' }});
}});
app.get('/cikis', (req, res) => {{
res.clearCookie('oturum');
res.json({{ mesaj: 'Cikis yapildi' }});
}});
app.get('/profil', (req, res) => {{
const oturum = req.signedCookies.oturum;
if (!oturum) {{
return res.status(401).json({{ hata: 'Giris yapmaniz gerekiyor' }});
}}
try {{
const kullanici = JSON.parse(oturum);
res.json({{ mesaj: 'Profil sayfasi', kullanici }});
}} catch {{
res.clearCookie('oturum');
res.status(401).json({{ hata: 'Gecersiz oturum' }});
}}
}});
app.listen(3000, () => {{
console.log('Cookie sunucusu port 3000\'de');
console.log('Test: http://localhost:3000/cookie/yaz');
}});
Cookie yönetimi web geliştirmenin temel konularından biri. Doğru kullanıldığında çok faydalı ama güvenlik açıklarına da kapı aralayabilir. httpOnly, secure ve sameSite opsiyonlarını her zaman doğru ayarlayın. Hassas veriler için signed cookie veya session kullanın. Cookie consent konusunu da ihmal etmeyin.
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

