Node.js İle Redis Kullanarak Oturum Yönetimi Nasıl Yapılır?

Node.js İle Redis Kullanarak Oturum Yönetimi Nasıl Yapılır?
Node.js İle Redis Kullanarak Oturum Yönetimi Nasıl Yapılır?

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ında secret anahtarını asla kod içerisine yazmayın. Mutlaka ortam değişkenleri (environment variables) kullanın ve secure: true ayarı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: true ve sameSite: '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.

Bu yazıya tepkinizi paylaşın:
Kerem Demir

Dijital araçlar ve kişisel verimlilik üzerine uzmanlaşmış profesyonel bir yazarım. Karmaşık konuları basit ve anlaşılır kılmak için rehber odaklı içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz