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 (v20 veya üzeri önerilir) ve Redis sunucusunun kurulu olması gerekir. Redis'in yerel makinenizde veya bir bulut sağlayıcısı üzerinde çalışıyor olması yeterlidir. Proje dizininizi oluşturun ve gerekli paketleri yükleyin.

# Proje dizinini oluşturun
mkdir node-redis-session
cd node-redis-session

# Projeyi başlatın
npm init -y

# Gerekli paketleri kurun
npm install express express-session connect-redis redis dotenv

Yukarıdaki komutlar ile Express.js, oturum yönetimi için express-session, Redis entegrasyonu için connect-redis ve Redis istemci kütüphanesini projenize dahil etmiş oldunuz. dotenv paketi ise hassas bilgileri (Redis URL gibi) ortam değişkenlerinde saklamanıza yardımcı olacaktır.

Redis İstemcisini Yapılandırma

Redis istemcisini doğru bir şekilde tanımlamak, uygulamanın oturum deposu ile sağlıklı iletişim kurmasını sağlar. 2026 yılı itibarıyla Redis istemcisi olarak redis paketinin güncel sürümünü ve connect-redis ile uyumlu bağlantı ayarlarını kullanacağız.

// redisClient.js
import { createClient } from 'redis';

const redisClient = createClient({
    url: process.env.REDIS_URL || 'redis://localhost:6379'
});

redisClient.on('error', (err) => console.error('Redis Hata:', err));
redisClient.on('connect', () => console.log('Redis bağlantısı kuruldu.'));

await redisClient.connect();

export default redisClient;

Bu kod bloğu, Redis sunucusuna bağlantı kurar. await redisClient.connect() kullanımı, bağlantının asenkron olarak gerçekleşmesini sağlar. Hata yönetimi için on('error') dinleyicisi eklemek, bağlantı kesilmelerinde uygulamanın çökmesini engeller.

Express-Session ve Redis Entegrasyonu

express-session middleware'ini, oturumları varsayılan bellek yerine Redis üzerinde saklayacak şekilde yapılandırmalıyız. Bu adım, oturumların kalıcılığını ve performansını belirler.

// app.js
import session from 'express-session';
import { RedisStore } from 'connect-redis';
import redisClient from './redisClient.js';

const sessionMiddleware = session({
    store: new RedisStore({ client: redisClient }),
    secret: process.env.SESSION_SECRET, // Güçlü bir anahtar kullanın
    resave: false,
    saveUninitialized: false,
    cookie: {
        secure: process.env.NODE_ENV === 'production', // Üretimde true olmalı
        httpOnly: true,
        maxAge: 1000 * 60 * 60 * 24 // 24 saat
    }
});

Burada saveUninitialized: false ayarı, oturum açılmamış kullanıcılar için sunucuda boş oturum oluşturulmasını engeller. httpOnly: true ise çerezlerin JavaScript ile okunmasını engelleyerek XSS saldırılarına karşı temel bir koruma sağlar.

Kritik Güvenlik Uyarısı: secret anahtarınızı asla kod içerisinde paylaşmayın. Mutlaka bir ortam değişkeni (.env dosyası) üzerinden yönetin ve üretim ortamında uzun, rastgele karakterlerden oluşan bir dizi kullanın.

Oturum Verilerini Kaydetme ve Okuma

Kullanıcı giriş yaptığında oturum verilerini req.session nesnesi üzerinden yönetebilirsiniz. Redis, bu verileri otomatik olarak serileştirerek (serialize) saklar.

// loginRoutes.js
app.post('/login', (req, res) => {
    const { username } = req.body;
    
    // Basit bir kimlik doğrulama örneği
    req.session.user = { username, role: 'admin' };
    
    res.send('Giriş başarılı, oturum oluşturuldu.');
});

app.get('/profile', (req, res) => {
    if (!req.session.user) return res.status(401).send('Yetkisiz erişim.');
    res.json(req.session.user);
});

Bu örnekte, /login rotasında oturum nesnesine kullanıcı bilgisi eklenir. /profile rotasında ise oturumun varlığı kontrol edilerek veriye erişim sağlanır. Redis, bu veriyi arka planda anahtar-değer çifti olarak tutar.

Oturum Yönetimi Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Bellek (MemoryStore) Hızlı, kurulum gerektirmez. Sunucu yeniden başlarsa veriler silinir, ölçeklenemez.
Redis Kalıcı, yüksek performanslı, dağıtık sistemlere uygun. Ek altyapı (Redis sunucusu) gerektirir.
Veritabanı (SQL/NoSQL) Kalıcı, karmaşık sorgulara uygun. Redis'e göre daha yavaş, veritabanı yükünü artırır.

Yaygın Hatalar ve Debug İpuçları

Geliştiricilerin sıkça yaptığı hatalardan biri, Redis bağlantısının zaman aşımına uğraması veya oturum anahtarının (secret) değiştirilmesidir. Eğer kullanıcılar sürekli oturumdan atılıyorsa, Redis bağlantı durumunu kontrol edin.

  • Bağlantı Sorunları: Redis'in çalıştığından ve REDIS_URL değerinin doğru olduğundan emin olun.
  • Serileştirme Hataları: Oturum nesnesine çok büyük veya karmaşık (döngüsel referanslı) veriler eklemeyin.
  • Cookie Güvenliği: HTTPS kullanmıyorsanız secure: true ayarını aktif etmeyin, aksi takdirde çerezler tarayıcı tarafından reddedilir.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce mutlaka kapsamlı güvenlik testleri yapın, girdi doğrulamalarını (input validation) ihmal etmeyin ve bağımlılıklarınızı güncel tutun.

Sıkça Sorulan Sorular

Redis oturumları neden bellekten daha güvenli?

Bellek tabanlı oturumlar sunucu çöktüğünde kaybolur. Redis, verileri diskte kalıcı hale getirebilir ve birden fazla Node.js örneği arasında paylaşılan merkezi bir depolama sağlar.

Oturum süresi nasıl uzatılır?

express-session yapılandırmasındaki maxAge değerini milisaniye cinsinden artırarak oturum ömrünü uzatabilirsiniz.

Redis sunucum şifreliyse ne yapmalıyım?

redis://:sifreniz@localhost:6379 formatında bir bağlantı dizesi kullanarak kimlik doğrulama gerçekleştirebilirsiniz.

Oturum verileri Redis'te nasıl görünür?

Redis CLI üzerinden KEYS * komutu ile oturum anahtarlarını görebilir, GET [anahtar_adi] ile içeriği inceleyebilirsiniz.

Redis'i üretim ortamında nasıl korumalıyım?

Redis'i dış dünyaya kapatın, güçlü bir şifre belirleyin ve mümkünse sadece yerel ağ veya VPC üzerinden erişime izin verin.

Redis Oturum Yönetiminde İleri Düzey Performans Optimizasyonu

Redis, varsayılan ayarlarıyla oldukça hızlı çalışsa da, yüksek trafikli Node.js uygulamalarında oturum yönetimi süreçlerini daha da optimize etmek mümkündür. Özellikle oturum verilerinin boyutu arttıkça, Redis ile olan ağ trafiğini yönetmek kritik hale gelir.

Bağlantı Havuzu (Connection Pooling) Kullanımı

Her istekte yeni bir Redis bağlantısı açmak yerine, bağlantı havuzu kullanarak mevcut bağlantıları yeniden kullanmalısınız. connect-redis kütüphanesi bunu arka planda yönetse de, Redis istemcisini yapılandırırken socket ayarlarını optimize etmek performansı artırır.

const redisClient = redis.createClient({
  socket: {
    host: 'localhost',
    port: 6379,
    connectTimeout: 10000,
    reconnectStrategy: (retries) => Math.min(retries * 50, 2000)
  }
});

Oturum Verilerini Sıkıştırma (Serialization)

Oturum nesneleriniz çok fazla veri içeriyorsa, Redis'e yazmadan önce veriyi sıkıştırmak ağ bant genişliğini tasarruflu kullanmanızı sağlar. Ancak bu işlem CPU kullanımını artıracağı için, verinin boyutuna göre karar verilmelidir.

// Basit bir örnek: JSON.stringify yerine sıkıştırma kütüphaneleri kullanılabilir
const session = require('express-session');
const RedisStore = require('connect-redis').default;

// Oturum verisini küçültmek için sadece gerekli alanları saklayın
app.use(session({
  store: new RedisStore({ client: redisClient }),
  secret: 'gizli-anahtar',
  resave: false,
  saveUninitialized: false,
  cookie: { maxAge: 60000 }
}));

Redis Oturumlarında Hata Ayıklama ve İzleme

Üretim ortamında oturumların neden sonlandığını veya neden kaydedilmediğini anlamak için Redis olaylarını dinlemek oldukça faydalıdır. Node.js tarafında Redis istemcisi üzerinden hata loglarını merkezi bir sisteme aktarabilirsiniz.

Redis Olaylarını Dinleme

Redis bağlantı durumlarını takip ederek uygulamanızın oturum yönetimini daha kararlı hale getirebilirsiniz. Aşağıdaki kod bloğu, bağlantı hatalarını yakalamak için standart bir yaklaşımdır:

redisClient.on('error', (err) => {
  console.error('Redis Oturum Hatası:', err);
});

redisClient.on('connect', () => {
  console.log('Redis oturum deposuna başarıyla bağlanıldı.');
});

Oturum Sürekliliğini Test Etme

Uygulamanızın oturum yönetimini test etmek için supertest gibi kütüphaneler kullanarak, oturum çerezinin (cookie) doğru set edilip edilmediğini ve Redis'te karşılık gelen anahtarın oluşup oluşmadığını kontrol eden birim testleri yazabilirsiniz.

İpucu: Redis'te oturumların silinip silinmediğini test etmek için TTL (Time To Live) değerlerini kısa tutarak (örneğin 10 saniye) oturumun otomatik olarak Redis'ten temizlenip temizlenmediğini gözlemleyebilirsiniz.
Senaryo Beklenen Davranış
Kullanıcı çıkış yaptı Redis'teki sess:[id] anahtarı silinmeli
Oturum süresi doldu Redis TTL mekanizması anahtarı otomatik temizlemeli
Redis sunucusu kapandı Uygulama hata vermemeli, bağlantı tekrar denenmeli

Sonuç

Node.js ile Redis kullanarak oturum yönetimi yapmak, uygulamanızın performansını ve kullanıcı deneyimini doğrudan etkileyen profesyonel bir yaklaşımdır. Bu rehberde, Redis kurulumundan Express.js entegrasyonuna ve güvenlik önlemlerine kadar süreci tamamladık. Bir sonraki adım olarak, oturum verilerini daha karmaşık hale getirmeyi veya Redis Cluster yapısını inceleyerek uygulamanızı daha yüksek trafikli sistemlere hazırlamayı deneyebilirsiniz.

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

Mutfak pratikleri ve ev ekonomisi konularında uzmanlaşmış bir editörüm. Okuyucularıma bütçe dostu ve uygulanabilir yaşam tavsiyeleri sunuyorum.

Yorumlar (0)

Yorum Yaz