JWT (JSON Web Token), API'lerde kullanıcı kimlik doğrulaması için yaygın olarak kullanılan, kompakt ve kendi kendine yeten bir token formatıdır. Doğru yapılandırıldığında güvenli bir authentication sağlar, ancak yanlış kullanım ciddi güvenlik açıklarına yol açabilir. Bu yazıda, JWT token yönetiminde dikkat edilmesi gereken kritik noktaları ve kaçınılması gereken yaygın hataları adım adım ele alıyoruz.
JWT Nedir ve Nasıl Çalışır?
JWT, üç bölümden oluşan bir token'dır: header, payload ve signature. Header token türünü ve imzalama algoritmasını belirtir. Payload, kullanıcı bilgisi gibi talepleri (claims) içerir. Signature ise token'ın bütünlüğünü doğrulamak için kullanılır. Sunucu, kullanıcı giriş yaptığında bir JWT oluşturur ve istemciye gönderir. İstemci, sonraki isteklerde bu token'ı HTTP header'ında (genellikle Authorization: Bearer ) taşır. Sunucu, token'ı doğrulayarak kullanıcıyı tanır.
Token Depolama ve İletim Güvenliği
Token'ın istemci tarafında nasıl saklandığı, güvenlik açısından kritiktir. En yaygın yöntemler localStorage, sessionStorage ve HTTP-only çerezlerdir. Aşağıdaki tabloda bu yöntemlerin karşılaştırmasını bulabilirsiniz:
| Depolama Yöntemi | XSS Saldırılarına Direnç | CSRF Saldırılarına Direnç | Oturum Yönetimi |
|---|---|---|---|
| localStorage | Düşük (JavaScript ile erişilebilir) | Yüksek (otomatik gönderilmez) | Manuel |
| sessionStorage | Düşük | Yüksek | Manuel (sekme bazlı) |
| HTTP-only Çerez | Yüksek (JavaScript erişemez) | Orta (CSRF koruması gerekir) | Otomatik (her istekte gönderilir) |
Önerilen yöntem, HTTP-only çerezler kullanmak ve CSRF koruması eklemektir. Token'ı iletişim sırasında her zaman HTTPS kullanarak şifreleyin. Ayrıca, token'ı URL parametrelerinde taşımaktan kaçının; bu, günlükleme ve ağ üzerinden sızıntı riskini artırır.
JWT İmzalama ve Doğrulama En İyi Uygulamaları
JWT imzalarken güçlü bir algoritma (HS256 yerine RS256 veya ES256 gibi asimetrik) tercih edin. Asimetrik algoritmalar, token'ı doğrulamak için sadece genel anahtarı paylaşmanızı sağlar, böylece özel anahtar güvende kalır. İmzayı doğrularken her zaman token'ın bütünlüğünü kontrol edin ve alg alanını güvenli bir şekilde işleyin. REST API'lerde Input Validation yazımızda da belirttiğimiz gibi, tüm gelen veriler doğrulanmalıdır. Ayrıca, token'ın süresini kontrol edin ve gerekirse token'ı kara listeye alma (blacklist) mekanizması kullanın.
Token Süre Yönetimi ve Yenileme Stratejileri
Kısa ömürlü access token (örneğin 15 dakika) ve uzun ömürlü refresh token (örneğin 7 gün) kullanmak yaygın bir modeldir. Access token'ın süresi dolduğunda, istemci güvenli bir endpoint üzerinden refresh token ile yeni bir access token alır. Refresh token'ı da HTTP-only çerez olarak saklayın ve rotasyon (her kullanımda yeni bir refresh token vererek eskisini geçersiz kılma) uygulayın. Bu, token çalınsa bile süreyi sınırlar.
Sık Yapılan Hatalar ve Kaçınılması Gerekenler
- Zayıf imzalama algoritması kullanmak: HS256 gibi simetrik algoritmalar, özel anahtarın sızdırılması durumunda tüm token'ların taklit edilmesine izin verir. Asimetrik algoritmalar tercih edin.
- Token'ı payload'da hassas bilgi taşımak: JWT payload'ı sadece base64 kodludur, şifreli değildir. Parola, kredi kartı gibi hassas verileri asla payload'a eklemeyin.
- Token süresini çok uzun tutmak: Uzun süreli token'lar, ele geçirildiğinde daha büyük risk oluşturur. Kısa süreli access token ve refresh token kullanın.
- İmza doğrulamasını atlamak: Bazı kütüphaneler varsayılan olarak doğrulamayı devre dışı bırakabilir. Her zaman imzayı ve token'ın geçerlilik süresini kontrol edin.
- Token'ı güvensiz kanallarda iletmek: HTTP yerine HTTPS kullanmadığınızda token'ı ağ üzerinden herkes okuyabilir.
JWT ile API Güvenliğini Artırma İpuçları
Yukarıdaki yöntemlere ek olarak, token'ın kullanımını kısıtlamak için audience (hedef kitle) ve issuer (yayıncı) gibi talepler ekleyin. API versiyonlama stratejinizle uyumlu olarak token yapınızı da güncelleyin. REST API'lerde Versiyonlama Stratejileri yazımızda farklı yaklaşımları karşılaştırdık. Ayrıca, token'ı doğrularken her istekte bir veritabanı sorgusu yapmak yerine JWT'nin kendi kendine yeten yapısını kullanarak performans kazanın. Ancak token'ı hemen geçersiz kılmanız gereken durumlar için bir kara liste veya kısa süreli token kullanın.
Unutmayın, güvenlik tek bir katmandan ibaret değildir. JWT yönetimini diğer güvenlik önlemleriyle (input validation, HTTPS, CORS politikaları) birlikte uygulayın. Karmaşık veya yüksek güvenlik gerektiren senaryolarda bir güvenlik uzmanına danışmaktan çekinmeyin.
Sık Sorulan Sorular
JWT token'ı nerede saklamalıyım?
En güvenli yöntem, HTTP-only çerez kullanmaktır. Bu, XSS saldırılarına karşı koruma sağlar. localStorage veya sessionStorage kullanıyorsanız, XSS açıklarına karşı ek önlemler almalısınız.
JWT imzalama için hangi algoritmayı kullanmalıyım?
Asimetrik algoritmalar (RS256, ES256) önerilir. Bunlar, özel anahtarın gizli kalmasını sağlar ve token doğrulama için sadece genel anahtarı paylaşmanız yeterlidir.
Refresh token güvenliği nasıl sağlanır?
Refresh token'ı HTTP-only çerez olarak saklayın, her kullanımda yeni bir refresh token verin (rotasyon) ve süresini sınırlı tutun. Ayrıca, refresh token'ın kullanımını kısıtlamak için cihaz veya IP bilgisi ekleyebilirsiniz.
JWT token süresi ne kadar olmalı?
Access token için 15-30 dakika, refresh token için 7-30 gün idealdir. Kısa süreli token'lar, ele geçirilme riskini azaltır. Süre, uygulamanızın güvenlik gereksinimlerine göre ayarlanmalıdır.
JWT kullanırken sık yapılan hatalar nelerdir?
En yaygın hatalar: zayıf algoritma kullanmak, payload'a hassas veri eklemek, token süresini çok uzun tutmak, imza doğrulamasını atlamak ve HTTPS kullanmamaktır.






