← Blog'a dön
2 Mart 2026·3 dk okuma

JWT ile Güvenli Kullanıcı Yönetimi: Stateless Auth'un Gücü

JSON Web Token (JWT) tabanlı kimlik doğrulama sistemlerinin derinlemesine incelenmesi. Stateless mimarinin avantajları, güvenlik riskleri ve production'da en iyi pratikler.

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:

  1. Access Token: Kısa ömürlü (15 dk), her istekte kullanılır
  2. 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:

  1. ✅ HTTP-only cookie kullan
  2. ✅ Kısa access token + uzun refresh token
  3. ✅ Payload'ı minimal tut
  4. ✅ HTTPS zorunlu kıl
  5. ❌ localStorage'ı unutkun

Kod temiz, sistem güvenli, mimari sağlam. İşte arkhe felsefesi bu.

Yazar

arkhe / rahmicaglar

← Diğer yazılara bak