JSON Web Token (JWT), kullanıcı doğrulama ve API güvenliğinde en yaygın kullanılan standartlardan biridir. Ancak yanlış yapılandırma, uygulamanızı ciddi güvenlik açıklarına maruz bırakabilir. Bu yazıda backend API'lerde JWT token yönetimi için en iyi uygulamaları, pratik ipuçlarını ve uygulanabilir bir kontrol listesini bulacaksınız.
JWT Token Oluşturma ve İmzalama İpuçları
- Güçlü bir gizli anahtar kullanın: HS256 algoritması için en az 256 bit (32 karakter) rastgele bir anahtar tercih edin. Anahtarınızı ortam değişkenlerinde saklayın, koda gömülü bırakmayın.
- Asimetrik imza (RS256) tercih edin: Özellikle mikroservis mimarilerinde, token'ı doğrulamak için yalnızca genel anahtarı paylaşarak güvenliği artırın.
- Payload'a hassas veri eklemeyin: JWT payload'ı base64 kodlanmış olsa da şifrelenmemiştir. Parola, kredi kartı gibi verileri eklemeyin. Gerekirse JWE (JSON Web Encryption) kullanın.
- Standart talepleri kullanın:
iss(issuer),aud(audience),exp(expiration),iat(issued at) gibi alanları zorunlu kılın.
Token Süresi ve Yenileme Stratejileri
- Kısa ömürlü access token: 15-30 dakika arası bir süre belirleyin. Bu, token çalınsa bile zarar süresini sınırlar.
- Uzun ömürlü refresh token kullanın: Access token süresi dolduğunda, refresh token ile yeni bir access token alın. Refresh token süresi 7-30 gün olabilir, ancak güvenli bir veritabanında saklayın.
- Refresh token rotasyonu: Her yenileme işleminde yeni bir refresh token oluşturun ve eskisini geçersiz kılın. Bu, token çalınması durumunda kullanımını engeller.
- Token iptali için blacklist mekanizması: Özellikle logout veya şifre değiştirme gibi durumlarda token'ı blacklist'e ekleyin. Redis gibi bir bellek içi veritabanı hızlı çalışır.
Token Doğrulama ve Güvenlik Kontrolleri
- Her istekte token doğrulaması yapın: İmza, süre sonu, issuer ve audience kontrollerini mutlaka gerçekleştirin. Çoğu kütüphane (örneğin, jjwt, PyJWT) bu kontrolleri sağlar, ancak doğru yapılandırdığınızdan emin olun.
- HTTPS kullanın: Token'lar asla düz HTTP üzerinden gönderilmemelidir. Ayrıca, token'ı URL query parametresi yerine Authorization header'ında (Bearer şeması) taşıyın.
- Token saklama: İstemci tarafında token'ı localStorage yerine HttpOnly ve Secure flag'leri etkin çerezlerde veya memory'de saklayın. Bu, XSS saldırılarına karşı korur.
- Audience kontrolü: Token'ın yalnızca belirli bir API için geçerli olduğunu doğrulayın. Bu, token'ın başka bir hizmette kullanılmasını engeller.
Sık Yapılan Hatalar ve Kaçınılması Gerekenler
- İmza doğrulamasını atlamak: Bazı geliştiriciler token'ın yalnızca süre sonunu kontrol eder, imzayı atlar. Bu, saldırganın kendi token'ını oluşturmasına olanak tanır.
- Token'ı localStorage'ta saklamak: XSS saldırısı altında token ele geçirilebilir. HttpOnly çerez veya memory daha güvenlidir.
- Refresh token'ı sınırsız süreli bırakmak: Refresh token'ın da bir son kullanma tarihi olmalı ve düzenli olarak döndürülmelidir.
- Token payload'ında rol/permission gibi verileri şifresiz tutmak: Bu veriler değiştirilebilir mi? İmza korur ancak yine de hassas değilse sıkıntı yok, ama yetki yükseltme riskine karşı her zaman sunucuda yetki kontrolü yapın.
Kontrol Listesi
API'nizde JWT kullanırken aşağıdaki maddeleri mutlaka kontrol edin:
- Gizli anahtar düzenli olarak değiştiriliyor ve güvenli bir yerde (Vault, AWS Secrets Manager) saklanıyor mu?
- Token imzası her istekte doğrulanıyor ve süre sonu kontrol ediliyor mu?
- Access token süresi 15-30 dakika, refresh token süresi maksimum 7-30 gün arasında mı?
- Refresh token rotasyonu aktif mi? Eski token iptal ediliyor mu?
- Logout işleminde token blacklist'e ekleniyor mu?
- Token'lar yalnızca HTTPS üzerinden Authorization header ile mi taşınıyor?
- İstemci tarafında token HttpOnly çerez olarak saklanıyor (XSS riski azaltılıyor) mu?
- Payload'da hassas veri (parola, kredi kartı) bulunmuyor mu?
- Audience ve issuer kontrolleri yapılıyor mu?
Unutmayın, JWT tek başına yeterli değildir. API güvenliğini artırmak için rate limiting ile kötüye kullanımı engelleyin ve API versiyonlama stratejileriyle uyumlu çalıştığından emin olun. Ayrıca pagination ve filtreleme gibi diğer API best practices'lerini de gözden geçirin.
Bu kontrol listesini düzenli olarak gözden geçirerek JWT altyapınızı güvende tutabilir ve olası güvenlik açıklarını önceden kapatabilirsiniz.
Sık Sorulan Sorular
JWT nedir ve ne için kullanılır?
JWT (JSON Web Token), taraflar arasında JSON formatında bilgi taşıyan, dijital olarak imzalanmış bir tokendır. Genellikle kullanıcı doğrulama ve API yetkilendirme için kullanılır.
JWT token süresi ne olmalıdır?
Access token'lar 15-30 dakika gibi kısa süreli, refresh token'lar ise 7-30 gün arasında uzun süreli olmalıdır. Kısa süreli token, çalınma durumunda zararı sınırlar.
Refresh token nasıl güvenli bir şekilde saklanır?
Refresh token sunucuda (veritabanı veya Redis) saklanmalı, istemciye ise HttpOnly ve Secure çerez olarak gönderilmelidir. Ayrıca token rotasyonu ile her kullanımda yeni token üretilmelidir.
JWT ile hangi güvenlik önlemleri alınmalıdır?
İmza doğrulaması, süre sonu kontrolü, HTTPS zorunluluğu, token'ı URL'de değil header'da taşıma, audience ve issuer kontrolleri yapılmalıdır. Ayrıca token'ı localStorage yerine HttpOnly çerezde saklayın.






