JWT
JSON Web Token
- Okunuşu
- cey-dabılyu-ti ya da cot
Kısaca
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 nedir?
JSON Web Token, noktalarla ayrılmış ve Base64URL ile kodlanmış üç bölümden oluşan bir metindir: imzalama algoritmasını belirten bir başlık (header), sub (kullanıcı kimliği) ve exp (son kullanma zamanı) gibi claim'leri içeren bir payload ve bir imza. İmza bir gizli anahtar ya da özel anahtarla oluşturulur; bu yüzden başlıkta veya payload'da yapılan her değişiklik token'ı geçersiz kılar.
Tipik bir giriş akışında sunucu, kullanıcının kimlik bilgilerini denetledikten sonra bir JWT üretir; istemci de sonraki isteklerde, genellikle Authorization: Bearer <token> başlığıyla bunu geri gönderir. Sunucu imzayı ve son kullanma zamanını doğrular, ardından bir oturum deposuna sormadan claim'lere güvenir. Bu durum JWT'leri API'ler, mikro servisler ve OAuth ile OpenID Connect üzerinden tek oturum açma (SSO) için popüler kılar.
JWT, bir festivaldeki, müdahale edilirse belli olan bileklik gibidir: görevliler bilet ofisini aramadan bileği bir bakışta kontrol edebilir, ama üzerinde yazanı herkes okuyabilir. Payload yalnızca kodlanmıştır, şifrelenmemiştir; bu yüzden içine asla parola ya da başka sırlar koymayın.
Sunucu taraflı oturumlarla karşılaştırıldığında JWT'ler durumsuzdur (stateless); bu da ölçeklemeyi kolaylaştırır ama süresi dolmadan iptal etmeyi zorlaştırır. İyi uygulama, erişim token'larını kısa ömürlü tutmak, yenilerini almak için refresh token'lar kullanmak, imzayı her zaman açıkça belirlenmiş izinli algoritmalar listesine göre doğrulamak ve token'ları enjekte edilen betiklerin kolayca okuyamayacağı yerlerde, örneğin HttpOnly çerezlerde saklamaktır.
Bir bakışta
Önemli noktalar
- JWT'nin üç bölümü vardır: header, payload ve imza.
- İmza, token'ın değiştirilmediğini kanıtlar.
- Payload'ı herkes okuyabilir; bu yüzden sır içermemelidir.
- JWT'ler durumsuzdur ve iptal edilmesi zordur; bu yüzden kısa ömürlü tutun.
- İmzayı her zaman doğrulayın ve izin verilen algoritmaları kısıtlayın.
Örnek
import jwt from "jsonwebtoken";
const secret = process.env.JWT_SECRET;
// After a successful login: sign a short-lived token
const token = jwt.sign({ sub: user.id, role: "editor" }, secret, {
expiresIn: "15m",
});
// On each request: check signature, algorithm, and expiry
// (throws an error if the token was altered or has expired)
const claims = jwt.verify(token, secret, { algorithms: ["HS256"] });
console.log(claims.sub);Sık sorulan sorular
JWT ile oturum çerezleri arasındaki fark nedir?
Oturum çerezinde oturum verilerini sunucu saklar ve çerez yalnızca aranması gereken rastgele bir kimlik taşır. JWT ise kullanıcının claim'lerini imzalı token'ın içinde taşır; bu yüzden arama gerekmez, ancak süresi dolmadan iptal etmek daha zordur. JWT de bir çerezde saklanabilir; yani ikisi birbirini dışlamaz.
JWT şifreli midir?
Standart imzalı bir JWT şifreli değildir; payload'ını herkes çözüp okuyabilir. İmza yalnızca kurcalamayı önler; şifreli token'lar JWE adlı ayrı bir biçim kullanır.
Tarayıcıda JWT'yi nerede saklamalıyım?
HttpOnly ve Secure bir çerez, token'ı JavaScript'in erişiminden uzak tutar ve XSS yoluyla çalınmasını önler; ancak bu durumda CSRF koruması gerekir. localStorage'da saklamak CSRF'i önler ama token'ı sayfada çalışan her betiğe açık bırakır.
Sık karşılaştırılanlar
- JWT vs SessionJWT, 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 vs OAuthOAuth, uygulamaya kullanıcı verisine sınırlı erişim veren bir çerçeve, JWT ise bir token biçimidir. Rakip değiller: OAuth çoğu zaman JWT erişim token'ı verir.
İlgili sayfalar
- OAuthGüvenlik, s. 21OAuth, bir uygulamanın kullanıcının parolasını hiç görmeden başka bir servisteki verilerine erişmesini sağlayan açık bir yetkilendirme standardıdır.
- CookieWeb Geliştirme, s. 7Cookie, bir web sitesinin tarayıcıdan saklamasını ve sonraki isteklerle geri göndermesini istediği, çoğunlukla oturum açık tutmak için kullanılan küçük veridir.
- JSONBackend ve API'ler, s. 24JSON, yapılandırılmış veriyi anahtar-değer çiftleri ve listelerle saklayıp aktarmaya yarayan, insanın da makinenin de okuyabildiği hafif bir metin biçimidir.
- HashingGüvenlik, s. 12Hashing, bir girdiyi tek yönlü bir fonksiyonla sabit uzunlukta bir değere dönüştürmektir; veri bütünlüğünü doğrulamaya ve parolaları güvenle saklamaya yarar.
- APIBackend ve API'ler, s. 2API, bir yazılımın başka bir yazılımdan veri ya da işlem talep etmesini sağlayan, belgelenmiş ve öngörülebilir kurallar bütünüdür.
- CSRFGüvenlik, s. 5CSRF, oturum açmış kullanıcının tarayıcısını güvenilir bir siteye istenmeyen istek göndermeye kandıran, sitenin de gerçek kullanıcı eylemi sandığı saldırıdır.
- Refresh TokenGüvenlik, s. 30Refresh token, uygulamanın yeniden giriş istemeden kısa ömürlü yeni access token'lar almak için kullandığı uzun ömürlü kimlik bilgisidir.
- HMACGüvenlik, s. 13HMAC, gizli bir anahtarı hash fonksiyonuyla birleştirip mesajın anahtarı bilen birinden geldiğini ve yolda değişmediğini kanıtlayan bir etiket (tag) üretir.
- Base64Programlamanın Temelleri, s. 3Base64, resim ya da anahtar gibi her tür ikili veriyi yalnızca 64 güvenli metin karakteriyle yazar; böylece veri metin için yapılmış sistemlerden geçebilir.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin