Ana içeriğe geç

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

TokenSüreAmaç
Access Token~15 dakikaAPI erişimi sağlar, genellikle kısa süreli kullanım için
Refresh Token~7 günYeni 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.