JWT ile Güvenli Kullanıcı Yönetimi: Stateless Auth'un Gücü
Modern web uygulamalarında kimlik doğrulama (authentication) sistemi, güvenliğin bel kemiğidir. Bu yazıda JSON Web Token (JWT) tabanlı stateless authentication'ın derinliklerine ineceğiz.
JWT Nedir?
JWT (JSON Web Token), iki taraf arasında güvenli bilgi aktarımı için kullanılan açık bir standarttır (RFC 7519). Üç parçadan oluşur:
header.payload.signature
- Header: Algoritma ve token türü
- Payload: Claims (iddialar) — kullanıcı verisi
- Signature: Doğrulama imzası
Neden Stateless?
Geleneksel session-based auth'da sunucu her kullanıcı için bir session kaydı tutar. Bu yaklaşımın sorunları:
- Ölçekleme zorluğu (yatay ölçeklemede session paylaşımı)
- Redis gibi harici depolama gereksinimi
- Durum yönetimi karmaşıklığı
JWT ile stateless yaklaşımda ise:
// Token doğrulama — veritabanı sorgusu YOK
import jwt from 'jsonwebtoken';
function verifyToken(token: string): JwtPayload | null {
try {
return jwt.verify(token, process.env.JWT_SECRET!) as JwtPayload;
} catch {
return null; // Süresi dolmuş veya geçersiz
}
}
Sunucu sadece imzayı doğrular. Veritabanı gerekmez!
Güvenli Token Saklama
⚠️ localStorage KULLANMA! XSS saldırılarına karşı savunmasız.
En güvenli yöntem: HTTP-only Cookie
// Next.js API Route — token'ı http-only cookie'ye set et
response.cookies.set('auth_token', token, {
httpOnly: true, // JavaScript erişemez — XSS koruması
secure: true, // Sadece HTTPS
sameSite: 'strict', // CSRF koruması
maxAge: 60 * 60 * 24 * 7, // 7 gün
});
Payload'a Ne Koymalı?
interface JwtPayload {
sub: string; // Kullanıcı ID
email: string; // E-posta
role: 'user' | 'admin'; // Yetki seviyesi
iat: number; // Oluşturma zamanı
exp: number; // Süre sonu
}
⚡ Altın kural: Payload'a hassas bilgi (şifre, kredi kartı) ASLA koyma. JWT decode edilebilir, sadece imza doğrulanır.
Token Yenileme Stratejisi
Production'da iki token stratejisi kullan:
- Access Token: Kısa ömürlü (15 dk), her istekte kullanılır
- Refresh Token: Uzun ömürlü (7-30 gün), yeni access token almak için
// Refresh flow
async function refreshAccessToken(refreshToken: string) {
const payload = verifyToken(refreshToken);
if (!payload) throw new Error('Invalid refresh token');
// Yeni access token üret
return signToken({
sub: payload.sub,
email: payload.email,
role: payload.role
}, '15m');
}
Middleware ile Koruma
Next.js'de tüm korumalı route'ları tek yerden yönet:
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('auth_token')?.value;
if (!token) {
return NextResponse.redirect(new URL('/login', request.url));
}
// Token doğrulama burada (edge runtime'da)
return NextResponse.next();
}
export const config = {
matcher: ['/admin/:path*', '/dashboard/:path*'],
};
Sonuç
JWT tabanlı stateless auth, doğru uygulandığında güçlü ve ölçeklenebilir bir güvenlik katmanı sağlar. Temel kurallar:
- ✅ HTTP-only cookie kullan
- ✅ Kısa access token + uzun refresh token
- ✅ Payload'ı minimal tut
- ✅ HTTPS zorunlu kıl
- ❌ localStorage'ı unutkun
Kod temiz, sistem güvenli, mimari sağlam. İşte arkhe felsefesi bu.