Express.js JWT ile Güvenli Kimlik Doğrulama Rehberi
Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde Express.js projelerinde JWT tabanlı modern kimlik doğrulama sistemi kuracaksınız.
Access–refresh token yapısı, middleware kullanımı ve rol bazlı yetkilendirme ele alınır.
Teknik Özet
- Konu: Express.js JWT Authentication
- Amaç: Session’sız, ölçeklenebilir API güvenliği
- Yaklaşım: Access token + Refresh token
- Kapsam: Middleware, RBAC, cookie güvenliği
Ön Hazırlıklar
- Node.js kurulu bir geliştirme ortamı
- Temel JavaScript bilgisi
- REST API mantığına aşinalık
- Terminal kullanımı
JWT Nedir?
JWT (JSON Web Token), imzalanmış bir JSON veri yapısıdır.
Sunucu tarafında oturum saklamadan kimlik doğrulama sağlar.
JWT üç parçadan oluşur:
- Header
- Payload
- Signature
Payload şifrelenmez, yalnızca encode edilir.
JWT Neden Tercih Edilir?
- REST API kimlik doğrulama
- Mikroservis mimarileri
- Yatay ölçeklenen sistemler
- Tek oturumla çoklu servis erişimi
Her sunucu token’ı bağımsız şekilde doğrulayabilir.
1. Proje Kurulumu
mkdir rabisu-jwt-auth
cd rabisu-jwt-auth
npm init -y
- Bu komut proje yapılandırmasını oluşturur.
"type": "module"
- Bu ayar ES Modules kullanımını aktif eder.
npm install express dotenv jsonwebtoken cookie-parser
- Bu paketler JWT ve cookie yönetimi için gereklidir.
2. Temel Express Sunucu Yapısı
import express from 'express';
import dotenv from 'dotenv';
import cookieParser from 'cookie-parser';
dotenv.config();
const app = express();
app.use(express.json());
app.use(cookieParser());
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Sunucu ${PORT} portunda çalışıyor`);
});
- Bu yapı JSON ve çerez desteği olan Express sunucusu başlatır.
3. JWT Secret Yapılandırması
ACCESS_TOKEN_SECRET=uzun_ve_rastgele_bir_metin
REFRESH_TOKEN_SECRET=baska_uzun_ve_gizli_bir_metin
Secret değerleri asla koda gömülmemelidir.
4. Access Token Üretimi
import jwt from 'jsonwebtoken';
function accessTokenUret(kullanici) {
return jwt.sign(
{ id: kullanici.id, rol: kullanici.rol },
process.env.ACCESS_TOKEN_SECRET,
{ expiresIn: '15m' }
);
}
- Bu fonksiyon kısa ömürlü erişim token’ı üretir.
5. JWT Doğrulama Middleware’i
export function tokenDogrula(req, res, next) {
const authHeader = req.headers.authorization;
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ mesaj: 'Token bulunamadı' });
}
jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (hata, veri) => {
if (hata) {
return res.status(403).json({ mesaj: 'Token geçersiz veya süresi dolmuş' });
}
req.user = veri;
next();
});
}
- Bu middleware korumalı rotalar için kimlik doğrular.
6. Login ve Refresh Token Stratejisi
| Token | Süre | Amaç |
|---|---|---|
| Access Token | ~15 dakika | API erişimi sağlar, genellikle kısa süreli kullanım için |
| Refresh Token | ~7 gün | Yeni bir access token almak için kullanılır, uzun süreli kullanım için |
- Refresh token HttpOnly cookie içinde saklanmalıdır.
Login Örneği
app.post('/giris', (req, res) => {
const kullanici = { id: 1, rol: 'editor' };
const accessToken = accessTokenUret(kullanici);
const refreshToken = jwt.sign(
kullanici,
process.env.REFRESH_TOKEN_SECRET
);
res.cookie('jwt', refreshToken, {
httpOnly: true,
secure: true,
sameSite: 'Strict'
});
res.json({ accessToken });
});
- Bu yapı XSS riskini ciddi şekilde azaltır.
7. Rol Bazlı Yetkilendirme (RBAC)
function sadeceAdmin(req, res, next) {
if (req.user.rol !== 'admin') {
return res.status(403).json({ mesaj: 'Yetkiniz yok' });
}
next();
}
- Bu middleware admin rotalarını korur.
app.delete(
'/kullanici/:id',
tokenDogrula,
sadeceAdmin,
(req, res) => {
res.send('Kullanıcı silindi');
}
);
Güvenlik En İyi Uygulamaları
1. JWT’yi localStorage’da saklamayın
2. Refresh token için HttpOnly cookie kullanın
3. Access token kısa ömürlü olsun
4. exp alanı zorunlu olsun
5. Secret’lar environment variable olmalı
Sıkça Sorulan Sorular
1. JWT ile logout nasıl yapılır? Refresh cookie temizlenir, access token istemcide silinir.
2. JWT payload güvenli mi? Okunabilir. Gizli veri eklenmemelidir.
3. Refresh token çalınırsa? Token rotasyonu veya token versiyonu uygulanmalıdır.
4. HS256 mı RS256 mı? Tek sunucu için HS256 yeterlidir. Dağıtık sistemlerde RS256 önerilir.
Sonuç
JWT, Express.js projelerinde modern ve ölçeklenebilir kimlik doğrulama sağlar. Doğru kurgulandığında güvenli, bakımı kolay ve performanslıdır. Bu mimariyi Rabisu Bulut altyapısında güvenle kullanabilirsiniz.