Ana içeriğe geç

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ı oku

Oturum

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ı oku

JWT ve Oturum karşılaştırması

ÖzellikJWTOturum
Durumun yaşadığı yerToken'ın kendisinde, istemcide tutulurSunucuda; bellekte, bir veritabanında ya da bir önbellekte
İstemcinin tuttuğuKullanıcı kimliği ve son kullanma gibi claim'ler içeren imzalı bir tokenRastgele, anlamsız bir oturum kimliği
Doğrulamaİmza bir anahtarla denetlenir; sorgu yokOturum kimliği oturum deposunda aranır
Çıkış ve iptalSüre dolmadan zor; kısa ömürler ya da bir engelleme listesi gerekirAnında: oturum sunucuda silinir
ÖlçeklemeAnahtara sahip her sunucu doğrulayabilirSunucuların ortak bir oturum deposuna ihtiyacı var
BoyutYüzlerce bayt ya da daha fazlası, her istekle gönderilirBirkaç düzine baytlık küçük bir kimlik
En uygun olduğu yerAPI'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

JWTjavascript
// 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);
Oturumjavascript
// 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.

Daha fazla

Ayarlar