Yan yana
JWTvsOturum
JWT ile oturum (session) tabanlı kimlik doğrulama arasındaki fark nedir?
Güncellendi 2 dk okuma7 fark
Kısaca
JWT, kullanıcının kimliğini içinde taşıyan imzalı bir token'dır, sorgusuz doğrulanır; session ise oturumu sunucuda tutar, istemciye rastgele bir kimlik verir.
JWT
JSON Web Token
JWT, kullanıcı kimliği ve son kullanma zamanı gibi bilgileri taşıyan, imzalı ve kompakt bir token'dır; sunucunun oturum aramadan istekleri doğrulamasını sağlar.
JWT sayfasını okuOturum
Oturum, sunucunun bir kullanıcıyı birçok istek boyunca hatırlama yöntemidir; genellikle veriler sunucuda tutulur ve tarayıcıya bir oturum kimliği verilir.
Oturum sayfasını okuJWT ve Oturum karşılaştırması
| Özellik | JWT | Oturum |
|---|---|---|
| Durumun yaşadığı yer | Token'ın kendisinde, istemcide tutulur | Sunucuda; bellekte, bir veritabanında ya da bir önbellekte |
| İstemcinin tuttuğu | Kullanıcı kimliği ve son kullanma gibi claim'ler içeren imzalı bir token | Rastgele, anlamsız bir oturum kimliği |
| Doğrulama | İmza bir anahtarla denetlenir; sorgu yok | Oturum kimliği oturum deposunda aranır |
| Çıkış ve iptal | Süre dolmadan zor; kısa ömürler ya da bir engelleme listesi gerekir | Anında: oturum sunucuda silinir |
| Ölçekleme | Anahtara sahip her sunucu doğrulayabilir | Sunucuların ortak bir oturum deposuna ihtiyacı var |
| Boyut | Yüzlerce bayt ya da daha fazlası, her istekle gönderilir | Birkaç düzine baytlık küçük bir kimlik |
| En uygun olduğu yer | API'ler, mobil uygulamalar, mikroservisler ve tek oturum açma (SSO) | Sunucuda oluşturulan sayfalara sahip geleneksel web uygulamaları |
Fark, açıklamalı
JSON Web Token (JWT), üç parçalı kompakt ve imzalı bir metindir: bir başlık, kullanıcı kimliği ve son kullanma zamanı gibi claim'lerden oluşan bir payload ve bir imza. Oturum tabanlı kimlik doğrulamada ise sunucu girişten sonra bir oturum kaydı oluşturur, onu bellekte, bir veritabanında ya da bir önbellekte tutar ve tarayıcıya, genellikle bir cookie içinde, rastgele bir oturum kimliği gönderir.
Asıl fark, durumun nerede yaşadığıdır. Oturumlarda gerçeği sunucu tutar, bu yüzden her istek bir sorgu gerektirir; ama birini oturumdan çıkarmak ya da izinlerini değiştirmek hemen etkili olur. JWT kendi içinde eksiksizdir: doğrulama anahtarına sahip herhangi bir sunucu ona ortak bir depolama olmadan güvenebilir; bu dağıtık sistemlere ve API'lere uygundur, ama çalınmış ya da güncelliğini yitirmiş bir token süresi dolana kadar geçerli kalır.
Sık birleştirilirler. Birçok sistem, kısa ömürlü JWT erişim token'larını sunucuda saklanan ve iptal edilebilen bir yenileme (refresh) token'ıyla eşleştirir; bir JWT de tıpkı bir oturum kimliği gibi bir HttpOnly cookie içinde durabilir. Token biçimi ile saklandığı yer ayrı kararlardır.
Sık yapılan bir yanlış, JWT'lerin şifreli olduğu düşüncesidir. Standart imzalı bir JWT yalnızca Base64URL ile kodlanmıştır, bu yüzden payload'ını herkes okuyabilir; imza yalnızca değiştirilmesini önler. Bir JWT'nin içine asla gizli bilgi koymayın ve onun iyi işletilen bir oturum deposundan kendiliğinden daha güvenli ya da daha ölçeklenebilir olduğunu varsaymayın.
Hangisini kullanmalısınız?
JWT şu durumlarda doğru seçim:
- Birçok servisin, ortak bir oturum veritabanı paylaşmadan kullanıcıları doğrulaması gerekiyor.
- İstemciler yalnızca tarayıcılar değil, mobil uygulamalar ya da üçüncü taraf API tüketicileri de.
- Tek oturum açma ya da token üreten bir kimlik sağlayıcı kullanıyorsunuz.
Oturum şu durumlarda doğru seçim:
- Anında çıkışa ya da izinlerde hemen etkili değişikliklere ihtiyacınız var.
- Uygulamanız çoğunlukla tek bir arka ucun sunduğu tarayıcı tabanlı bir site.
- HttpOnly bir oturum cookie'siyle en basit güvenli kurulumu istiyorsunuz.
Bir JWT üretmek ile oturum başlatmak
// JWT: sign the claims and hand the token to the client
const token = jwt.sign({ sub: user.id, role: "admin" }, SECRET, {
expiresIn: "15m",
});
// Later, on any server: verify the signature, no lookup
const claims = jwt.verify(token, SECRET);// Session: keep state on the server, send only an ID
app.post("/login", async (req, res) => {
const user = await checkPassword(req.body);
req.session.userId = user.id; // saved in the session store
res.send("Logged in");
});
// Later: the cookie's session ID is looked up automatically
app.get("/me", (req, res) => res.json({ id: req.session.userId }));Sık sorulan sorular
JWT'ler oturumlardan daha mı güvenli?
Doğası gereği değil. İyi uygulandığında ikisi de güvenlidir; oturumları iptal etmek daha kolaydır, JWT'leri ise süre dolmadan geçersiz kılmak daha zordur ve kısa ömürlü olmalıdır.
Bir JWT'yi tarayıcıda nerede saklamalıyım?
HttpOnly, Secure bir cookie onu JavaScript'in ve XSS saldırılarının erişiminden uzak tutar, ama o zaman CSRF korumasına ihtiyacınız olur. Token'ları localStorage'da saklamak daha basittir, ama onları sayfadaki her betiğe açık bırakır.
JWT ile bir kullanıcının oturumu kapatılabilir mi?
Doğrudan değil; çünkü token süresi dolana kadar geçerli kalır. Yaygın çözümler kısa geçerlilik süreleri, iptal edilebilir yenileme token'ları ve iptal edilen token kimliklerinden oluşan sunucu tarafı bir engelleme listesidir.