JWT çözücü nasıl kullanılır?
- Genellikle
Authorization: Bearerifadesinden sonra gelen uzun dizeyi, yani bir JSON Web Token'ı yapıştırın. - Başlık (header) ve payload (yük) çözülür ve biçimlendirilmiş JSON olarak gösterilir.
exp,iatvenbfgibi zaman claim'leri okunabilir tarihlere dönüştürülür; böylece token'ın süresinin dolup dolmadığını bir bakışta görürsünüz.
JWT'nin yapısı: üç parça
RFC 7519 ile tanımlanan JSON Web Token, taraflar arasında claim'leri (beyanları) aktarmanın kompakt bir yoludur. Yaygın imzalı biçimi (JWS) noktalarla ayrılmış üç parçadan oluşur:
header.payload.signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.<signature>
- Header: token'ı tanımlayan JSON; başlıca imzalama algoritmasını belirtir.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9çözüldüğünde{"alg":"HS256","typ":"JWT"}olur. - Payload: claim'leri, yani kullanıcı ya da oturum hakkındaki beyanları içeren JSON.
- Signature: kodlanmış header ve payload üzerinden bir gizli anahtarla (HMAC, ör. HS256) ya da özel anahtarla (ör. RS256, ES256) hesaplanan imza.
Her parça, dolgu (padding) içermeyen, URL için güvenli Base64 alfabesi olan base64url ile kodlanır. Token'ların - ve _ içermesinin ve JWT'lerin neredeyse her zaman eyJ ile başlamasının nedeni budur: bir JSON nesnesinin açılıştaki {" karakterleri, ardından tipik bir küçük harfli anahtar adı geldiğinde böyle kodlanır. Kodlamanın kendisini Base64 kodlayıcı ile inceleyebilirsiniz.
Kayıtlı claim'ler
| Claim | Ad | Anlamı |
|---|---|---|
iss | Issuer (yayımlayan) | Token'ı kimin oluşturup imzaladığı. |
sub | Subject (konu) | Token'ın kimi ilgilendirdiği; genellikle bir kullanıcı kimliği. |
aud | Audience (hedef kitle) | Token'ın hangi hizmet(ler)e yönelik olduğu. |
exp | Expiration time (son kullanma zamanı) | Bu zamandan sonra token'ın reddedilmesi gereken Unix zaman damgası. |
nbf | Not before (öncesinde geçersiz) | Bu zamandan önce token'ın henüz geçerli olmadığı Unix zaman damgası. |
iat | Issued at (yayımlanma zamanı) | Token'ın oluşturulduğu Unix zaman damgası. |
jti | JWT ID | Benzersiz tanımlayıcı; yeniden kullanımı (replay) önlemek için işe yarar. |
RFC 7519'da bunların hepsi isteğe bağlıdır; hangilerinin zorunlu olduğuna uygulamalar karar verir. Zaman claim'leri milisaniye değil, saniye cinsindendir; farkı Unix zaman damgası dönüştürücü sayfası açıklıyor.
Sık yapılan hatalar
Çözmek doğrulamak değildir
Bir JWT'yi herkes çözebilir; bu araç da tam olarak bunu yapar. Çözmek, bir token'ın ne iddia ettiğini gösterir, bu iddiaların gerçek olup olmadığını değil. Bir sunucu, payload'daki herhangi bir şeye güvenmeden önce doğru anahtarla imzayı doğrulamalı ve exp, nbf, iss ile aud değerlerini kontrol etmelidir.
Payload gizli değildir
İmzalı bir JWT'yi elinde tutan herkes okuyabilir. Payload'a parola, istemciye açmayacağınız kişisel veriler ya da dahili gizli bilgiler koymayın. İçeriğin gizli kalması gerekiyorsa şifrelenmiş bir JWT (JWE) kullanın ya da veriyi sunucu tarafında tutun.
alg: none ve algoritma karışıklığı
JOSE spesifikasyonları, imzası boş olan güvenliksiz token'lar için bir "alg": "none" değeri tanımlar. Token'ın kendi header'ına uyan bir kütüphane, şuna benzer sahte bir token'ı kabul edebilir:
{"alg": "none", "typ": "JWT"}
{"sub": "admin"}
(boş imza)
Benzer bir saldırı, bir RS256 token'ını HS256'ya çevirerek açık anahtarın HMAC gizli anahtarı gibi kötüye kullanılmasını sağlar. İkisine karşı savunma aynıdır: izin verilen algoritmaları sunucuda yapılandırın ve seçimi asla token'a bırakmayın.
İpuçları
- Erişim token'larını kısa ömürlü tutun ve daha uzun oturumlar için yenileme (refresh) token'ları kullanın.
- Sunucular arasında
expvenbfkontrol ederken küçük bir saat kaymasına (örneğin bir dakika) izin verin. - Token'ları elle ayrıştırıp doğrulamak yerine bakımı iyi yapılan bir JWT kütüphanesi kullanın.
Sıkça sorulan sorular
Bu araç bir JWT imzasını doğrulayabilir mi?
Doğrulama, yayımlayanın gizli anahtarını ya da açık anahtarını gerektirir ve backend'inizde yapılmalıdır. Bu araç, hata ayıklarken bir token'ın header'ını ve claim'lerini incelemek içindir.
Token'ım neden süresi dolmuş görünüyor?
exp claim'inin değeri, cihazınızdaki şu anki saatten daha erken. Saatinizin doğru olduğunu ve yayımlayanın exp değerini saniye cinsinden yazdığını kontrol edin.
JWT'ler şifreli mi?
Kullanımdakilerin büyük çoğunluğunu oluşturan imzalı JWT'ler (JWS) yalnızca kodlanır ve imzalanır; bu yüzden herkes okuyabilir. Şifrelenmiş JWT'ler (JWE) üç yerine beş parçadan oluşur.
Token'ımı buraya yapıştırmak güvenli mi?
Çözme işlemi yerel olarak yapılır ve hiçbir şey iletilmez. Genel bir kural olarak, canlı üretim token'larını incelemediğiniz hiçbir online araca yapıştırmaktan kaçının.
Güncellendi