JWT vs Session Token: Dağıtık Sistemlerde Doğru Seçim
İki yaklaşım da kullanıcı kimliğini doğrulamak için tasarlanmış, ama çok farklı yollardan gidiyor.
Session Token sunucuda depolanan bir referanstır. Kullanıcı giriş yaptığında, sunucu benzersiz bir token oluşturur, veritabanında saklar ve istemciye gönderir. İstemci her istekle bu tokeni geri gönderir; sunucu veritabanında kontrol eder.
JWT (JSON Web Token) ise kendi kendine yeterlidir. Sunucu, kullanıcı bilgilerini ve meta verileri içeren bir token imzalar ve gönderir. İstemci her istekle bunu geri gönderir; sunucu imzayı doğrular, veritabanına bakmaz.
Birden fazla sunucunuz varsa Session Token sorun yaratır. Kullanıcı sunucu A'da giriş yaptı, token aldı. Sonra sunucu B'ye istek gönderdi. Sunucu B'nin o tokeni bilmesi gerekir, ya merkezi bir veritabanı gerekir (darboğaz), ya da sunucular arasında senkronizasyon (karmaşık).
JWT'de bu sorun yok. Her sunucu JWT'nin imzasını kendi gizli anahtarıyla doğrulayabilir. Veritabanı sorgusuna gerek yok.
Bir Node.js API'si yazalım. JWT kullanarak giriş ve doğrulama yapalım:
1const jwt = require('jsonwebtoken');2const express = require('express');3const app = express();45const SECRET = 'gizli-anahtar-123';67// Giriş endpoint'i8app.post('/login', (req, res) => {9const user = { id: 1, email: 'user@example.com' };10const token = jwt.sign(user, SECRET, { expiresIn: '1h' });11res.json({ token });12});1314// Middleware: JWT doğrula15const verifyToken = (req, res, next) => {16const token = req.headers['authorization']?.split(' ')[1];17if (!token) return res.status(401).json({ error: 'Token yok' });1819try {20const decoded = jwt.verify(token, SECRET);21req.user = decoded;22next();23} catch (err) {24res.status(403).json({ error: 'Geçersiz token' });25}26};2728// Korumalı endpoint29app.get('/profile', verifyToken, (req, res) => {30res.json({ message: `Hoş geldin ${req.user.email}`, user: req.user });31});3233app.listen(3000);Çıktı:
- POST /login: `{ "token": "eyJhbGciOiJIUzI1NiIs..." }`
- GET /profile (token ile): `{ "message": "Hoş geldin user@example.com", "user": { "id": 1, "email": "user@example.com" } }`
JWT seç eğer: Mikro servisler, API gateway'ler, mobil uygulamalar, veya ölçeklenebilirlik önemliyse.
Session Token seç eğer: Monolitik uygulama, merkezi sunucu, revokasyon (çıkış) sık gerekiyorsa.
Dağıtık sistemlerde JWT daha pratiktir, ama JWT'nin payload'u her istekle gider (biraz fazla veri), revokasyon gecikebilir (token süresi dolana kadar geçerli kalır). Hybrid yaklaşım da var: JWT + Redis'te blacklist.
Seçim mimarinize bağlı.
0 yorum