Oturum (session) mu JWT mi? Web uygulamalarında kimlik doğrulama
Giriş sistemi kurarken en çok sorulan sorulardan biri: "Klasik oturum mu kullanayım, JWT mi?" İkisi de doğru kullanıldığında güvenlidir. Aradaki fark, durumun nerede tutulduğudur.
Oturum (session) nasıl çalışır?
- Kullanıcı giriş yapar, sunucu rastgele bir oturum kimliği üretir.
- Kullanıcı bilgisi sunucuda (dosya, veritabanı, Redis) bu kimlikle saklanır.
- Tarayıcıya sadece kimlik çerez olarak gönderilir.
Artıları: Oturumu anında iptal edebilirsin (çıkış, şifre değişikliği, hesabı askıya alma). Çerez HttpOnly olduğu için JavaScript okuyamaz.
Eksileri: Birden fazla sunucu varsa oturum deposunun ortak olması gerekir (Redis gibi).
JWT nasıl çalışır?
JWT, sunucunun imzaladığı bir metindir. İçinde kullanıcı kimliği, rolü ve son kullanma zamanı gibi bilgiler bulunur. Sunucu her istekte imzayı doğrular, veritabanına bakması gerekmez.
Artıları: Durumsuzdur, farklı servisler aynı anahtarla doğrulayabilir. Mobil uygulama ve servisler arası iletişimde pratiktir.
Eksileri: Süresi dolmadan geri alınamaz. Kullanıcıyı askıya alsan bile elindeki token geçerliliğini korur. Bunu çözmek için kara liste tutarsan, aslında yeniden oturum deposu kurmuş olursun.
Sık yapılan hatalar
- JWT'yi
localStorage'da saklamak: Sitede bir XSS açığı varsa token çalınır. Tarayıcı uygulamalarındaHttpOnly; Secure; SameSiteçerez daha güvenlidir. - Uzun ömürlü erişim token'ı: Erişim token'ını kısa (ör. 15 dakika) tut, yenileme için ayrı bir refresh token kullan ve refresh token'ı sunucuda iptal edilebilir yap.
- İmza algoritmasını doğrulamamak: Kütüphanende kabul edilen algoritmayı açıkça belirt,
nonealgoritmasını kabul eden yapılandırmalardan kaçın. - Token içine gizli bilgi koymak: JWT şifreli değildir, sadece imzalıdır. İçeriği base64 çözen herkes okuyabilir.
- Çerez kullanıp CSRF'i unutmak: Çerezle kimlik doğrulama yapıyorsan form ve isteklerde CSRF koruması ya da
SameSite=Lax/Strictgerekir.
Hangisini seçmeli?
| Durum | Öneri |
|---|---|
| Klasik web sitesi, tek sunucu veya birkaç sunucu | Oturum + çerez |
| Mobil uygulama veya üçüncü taraf istemcilerin kullandığı API | Kısa ömürlü JWT + iptal edilebilir refresh token |
| Mikroservisler arası kimlik aktarımı | JWT |
Kural olarak: çoğu web uygulaması için oturum daha basit ve daha az hataya açıktır. JWT'yi "modern" olduğu için değil, durumsuz doğrulamaya gerçekten ihtiyacın olduğu için seç.