JWT (JSON Web Token), API'lerde kimlik doğrulama ve yetkilendirme için en yaygın kullanılan standarttır. Bu makale JWT'nin ne olduğunu, nasıl çalıştığını ve doğru nasıl kullanılacağını baştan sona açıklıyor — session tabanlı auth ile karşılaştırmalı olarak.
JWT Nedir?
JWT, RFC 7519 standardıyla tanımlanmış, Base64URL kodlanmış üç parçalı bir token formatıdır:
Sunucu gelen token'ı imzayla doğrular. Payload değiştirilmişse imza uyuşmaz → token geçersiz.
Session vs JWT Karşılaştırması
// PLAINTEXT //
Session Tabanlı: JWT Tabanlı:━━━━━━━━━━━━━━━ ━━━━━━━━━━━━Sunucuda saklanır Sunucuda saklanmaz (stateless)Session DB gerekir DB sorgusu gerekmezKolay iptal edilir İptal için ek mekanizma lazımYatay ölçekleme zor Kolayca ölçeklenirCSRF risk var Cookie değilse CSRF riski azXSS ile Session ID çalınabilir XSS ile token çalınabilir
Hangisini seç? SPA ve mobil API → JWT. Geleneksel web uygulaması → Session.
JWT Auth Akışı
// PLAINTEXT //
1. Kullanıcı giriş yapar (POST /auth/login) { email, password }2. Sunucu doğrular → JWT üretir { accessToken: "eyJ...", expiresIn: 900 }3. Client token'ı saklar ve her istekte gönderir Authorization: Bearer eyJ...4. Sunucu token'ı doğrular → isteği işler jwt.verify(token, SECRET) → payload5. Token süresi dolarsa → refresh token ile yenile POST /auth/refresh → yeni accessToken
Access Token + Refresh Token
Kısa ömürlü access token + uzun ömürlü refresh token kombinasyonu güvenli en yaygın yaklaşımdır:
// PLAINTEXT //
Access Token: 15 dakika ömürlü, Authorization header'daRefresh Token: 30 gün ömürlü, HttpOnly cookie'deNeden iki token?• 15 dakika sonra access token expire → refresh token ile yenile• Refresh token çalınırsa → DB'den sil → anında geçersiz• Access token çalınırsa → 15 dakika sonra otomatik expire
JWT üç parçadan oluşur: header (algoritma), payload (kullanıcı bilgisi) ve signature (doğrulama). Access token 15 dakika ömürlü ve Authorization header'da, refresh token 30 gün ömürlü ve HttpOnly cookie'de tutulmalı. localStorage'da token saklamak XSS riski yaratır. Her token'a exp claim ekle, güçlü secret kullan, algoritma belirt. İptal için ya kısa expiry ya Redis blacklist ya da DB tabanlı refresh token yönetimi gerekir.