JWT (JSON Web Token), REST API'lerde yaygın kullanılan bir kimlik doğrulama yöntemidir. Ancak yanlış yapılandırıldığında ciddi güvenlik açıklarına yol açabilir. Bu yazıda, JWT tabanlı kimlik doğrulamayı güvenli bir şekilde uygulamak için pratik ipuçları ve kontrol listesi sunuyoruz.
JWT Güvenliği için Temel İlkeler
JWT'nin doğru kullanımı, API'nizin güvenliğini doğrudan etkiler. Aşağıdaki maddeler, bir JWT implementasyonunda mutlaka dikkate almanız gereken noktalardır.
- Token'ı güvenli saklayın: İstemci tarafında token'ı localStorage yerine httpOnly çerezlerde saklayın. Bu, XSS saldırılarına karşı koruma sağlar.
- Kısa ömürlü access token kullanın: Access token süresini 15-30 dakika ile sınırlayın. Uzun süreli token'lar ele geçirildiğinde daha büyük risk oluşturur.
- Refresh token mekanizması ekleyin: Uzun süreli oturumlar için refresh token kullanın. Refresh token'ı veritabanında saklayın ve iptal edilebilir olmasını sağlayın.
- İmza algoritmasını doğrulayın: Sunucu tarafında token'ın imzasını mutlaka doğrulayın. HS256 veya RS256 gibi güçlü algoritmalar tercih edin.
- Token içinde hassas veri tutmayın: JWT payload'ı base64 ile kodlanır, şifrelenmez. Kullanıcı adı, rol gibi bilgileri ekleyebilirsiniz ancak şifre, kredi kartı gibi hassas verileri asla koymayın.
Bu temel ilkeler, çoğu güvenlik açığını önler. Ancak daha sağlam bir yapı için ek adımlar atmalısınız. Örneğin, REST API'de hata yönetimi makalemizde anlattığımız gibi, geçersiz token durumunda uygun HTTP durum kodları (401 Unauthorized) dönmelisiniz.
Token Doğrulama ve Yenileme Süreçleri
Güvenli bir JWT akışı, access ve refresh token'ların doğru yönetimini gerektirir. Aşağıdaki adımları izleyin:
- Kullanıcı giriş yaptığında kısa ömürlü access token ve uzun ömürlü refresh token oluşturun.
- Access token süresi dolduğunda, refresh token ile yeni access token talep edin.
- Refresh token'ı sunucu tarafında bir veritabanında saklayın ve her yenilemede kontrol edin.
- Kullanıcı çıkış yaptığında refresh token'ı veritabanından silin veya iptal listesine ekleyin.
- Token yenileme isteklerinde CSRF koruması için 'Authorization' header'ı kullanın.
Bu süreç, token çalınması durumunda zararı sınırlar. Ayrıca Airtable ve Bubble ile CRUD uygulaması gibi no-code platformlarla API entegrasyonlarında da benzer güvenlik önlemleri almalısınız.
Sık Yapılan Hatalar ve Kaçınılması Gerekenler
JWT implementasyonlarında en sık karşılaşılan hataları ve çözümlerini bir kontrol listesi olarak sunuyoruz:
| Hata | Risk | Çözüm |
|---|---|---|
| Token'ı localStorage'da saklamak | XSS saldırılarıyla token çalınabilir | httpOnly çerez kullanın |
| Uzun ömürlü access token | Token ele geçirilirse uzun süre geçerli kalır | Süreyi 15-30 dakika ile sınırlayın |
| İmza doğrulaması yapmamak | Sahte token'lar kabul edilebilir | Her istekte imzayı doğrulayın |
| Token payload'ında hassas veri | Veri sızıntısı riski | Yalnızca gerekli bilgileri ekleyin |
| Refresh token iptal mekanizması olmaması | Çalınan refresh token süresiz geçerli | Veritabanında saklayın ve iptal edin |
Node.js ile Örnek JWT Uygulaması
Aşağıda, Node.js ve Express ile basit bir JWT kimlik doğrulama middleware'i örneği bulunuyor. Bu örnek, token doğrulama ve hata yönetimi adımlarını içerir.
const jwt = require('jsonwebtoken');
const authenticate = (req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({ error: 'Token gerekli' });
}
const token = authHeader.split(' ')[1];
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (err) {
if (err.name === 'TokenExpiredError') {
return res.status(401).json({ error: 'Token süresi doldu' });
}
return res.status(403).json({ error: 'Geçersiz token' });
}
};
Bu middleware, her korumalı rotada kullanılabilir. Daha kapsamlı bir API için n8n gibi otomasyon araçlarıyla JWT sürecini test edebilirsiniz.
JWT ile İlgili Sık Sorulan Sorular
JWT kullanımında en çok merak edilen konuları aşağıda yanıtladık.
JWT neden güvenli değil?
JWT'nin kendisi güvenli bir formattır ancak yanlış kullanıldığında (örneğin, imza doğrulaması yapılmadığında veya token çalındığında) güvenlik açıkları oluşur. Doğru uygulama ile güvenli bir kimlik doğrulama sağlar.
Access token ve refresh token arasındaki fark nedir?
Access token kısa ömürlüdür ve API isteklerinde kullanılır. Refresh token daha uzun ömürlüdür ve yalnızca yeni access token almak için kullanılır. Refresh token sunucuda saklanarak iptal edilebilir.
JWT'yi nasıl iptal edebilirim?
JWT'nin kendisi stateful olmadığı için iptal listesi (blacklist) kullanabilirsiniz. Refresh token'ı veritabanında saklayarak sildiğinizde veya iptal listesine eklediğinizde geçersiz hale gelir.
Sık Sorulan Sorular
JWT token'ı nerede saklanmalı?
JWT token'ı httpOnly çerezlerde saklanmalıdır. localStorage kullanmak XSS saldırılarına karşı risk oluşturur. Çerezler, JavaScript erişimini engelleyerek güvenliği artırır.
Access token süresi ne kadar olmalı?
Access token süresi 15-30 dakika arasında olmalıdır. Kısa süreli token'lar ele geçirildiğinde zararı sınırlar. Uzun süreli oturumlar için refresh token kullanılmalıdır.
Refresh token nasıl güvence altına alınır?
Refresh token sunucu tarafında bir veritabanında saklanmalı ve her yenileme isteğinde doğrulanmalıdır. Kullanıcı çıkış yaptığında veya şifre değiştirdiğinde refresh token iptal edilmelidir.
JWT payload'ında hangi bilgiler olmalı?
Payload'da yalnızca kullanıcı ID'si, rol gibi gerekli bilgiler bulunmalıdır. Şifre, kredi kartı gibi hassas veriler asla eklenmemelidir. Payload base64 ile kodlanır, şifrelenmez.






