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 Session Yönetimi
Session yönetimi web uygulamalarında kullanıcı durumunu takip etmenin en güvenilir yoludur. Cookie'lerden farklı olarak veriler sunucu tarafında saklanır, istemciye sadece bir session ID gönderilir. Bu ID bir cookie ile taşınır ve her istekte sunucu bu ID'yi kullanarak kullanıcının verilerini bulur. Hassas veriler asla istemciye gönderilmez.
express-session paketi Express'te session yönetimini kolaylaştırır. npm install express-session ile kurarsınız. Varsayılan olarak session verileri bellekte (MemoryStore) tutulur. Bu geliştirme ortamı için uygundur ama production'da kesinlikle kullanılmamalıdır çünkü sunucu restart edildiğinde tüm session'lar kaybolur ve bellek sızıntısına neden olabilir.
Production ortamında session store olarak Redis, MongoDB veya PostgreSQL kullanmalısınız. Redis en popüler seçenek çünkü son derece hızlı ve TTL (Time-To-Live) desteği var. connect-redis paketi ile Express session'ı Redis'e bağlamak çok kolay.
Session konfigürasyonunda secret değeri çok önemli. Session ID'sinin imzalanması için kullanılır ve güçlü bir değer olmalıdır. Asla kodun içine yazmayın, environment variable olarak tutun. Ben ilk projemde secret olarak "keyboard cat" yazmıştım çünkü dokümantasyondaki örneği aynen kopyalamıştım. Production'a o şekilde çıktığımı düşünmek bile istemiyorum.
resave ve saveUninitialized opsiyonları sık karıştırılır. resave: false session değişmediyse store'a tekrar kaydetmeyi engeller, gereksiz yazma operasyonlarını önler. saveUninitialized: false yeni ama modifiye edilmemiş session'ları kaydetmeyi engeller. GDPR uyumluluğu için saveUninitialized'ı false yapmak önerilir çünkü kullanıcı izni olmadan session oluşturmazsınız.
Session hijacking saldırılarına karşı önlem almak gerekir. Session ID'sini düzenli olarak yenilemek (session regeneration), cookie'yi httpOnly ve secure olarak ayarlamak, IP ve User-Agent kontrolü yapmak güvenliği artırır. Özellikle kullanıcı giriş yaptıktan sonra session ID'sini yenilemek kritik bir güvenlik önlemidir.
Session timeout süresi uygulamanıza göre ayarlanmalıdır. Bankacılık uygulamalarında 15-30 dakika, normal web sitelerinde birkaç saat veya birkaç gün olabilir. cookie.maxAge ile süreyi belirlersiniz. Ayrıca rolling: true opsiyonu ile her istekte süreyi yeniden başlatabilirsiniz. Böylece aktif kullanıcılar sürekli oturumda kalır.
Flash message'lar session ile çok güzel çalışır. Bir sonraki istekte gösterilip otomatik silinen mesajlardır. Form gönderiminden sonra "Kayıt başarılı" gibi bir mesaj göstermek istediğinizde kullanılır. connect-flash paketi bu işi kolaylaştırır ama kendi implementasyonunuzu yazmak da çok zor değil.
JavaScript:
const express = require('express');
const session = require('express-session');
const crypto = require('crypto');
const app = express();
// npm install express-session
app.use(express.json());
app.use(express.urlencoded({{ extended: true }}));
// Session yapilandirmasi
app.use(session({{
secret: process.env.SESSION_SECRET || crypto.randomBytes(32).toString('hex'),
resave: false,
saveUninitialized: false,
name: 'sessionId', // Varsayilan 'connect.sid' yerine ozel isim (guvenlik)
cookie: {{
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 2 * 60 * 60 * 1000, // 2 saat
}},
// Production'da Redis store kullanin:
// store: new RedisStore({{ client: redisClient }}),
}}));
// Flash message middleware
app.use((req, res, next) => {{
// Session'dan flash mesajlari al ve sil
res.locals.flashMessages = req.session.flash || {{}};
delete req.session.flash;
// Flash mesaj ekleme fonksiyonu
req.flash = function(tip, mesaj) {{
if (!req.session.flash) req.session.flash = {{}};
if (!req.session.flash[tip]) req.session.flash[tip] = [];
req.session.flash[tip].push(mesaj);
}};
next();
}});
// Kullanici veritabani (ornekte basit obje)
const kullanicilar = [
{{ id: 1, kullaniciAdi: 'ahmet', sifre: 'ahmet123', ad: 'Ahmet Yilmaz', rol: 'admin' }},
{{ id: 2, kullaniciAdi: 'zeynep', sifre: 'zeynep123', ad: 'Zeynep Kaya', rol: 'user' }},
];
// Auth middleware
function authGerekli(req, res, next) {{
if (!req.session.kullanici) {{
req.flash('hata', 'Lutfen giris yapin');
return res.redirect('/giris');
}}
next();
}}
// ===== ROUTE'LAR =====
app.get('/', (req, res) => {{
const flashHata = res.locals.flashMessages.hata || [];
const flashBasari = res.locals.flashMessages.basari || [];
res.send(`
<h1>Session Ornegi</h1>
${{flashHata.map(m => `<div style="color:red">${{m}}</div>`).join('')}}
${{flashBasari.map(m => `<div style="color:green">${{m}}</div>`).join('')}}
${{req.session.kullanici
? `<p>Hosgeldin, ${{req.session.kullanici.ad}}!</p>
<p>Rol: ${{req.session.kullanici.rol}}</p>
<p>Giris zamani: ${{new Date(req.session.girisZamani).toLocaleString('tr-TR')}}</p>
<p>Sayfa goruntulenme: ${{req.session.sayfaGoruntulenme || 0}}</p>
<a href="/profil">Profil</a> |
<a href="/cikis">Cikis Yap</a>`
: '<a href="/giris">Giris Yap</a>'
}}
`);
// Sayfa goruntulenme sayaci
req.session.sayfaGoruntulenme = (req.session.sayfaGoruntulenme || 0) + 1;
}});
// Giris sayfasi
app.get('/giris', (req, res) => {{
if (req.session.kullanici) return res.redirect('/');
const flashHata = res.locals.flashMessages.hata || [];
res.send(`
<h1>Giris Yap</h1>
${{flashHata.map(m => `<div style="color:red">${{m}}</div>`).join('')}}
<form method="POST" action="/giris">
<input name="kullaniciAdi" placeholder="Kullanici Adi" required><br><br>
<input name="sifre" type="password" placeholder="Sifre" required><br><br>
<button type="submit">Giris</button>
</form>
<p>Test: ahmet/ahmet123 veya zeynep/zeynep123</p>
`);
}});
// Giris islemi
app.post('/giris', (req, res) => {{
const {{ kullaniciAdi, sifre }} = req.body;
const kullanici = kullanicilar.find(
k => k.kullaniciAdi === kullaniciAdi && k.sifre === sifre
);
if (!kullanici) {{
req.flash('hata', 'Hatali kullanici adi veya sifre');
return res.redirect('/giris');
}}
// Session fixation saldirisi onlemi - yeni session ID olustur
req.session.regenerate((err) => {{
if (err) {{
console.error('Session regenerate hatasi:', err);
return res.redirect('/giris');
}}
// Kullanici bilgilerini session'a kaydet
req.session.kullanici = {{
id: kullanici.id,
kullaniciAdi: kullanici.kullaniciAdi,
ad: kullanici.ad,
rol: kullanici.rol,
}};
req.session.girisZamani = Date.now();
req.flash('basari', `Hosgeldiniz, ${{kullanici.ad}}!`);
res.redirect('/');
}});
}});
// Cikis
app.get('/cikis', (req, res) => {{
req.session.destroy((err) => {{
if (err) console.error('Session destroy hatasi:', err);
res.clearCookie('sessionId');
res.redirect('/');
}});
}});
// Profil (auth gerekli)
app.get('/profil', authGerekli, (req, res) => {{
res.json({{
kullanici: req.session.kullanici,
sessionId: req.sessionID,
girisZamani: new Date(req.session.girisZamani).toLocaleString('tr-TR'),
sayfaGoruntulenme: req.session.sayfaGoruntulenme || 0,
}});
}});
// Aktif session'lar (admin)
app.get('/admin/sessionlar', authGerekli, (req, res) => {{
if (req.session.kullanici.rol !== 'admin') {{
return res.status(403).json({{ hata: 'Admin yetkisi gerekli' }});
}}
// MemoryStore ile aktif session sayisini gosterme
const store = req.sessionStore;
if (store.all) {{
store.all((err, sessions) => {{
res.json({{
aktifSessionSayisi: sessions ? Object.keys(sessions).length : 0,
}});
}});
}} else {{
res.json({{ mesaj: 'Session store all() desteklemiyor' }});
}}
}});
app.listen(3000, () => {{
console.log('Session sunucusu http://localhost:3000');
}});
Session yönetimi web uygulamalarının temel taşlarından biri. Doğru yapılandırma ve güvenlik önlemleriyle kullanıcılarınıza güvenli bir deneyim sunabilirsiniz. Production'da mutlaka Redis gibi kalıcı bir store kullanın ve session güvenlik ayarlarını 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!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 0
- Görüntüleme
- 52
- Cevaplar
- 5
- Görüntüleme
- 3K
