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 web uygulamalarında kimlik doğrulama (authentication) ve yetkilendirme (authorization) işlemlerinde yaygın olarak kullanılır. Geleneksel oturum (session) tabanlı kimlik doğrulamaya alternatif olarak, durumsuz (stateless) bir yaklaşım sunar.
JWT Yapısı
Bir JWT token'ı, nokta (.) ile ayrılmış üç bölümden oluşur:
xxxxx.yyyyy.zzzzz
header.payload.signature
Gerçek bir JWT token'ı şöyle görünür:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwiaXNpbSI6IkFsaSIsImlhdCI6MTcxNjIzOTAyMn0.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. Header (Başlık)
Token türünü ve imzalama algoritmasını belirler:
{
"alg": "HS256",
"typ": "JWT"
}
Bu JSON nesnesi Base64Url ile kodlanarak header bölümünü oluşturur.
2. Payload (Yük)
Token'ın taşıdığı verileri (claims) içerir. Üç tür claim vardır:
{
// Kayıtlı (registered) claims
"iss": "sitescripti.com", // Issuer: token'ı veren
"sub": "user123", // Subject: token'ın konusu
"aud": "api.sitescripti.com",// Audience: hedef kitle
"exp": 1716325422, // Expiration: son kullanma zamanı
"iat": 1716239022, // Issued At: oluşturulma zamanı
"nbf": 1716239022, // Not Before: geçerlilik başlangıcı
// Özel (custom) claims
"isim": "Ali Yılmaz",
"rol": "admin",
"email": "[email protected]"
}
Uyarı: Payload Base64Url ile kodlanmıştır, şifrelenmemiştir. Herkes payload içeriğini okuyabilir. Bu nedenle hassas bilgileri (şifre, kredi kartı) payload'a asla koymayın.
3. Signature (İmza)
Token'ın değiştirilmediğini doğrulamak için kullanılır:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
gizli-anahtar
)
İmza, header ve payload'ın birleştirilip gizli anahtar ile hashlenmesiyle oluşturulur. Token'da herhangi bir değişiklik yapılırsa imza geçersiz olur.
İmzalama Algoritmaları
- HS256 (HMAC-SHA256): Simetrik anahtar — hem imzalama hem doğrulama için aynı gizli anahtar kullanılır. Basit uygulamalar için uygundur.
- RS256 (RSA-SHA256): Asimetrik anahtar çifti — özel anahtar ile imzalanır, genel anahtar ile doğrulanır. Microservice mimarileri için idealdir.
- ES256 (ECDSA-SHA256): Eliptik eğri algoritması — RS256'dan daha küçük anahtar boyutu ile aynı güvenlik seviyesi.
JWT Kimlik Doğrulama Akışı
- Giriş: Kullanıcı, kullanıcı adı ve şifresini sunucuya gönderir.
- Doğrulama: Sunucu kimlik bilgilerini doğrular.
- Token oluşturma: Sunucu, kullanıcı bilgilerini içeren bir JWT oluşturur ve istemciye döner.
- Token saklama: İstemci, token'ı (genellikle localStorage veya httpOnly cookie'de) saklar.
- İstekler: Her API isteğinde token, Authorization başlığında gönderilir.
- Doğrulama: Sunucu, token'ın imzasını ve geçerliliğini kontrol eder.
// İstemciden sunucuya gönderim
fetch('/api/profil', {
headers: {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIs...'
}
});
Güvenlik En İyi Uygulamaları
- Kısa ömürlü token'lar: Access token'ın süresini kısa tutun (15-30 dakika). Uzun oturumlar için refresh token kullanın.
- HTTPS zorunluluğu: Token'ları yalnızca HTTPS üzerinden iletin.
- httpOnly cookie: Token'ı localStorage yerine httpOnly cookie'de saklamak XSS saldırılarına karşı koruma sağlar.
- Güçlü gizli anahtar: HS256 için en az 256-bit (32 bayt) uzunluğunda rastgele anahtar kullanın.
- alg: "none" reddedin: İmzasız token'ları kabul etmeyin — bu bilinen bir güvenlik açığıdır.
- Payload'da hassas veri saklamayın: Payload şifrelenmez, herkes okuyabilir.
- Token iptal mekanizması: Kritik uygulamalarda token kara listesi (blacklist) veya token sürüm numarası kullanın.
JWT ve Session Karşılaştırması
- Ölçeklenebilirlik: JWT durumsuz olduğu için sunucuda oturum bilgisi saklanmaz — yatay ölçekleme daha kolaydır.
- Performans: JWT, her istekte veritabanı sorgusu gerektirmez.
- Mobil uyumluluk: JWT, cookie'siz ortamlarda (mobil uygulamalar) kolayca kullanılabilir.
- İptal zorluğu: Session kolayca iptal edilebilirken, JWT'nin iptali daha karmaşıktır.
JWT Araçlarını Kullanın
JWT token'larını analiz etmek ve içeriğini görüntülemek için JWT Decoder aracımızı kullanabilirsiniz. Test amaçlı token oluşturmak için ise JWT Oluşturucu aracımız mevcuttur.
Bu konuyla ilgili araçlarımızı da deneyin: JSON Formatter, cURL Builder, ENV Generator