JWT Nedir ve Neden Kullanmalıyız?

JSON Web Token (JWT), üç parçadan oluşan (header, payload, signature) bir veri yapısıdır ve istemci‑sunucu arasında güvenli bilgi alışverişi sağlar. Özellikle RESTful API ve SPA (Single Page Application) mimarilerinde oturum yönetimini hafif ve ölçeklenebilir kılar. Geleneksel çerez‑tabanlı oturum yönetimi, sunucu tarafında oturum bilgisi saklamayı gerektirirken, JWT tamamen istemci tarafında tutulur; bu da stateless bir mimari oluşturur.
JWT’nin en büyük avantajı, signature sayesinde token’ın içeriğinin değiştirilip değiştirilmediğinin hızlı bir şekilde doğrulanabilmesidir. Bu sayede %40 daha az sunucu yükü ve %30 daha düşük gecikme elde edilebilir. Ancak yanlış yapılandırıldığında güvenlik açıkları ortaya çıkabilir; bu yüzden doğru algoritma seçimi ve token süresi yönetimi kritik öneme sahiptir.
JWT’nin Yapısı ve Bileşenleri
JWT üç bölüme ayrılır: header, payload ve signature. Header kısmı, token’ın tipini (genellikle “JWT”) ve imzalama algoritmasını (örneğin HS256, RS256) tanımlar. Payload ise claim adı verilen veri çiftlerini içerir; bu claim’ler standart (iss, sub, exp, iat) ve özel claim’ler olabilir. Signature kısmı ise header ve payload’ın base64url kodlu hali ile gizli bir anahtarın (veya özel anahtarın) birleştirilmesiyle oluşturulur.
Örnek bir JWT şu şekildedir:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikpv
aG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Bu yapı, token’ın bütünlüğünü korur ve sunucu tarafında hızlı bir doğrulama imkanı sunar.
JWT Nasıl Oluşturulur ve Doğrulanır? (Adım Adım)
JWT oluşturma süreci genellikle şu adımları izler:
- Header oluşturma: Algoritma ve tip bilgisi JSON formatında hazırlanır ve base64url ile kodlanır.
- Payload hazırlama: Kullanıcı kimliği, roller ve token geçerlilik süresi gibi claim’ler eklenir.
exp(expiration) claim’i mutlaka belirlenmelidir. - İmzalama: Header ve payload birleştirilir, ardından seçilen algoritma ve gizli anahtar (veya RSA/ECDSA özel anahtarı) kullanılarak imza oluşturulur.
- Token’ı istemciye gönderme: Genellikle
Authorization: Bearer <token>başlığıyla API isteklerinde kullanılır.
Doğrulama aşamasında sunucu, gelen token’ın header ve payload’ını aynı algoritma ve anahtar ile yeniden imzalayarak karşılaştırır. Eğer imzalar eşleşirse token geçerlidir; aksi takdirde reddedilir.
Node.js ortamında jsonwebtoken kütüphanesi bu işlemleri basitleştirir:
const jwt = require('jsonwebtoken');
const token = jwt.sign({ sub: user.id, role: user.role }, process.env.JWT_SECRET, { expiresIn: '1h' });
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err) return res.status(401).send('Geçersiz token');
// decoded içindeki claim’lere erişim
});
Güvenli JWT Kullanımı: En Yaygın Hatalar ve Çözüm Önerileri

JWT’nin güvenli bir şekilde kullanılmasını engelleyen başlıca hatalar şunlardır:
- Gizli anahtarın sızdırılması: Anahtar bir versiyon kontrol sistemine (Git) eklenirse, saldırganlar token imzalarını taklit edebilir. Çözüm: Anahtarları
.envdosyalarında tutun ve VDS sunucu paketleri gibi izole ortamlar kullanın. - Uzun ömürlü token’lar:
expclaim’i çok uzak bir tarihe ayarlanırsa, çalınan token uzun süre geçerli kalır. Çözüm: 15‑30 dakikalık kısa ömür verefresh tokenmekanizması uygulayın. - Algoritma atlatma saldırısı (alg:none): JWT doğrulama kütüphanesinin algoritma kontrolünü atlaması, saldırganın imzasız token göndermesine izin verir. Çözüm: Kütüphane ayarlarında sadece güvenli algoritmaları (HS256, RS256) kabul edin.
- Payload’da hassas veri saklamak: JWT şifrelenmez, sadece imzalanır; bu yüzden şifre, kredi kartı gibi bilgiler payload’da bulunmamalıdır.
Bu hataları önlemek, kurumsal hosting ortamında güvenlik duvarı (WAF) ve WAF güvenlik duvarı entegrasyonu ile ek bir koruma katmanı sağlar.
JWT ve Diğer Kimlik Doğrulama Yöntemleri Karşılaştırması
| Özellik | JWT | Çerez‑Tabanlı Oturum | OAuth 2.0 Access Token |
|---|---|---|---|
| Stateless (Sunucu Durumsuz) | Evet | Hayır | Evet |
| Taşıma Ağırlığı | ≈ 1‑2 KB | ≈ 4‑6 KB (oturum verisi) | ≈ 1‑2 KB |
| Güvenlik | İmza ile koruma, ancak payload açık | Sunucu tarafı saklama, çerez güvenliği | Scope ve izin tabanlı, token revocation |
| Yeniden Kullanım | Refresh token ile desteklenir | Oturum yenileme otomatik | Refresh token yaygın |
| Uygulama Senaryosu | SPA, mikro servis, mobil | Monolitik web siteleri | Üçüncü parti API entegrasyonları |
Bu tablo, projenizin mimarisine göre en uygun kimlik doğrulama yöntemini seçmenize yardımcı olur. Örneğin, mikro servis mimarisinde JWT tercih edilirken, geleneksel bir web hosting paketleri sunucusunda çerez‑tabanlı oturum yönetimi daha pratik olabilir.
Gerçek Dünya Senaryosu: JWT ile Mikro Servis Güvenliği
Bir e‑ticaret platformu düşünün: kullanıcı‑servisi, sipariş‑servisi ve ödeme‑servisi ayrı mikro servisler olarak çalışıyor. Kullanıcı giriş yaptığında kullanıcı‑servisi bir JWT oluşturur ve Authorization: Bearer başlığıyla diğer servislere gönderir. Her servis token’ı doğruladıktan sonra role claim’i sayesinde erişim kontrolü yapar. Bu yapı, yük dengeleme ve autoscaling ortamlarında sunucuya ekstra oturum yönetimi yükü getirmez.
Bu senaryoda, token süresi 15 dakikaya ayarlanır ve refresh token AMD Ryzen VDS sunucular üzerinde güvenli bir veritabanında saklanır. Eğer bir saldırgan token çalsa bile, kısa ömür ve sık yenileme sayesinde zararı sınırlı kalır. Ayrıca, servisler arasında RS256 gibi asimetrik imzalama kullanmak, gizli anahtarın sadece kullanıcı‑serviside tutulmasını sağlar; diğer servisler sadece açık anahtarıyla doğrulama yapar.
JWT ile İlgili Sıkça Sorulan Sorular
JWT ve Refresh Token arasındaki fark nedir?
Refresh token, erişim token’ının (JWT) süresi dolduğunda yeni bir erişim token’ı almak için kullanılan uzun ömürlü bir token’dır. Refresh token genellikle HTTP‑only çerezde saklanır ve sunucu tarafında daha sıkı güvenlik kontrolleri uygulanır.
JWT’yi hangi algoritmalarla imzalamalıyım?
Güvenli bir uygulama için HS256 (HMAC SHA‑256) veya RS256 (RSA SHA‑256) tercih edilmelidir. Algoritma seçimi, gizli anahtar yönetimi stratejinize bağlıdır; asimetrik imzalama (RS256) özellikle mikro servislerde anahtar dağıtımını kolaylaştırır.
Token çalındığında ne yapmalıyım?
Çalınan token’ı geçersiz kılmak için bir “token revocation list” (revocation list) tutabilirsiniz. Ayrıca, kısa ömürlü token ve sık refresh mekanizması sayesinde çalınan token’ın etkisini en aza indirebilirsiniz.
JWT payload’da şifreli veri saklayabilir miyim?
JWT sadece imzalanır, şifrelenmez. Hassas veri saklamak için JWE (JSON Web Encryption) gibi ek standartlar kullanılmalı ya da veri tamamen sunucu tarafında tutulmalıdır.
JWT’yi Projenize Entegre Etmek İçin Son Adımlar
Artık JWT’nin temellerini, güvenli kullanım ilkelerini ve gerçek dünya örneklerini öğrendiniz. Entegrasyon sürecinde aşağıdaki adımları izleyin:
- Gizli anahtarınızı
.envdosyasında tanımlayın ve sürüm kontrolünden çıkarın. - Header’da
algolarak sadece HS256 veya RS256 seçin. - Payload’da
expclaim’ini 15‑30 dakika aralığında tutun,iatvenbfclaim’lerini ekleyin. - Refresh token mekanizması kurun; token süresi dolduğunda yeni bir JWT üretin.
- İstemci tarafında token’ı
Authorization: Bearerbaşlığıyla gönderin. - Sunucu tarafında token doğrulama ve yetkilendirme middleware’lerini yapılandırın.
- Güvenlik testlerini (penetrasyon testi, token revocation testi) düzenli olarak yapın.
Bu adımları tamamladıktan sonra, uygulamanız ölçeklenebilir, performanslı ve güvenli bir kimlik doğrulama altyapısına sahip olacaktır. İhtiyacınız olursa, fiziksel sunucu (dedicated server) veya colocation hizmeti gibi altyapı seçenekleriyle performansı daha da artırabilirsiniz.
Sonuç
JWT, modern web ve mobil uygulamalarda kimlik doğrulama ve yetkilendirme için güçlü bir çözümdür. Doğru yapılandırma, kısa token ömrü, asimetrik imzalama ve refresh token stratejileriyle güvenlik risklerini en aza indirebilirsiniz. Yukarıdaki adımları ve önerileri uygulayarak, projelerinizde JWT’yi sorunsuz bir şekilde entegre edebilir ve ölçeklenebilir bir mimari elde edebilirsiniz. Şimdi, geliştirme ortamınızda bir deneme tokenı oluşturarak başlayın ve güvenliğinizi bir adım öteye taşıyın.