Nasıl kullanılır?
- Başlık (JSON) ve İçerik (JSON) alanlarını yazın. Zamanları doldurmak için iat'ı şimdi yap, nbf'yi şimdi yap ya da exp'i şu kadar sonra yap düğmelerini kullanın.
- Algoritma seçin ve Gizli anahtar alanını yazın. Anahtar Base64 biçimindeyse Anahtar biçimi altında Base64 seçin.
- Token alanını kopyalayın. Token, noktalarla ayrılmış üç parçadır: başlık, içerik ve imza.
- Bir token'ı Denetlenecek token alanına yapıştırarak imzasının yukarıdaki anahtarla eşleşip eşleşmediğine bakın.
Bir JWT nasıl imzalanır?
Bir JSON Web Token (RFC 7519), her biri JSON olarak yazılan ve Base64url (RFC 7515) ile kodlanan bir başlık ve bir içerikten oluşur; aralarında bir nokta vardır. İmza, bu iki parçanın gizli anahtarla üretilmiş bir HMAC'idir (RFC 7518, 3.2 bölümü). Başlık alg alanında algoritmayı adlandırır; bu sayfa o alanı sizin seçtiğiniz algoritmaya ayarlar.
Sayfa her JSON nesnesini kodlamadan önce boşluksuz biçimine çevirir; bu yüzden imzalanan baytlar, yazdığınız metnin boşluk ve satır sonlarıyla birlikte değil, boşluksuz hâlidir. Token'ı denetleyen taraf aldığı baytlarla çalıştığı için token her iki durumda da geçerlidir.
imzalanan veri = BASE64URL(başlık) . BASE64URL(içerik)
imza = HMAC-SHA-256(anahtar, imzalanan veri)
(HS384 ve HS512, HMAC-SHA-384 ve HMAC-SHA-512 kullanır)
token = imzalanan veri . BASE64URL(imza)
İçerikteki zamanlar
iat (düzenlenme zamanı), nbf (geçerlilik başlangıcı) ve exp (son kullanma zamanı) talepleri NumericDate'tir: 1 Ocak 1970 00:00 UTC'den itibaren geçen saniye sayısı (RFC 7519, 2 ve 4.1 bölümleri). Bir token exp anında ya da sonrasında, nbf anından önce kabul edilmez. Düğmeler zamanı cihazınızın saatinden yazar; saat yanlışsa zaman da yanlış olur.
Denetleme ne yapar, ne yapmaz?
Denetleme, başlığın ve içeriğin yapıştırıldığı gibi HMAC'ini yeniden hesaplar ve imzayla karşılaştırır. alg none değerini ve HS256, HS384 ile HS512 dışındaki her algoritmayı reddeder; böylece bir token daha zayıf bir denetim seçemez.
Taleplerin anlamını denetlemez: iss değerinin beklediğiniz veren olup olmadığını ya da aud alanının servisinizi gösterip göstermediğini kontrol etmez. Bunları, RFC 8725'in önerdiği gibi, uygulamanız kontrol etmelidir.
Örnek: your-256-bit-secret anahtarıyla HS256
{"alg": "HS256", "typ": "JWT"} başlığı, {"sub": "1234567890", "name": "Ada Lovelace", "iat": 1516239022} içeriği ve UTF-8 olarak your-256-bit-secret anahtarıyla sayfa şu token'ı üretir:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSBMb3ZlbGFjZSIsImlhdCI6MTUxNjIzOTAyMn0.nmm0qepYRjhNji3O-jq8Pvcr7l_me1_bomw4EJucQCU
Aynı anahtarla denetlendiğinde imza geçerli çıkar. Token'da exp ya da nbf talebi yoktur, bu yüzden hiçbir zaman onu geçersiz kılamaz. Başka bir anahtarla denetlendiğinde ise imzanın eşleşmediği bildirilir.
Sık sorulan sorular
Gizli anahtarım bir sunucuya gönderiliyor mu?
Hayır. Token tarayıcınızda, tarayıcının kendi SubtleCrypto arayüzüyle imzalanır. Anahtar yalnızca sayfa açıkken tutulur: gönderilmez, saklanmaz ve kaydedilmez.
Sayfa imzanın eşleştiğini söylüyor ama kütüphanem token'ı reddediyor, neden?
Kütüphane exp ya da nbf zamanlarını, hedef kitleyi ya da veren alanını kontrol ediyor olabilir; ya da anahtarı başka bir biçimde okuyor olabilir. Anahtarı kütüphanenizin yaptığı gibi UTF-8 ya da Base64 olarak okuyun ve zamanları doğru bir saatle karşılaştırın.
alg none neden reddediliyor?
alg değeri none olan bir token'ın imzası yoktur, bu yüzden herkes böyle bir token yazabilir. Bir servis onu reddetmelidir. Bu sayfa denetlerken onu reddeder; imzalarken ise her zaman bir HMAC algoritması yazar.
Gizli anahtar ne kadar uzun olmalı?
En az özet çıktısı kadar uzun: HS256 için 32 bayt, HS384 için 48 bayt ve HS512 için 64 bayt (RFC 7518, 3.2 bölümü). Anahtar daha kısaysa sayfa uyarır.
Bu sayfa RS256 ya da ES256 token'ı üretebilir mi?
Hayır. Sayfa yalnızca paylaşılan bir anahtarla, HS256, HS384 veya HS512 ile imzalar ve denetler. Özel bir RSA ya da ECDSA anahtarıyla imzalanmış token'lar için o anahtar gerekir; bu sayfa böyle bir anahtar almaz.
Anahtarı ne zaman Base64 olarak seçmeliyim?
Yalnızca anahtar Base64 olarak yazılmışsa; örneğin bir JSON Web Key'in k değeri. Aksi halde anahtar, yazdığınız gibi (boşluklar dahil) UTF-8 metni olarak okunur.
Kaynaklar
- RFC 7519: JSON Web Token (JWT) (İngilizce)
- RFC 7515: JSON Web Signature (JWS), A.1 test örneği (İngilizce)
- RFC 7518: JSON Web Algorithms (JWA), 3.2 bölümü (İngilizce)
- RFC 8725: JSON Web Token Best Current Practices (İngilizce)
Rakamlar ve metin en son 10 Kasım 2026 Salı tarihinde kontrol edildi.