Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sisteminizde Node.js (2026 itibarıyla LTS sürümü olan v22 veya üzeri önerilir) ve Redis sunucusunun yüklü olması gerekir. Redis, verileri RAM üzerinde tutan bir anahtar-değer (key-value) deposu olduğu için disk tabanlı veritabanlarına göre milisaniyeler düzeyinde daha hızlı yanıt verir.
- Node.js v22+
- Redis Server v7.0+
- npm veya pnpm paket yöneticisi
- Temel Express.js bilgisi
Gerekli kütüphaneleri projenize dahil etmek için terminalde aşağıdaki komutu çalıştırarak bağımlılıkları yükleyin:
npm install express express-session redis connect-redis dotenv
Bu komut; web çatısı (Express), oturum yönetimi ara katmanı (express-session), Redis bağlantı sürücüsü (redis) ve Redis oturum deposunu (connect-redis) projenize ekler.
Redis ve Node.js Bağlantısını Kurma
Redis bağlantısını yapılandırmak, uygulamanızın oturum verilerini nereye yazacağını belirler. Redis istemcisini (client) doğru yapılandırmak, bağlantı kopmaları veya zaman aşımı durumlarında uygulamanın çökmesini engeller.
const { createClient } = require('redis');
const RedisStore = require('connect-redis').default;
// Redis istemcisini oluştur
const redisClient = createClient({
url: 'redis://localhost:6379'
});
redisClient.connect().catch(console.error);
// İstemciyi oturum deposuna bağla
const redisStore = new RedisStore({
client: redisClient,
prefix: "myapp:",
});
Burada prefix kullanımı, Redis veritabanınızda oturum anahtarlarını diğer verilerden ayırmak için önemlidir. Bu sayede aynı Redis sunucusunu farklı projeler için kullanabilirsiniz.
Express-Session ile Oturum Yapılandırması
Oturum yönetimi için express-session kütüphanesini kullanırken güvenlik ayarları hayati önem taşır. Özellikle secret anahtarının gizli tutulması ve cookie ayarlarının üretim ortamına göre yapılandırılması gerekir.
const session = require('express-session');
app.use(session({
store: redisStore,
secret: process.env.SESSION_SECRET, // .env dosyasından alınmalı
resave: false,
saveUninitialized: false,
cookie: {
secure: process.env.NODE_ENV === 'production', // Sadece HTTPS'de çalışır
httpOnly: true, // XSS saldırılarını önler
maxAge: 1000 * 60 * 60 * 24 // 24 saat
}
}));
saveUninitialized: false ayarı, boş oturumların sunucuya kaydedilmesini engeller ve Redis üzerinde gereksiz yer kaplamasını önler. httpOnly: true ise çerezlerin JavaScript ile okunmasını engelleyerek XSS saldırılarına karşı koruma sağlar.
Güvenlik Uyarısı: Üretim ortamındasecretanahtarını asla kod içerisine yazmayın. Mutlaka ortam değişkenleri (environment variables) kullanın vesecure: trueayarını aktif ederek sadece HTTPS üzerinden trafiği kabul edin.
Oturum Verilerini Okuma ve Yazma
Oturum yapılandırıldıktan sonra, req.session nesnesi üzerinden kullanıcı verilerini kolayca yönetebilirsiniz. Aşağıdaki örnek, bir kullanıcı giriş yaptığında oturum verisinin nasıl kaydedildiğini gösterir.
app.post('/login', (req, res) => {
const { username } = req.body;
req.session.user = { username, role: 'admin' };
res.send('Oturum başarıyla başlatıldı.');
});
app.get('/profile', (req, res) => {
if (req.session.user) {
res.json(req.session.user);
} else {
res.status(401).send('Oturum bulunamadı.');
}
});
Bu kod bloğu, kullanıcının bilgilerini Redis üzerinde şifreli bir oturum ID'si ile eşleştirir. Sunucu tarafında oturum verisi değiştiğinde Redis otomatik olarak güncellenir.
Oturum Yönetim Yöntemlerinin Karşılaştırılması
| Yöntem | Performans | Ölçeklenebilirlik | Kalıcılık |
|---|---|---|---|
| Memory Store (Default) | Çok Yüksek | Düşük (Sunucu yeniden başlarsa silinir) | Yok |
| Redis Store | Yüksek | Çok Yüksek (Dağıtık sistemlere uygun) | Var |
| Database Store (SQL) | Düşük | Orta | Tam |
Yaygın Hatalar ve Debug İpuçları
Redis ile oturum yönetimi yaparken en sık karşılaşılan sorun bağlantı hatalarıdır. Redis sunucusu beklenmedik şekilde kapandığında uygulamanızın "hata fırlatması" yerine, bağlantıyı yeniden deneme (retry) stratejisi izlemesi gerekir.
// Bağlantı kopmalarını yönetmek için
redisClient.on('error', (err) => console.log('Redis Hatası:', err));
redisClient.on('connect', () => console.log('Redis bağlantısı kuruldu.'));
Eğer oturumlar beklenmedik şekilde siliniyorsa, Redis üzerindeki maxmemory-policy ayarlarını kontrol edin. Redis hafızası dolduğunda eski anahtarları silme (eviction) politikası oturumlarınızı sonlandırıyor olabilir.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Uygulamanızın güvenlik politikaları, şifreleme yöntemleri ve veri gizliliği standartları tamamen sizin sorumluluğunuzdadır. Üretim ortamına almadan önce güvenlik denetimlerinden (audit) geçirdiğinizden emin olun.
Sıkça Sorulan Sorular
Redis oturumları neden disk yerine RAM'de tutulur?
RAM, disk erişimine göre binlerce kat daha hızlıdır. Oturum verileri her istekte (request) okunduğu için, en yüksek performansı sağlamak adına Redis gibi bellek tabanlı yapılar tercih edilir.
Redis sunucum çökerse kullanıcıların oturumu biter mi?
Evet, eğer Redis'i kalıcı hale getirme (persistence) ayarlarını (RDB veya AOF) yapılandırmadıysanız, sunucu yeniden başladığında tüm oturumlar kaybolur. Üretim ortamında AOF (Append Only File) modunu açmanız önerilir.
Birden fazla Node.js sunucusu aynı Redis'i kullanabilir mi?
Kesinlikle evet. Redis'in en büyük avantajı budur. Yük dengeleyici (Load Balancer) arkasındaki tüm Node.js sunucularınız aynı Redis sunucusuna bağlanarak merkezi bir oturum yönetimi sağlar.
Oturum süresini (timeout) nasıl uzatabilirim?
cookie.maxAge değerini milisaniye cinsinden artırarak oturum ömrünü uzatabilirsiniz. Örneğin 1 saat için 3600000 değerini kullanın.
Redis'te oturum verisi nasıl temizlenir?
Redis komut satırı üzerinden DEL myapp:sessionID komutuyla tek bir oturumu veya FLUSHDB ile tüm veritabanını temizleyebilirsiniz.
Redis Oturumlarında Performans Optimizasyonu ve İleri İpuçları
Redis tabanlı oturum yönetiminde performans, özellikle yüksek trafikli uygulamalarda kritik bir rol oynar. Varsayılan yapılandırmalar çoğu zaman yeterli olsa da, ölçeklenebilirliği artırmak için bazı ileri düzey stratejiler uygulayabilirsiniz.
Bağlantı Havuzu (Connection Pooling) Kullanımı
Node.js uygulamanızda her istek için yeni bir Redis bağlantısı açmak yerine, bağlantı havuzu (pool) kullanmak gecikme sürelerini (latency) ciddi oranda düşürür. ioredis kütüphanesi, bağlantı havuzunu otomatik olarak yönetir ancak yapılandırmayı optimize etmek önemlidir.
const Redis = require('ioredis');
const redis = new Redis({
port: 6379,
host: '127.0.0.1',
family: 4,
lazyConnect: true,
enableAutoPipelining: true, // Performans için pipelining aktif edilmeli
maxRetriesPerRequest: 3
});
Oturum Verilerini Serileştirme (Serialization)
Redis'e kaydedilen verilerin boyutu, ağ trafiğini ve bellek kullanımını doğrudan etkiler. Varsayılan olarak express-session verileri JSON formatında saklar. Eğer oturum nesneniz çok büyükse, veriyi saklamadan önce sıkıştırmak veya sadece gerekli alanları tutmak bellek maliyetini düşürür.
İpucu: Oturum nesnesine tüm kullanıcı profilini gömmek yerine, sadece userId bilgisini tutun ve kullanıcı detaylarını gerektiğinde veritabanından (örneğin MongoDB veya PostgreSQL) çekin.
Üretim Ortamında (Production) Güvenlik ve Deployment
Geliştirme ortamında çalışan Redis yapılandırması, canlıya alırken (deployment) mutlaka güvenlik önlemleriyle desteklenmelidir. Redis, varsayılan olarak şifresiz gelebilir, bu yüzden şu adımları izlemek zorunludur:
- ACL (Access Control List): Redis 6.0 ve üzeri sürümlerde kullanıcı bazlı yetkilendirme kullanarak oturum verilerine erişimi kısıtlayın.
- TLS/SSL Şifreleme: Redis sunucunuz ile Node.js uygulamanız arasındaki trafiği şifrelemek için TLS kullanın.
- Çerez Güvenliği: Üretim ortamında
secure: truevesameSite: 'strict'ayarlarını mutlaka aktif edin.
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // Sadece HTTPS üzerinden gönderilir
httpOnly: true, // JavaScript ile erişimi engeller
sameSite: 'strict',
maxAge: 1000 * 60 * 60 // 1 saat
}
}));
Redis Oturumlarını İzleme ve Test Etme
Sistemin sağlıklı çalıştığından emin olmak için düzenli olarak oturumların Redis'teki durumunu kontrol etmelisiniz. redis-cli üzerinden MONITOR komutunu kullanarak, uygulamanızın Redis'e gönderdiği tüm komutları gerçek zamanlı olarak izleyebilir ve olası darboğazları tespit edebilirsiniz.
Dikkat: MONITOR komutu yoğun sistemlerde performans kaybına yol açabilir, bu nedenle sadece hata ayıklama (debugging) süreçlerinde kısa süreliğine kullanın.
Test aşamasında ise supertest gibi araçlarla oturumun çerez üzerinden doğru şekilde set edilip edilmediğini ve Redis'te anahtarın (key) oluşup oluşmadığını birim testlerinizde doğrulamanız önerilir.
Sonuç
Node.js ile Redis kullanarak oturum yönetimi, uygulamanızın hem performansını artırır hem de yatay ölçeklenebilirliğini sağlar. Bu rehberde öğrendiğiniz Redis bağlantı yapılandırması, güvenli çerez yönetimi ve oturum saklama pratikleri, profesyonel bir backend mimarisinin temel taşlarıdır. Bir sonraki adım olarak, Redis üzerinde oturumları izlemek için "Redis Insight" gibi araçları kurabilir ve oturum trafiğinizi görselleştirebilirsiniz.


Yorumlar (0)
Yorum Yaz