JWT token nasıl çözülür (decode)?

Bir JWT'yi çözmek için token'ı iki noktadan böl ve ilk iki parçayı Base64url ile çöz: birincisi başlık (algoritma ve token türü), ikincisi claim'lerin bulunduğu içerik (payload); ikisi de düz JSON'dur. Çözmek için anahtar gerekmez, çünkü JWT şifrelenmez, imzalanır; anahtar sadece üçüncü parçayı, yani imzayı doğrulamak için gerekir. Bu sayfadaki çözücü ikisini de yapar ve token'ı hiçbir yere göndermez.

5 dk okuma

Tek adımda çözme

Bir JSON Web Token şuna benzer: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.imza; noktalarla birleştirilmiş üç Base64url metni. Her JWT eyJ ile başlar, çünkü {" karakterleri Base64'te böyle görünür.

Token'ı aşağıdaki araca yapıştır. Authorization başlığından kopyalanan Bearer ön eki sorun değil. Başlığı ve içeriği biçimlendirilmiş JSON olarak, exp, iat, nbf ve auth_time claim'lerini yerel saatinle ve ne kadar önce ya da sonra olduğuyla tarih olarak görürsün; durum satırı token'ın süresinin dolup dolmadığını ya da henüz geçerli olup olmadığını söyler. İmzayı kontrol etmek için paylaşılan gizli anahtarı ya da açık anahtarı Gizli ya da açık anahtar (isteğe bağlı) alanına yaz.

Burada dene: JWT çözücü

Aracın tam sayfasını aç

JWT'nin üç parçası

  • Başlık (header): {"alg":"HS256","typ":"JWT"} gibi küçük bir JSON. alg imza algoritmasını söyler; varsa kid hangi anahtarın kullanıldığını belirtir, yayıncı anahtarlarını değiştirdiğinde işe yarar.
  • İçerik (payload): claim'ler, yani kullanıcı ve token hakkındaki bilgiler: kullanıcı kimliği, yayıncı, hedef kitle, roller, bitiş zamanı gibi. Token'ı elinde tutan herkes bunları okuyabilir.
  • İmza (signature): kodlanmış başlık ve içerik üzerinden bir gizli anahtarla (HMAC) ya da özel anahtarla (RSA veya eliptik eğri) hesaplanır. İlk iki parçanın değişmediğini ve anahtarı elinde tutan biri tarafından verildiğini kanıtlar.
  • Üç yerine beş parçalı bir token şifreli bir JWE'dir. İçeriği özel anahtar olmadan okunamaz; böyle bir token yapıştırdığında araç bunu söyler.

Sık kullanılan claim'ler ve anlamları

JWT standardı (RFC 7519) birkaç kısa claim adı tanımlar. Zamanlar NumericDate değeridir: 1 Ocak 1970 UTC'den bu yana geçen saniye, milisaniye değil. Bunları karıştırmak klasik bir hatadır; örneğin exp'i milisaniye döndüren JavaScript Date.now() ile karşılaştırmak.

ClaimAdıAnlamı
issIssuer (yayıncı)Token'ı kim oluşturdu, genelde kimlik sağlayıcının adresi
subSubject (konu)Token kimin hakkında, genelde kullanıcı kimliği
audAudience (hedef)Hangi API ya da uygulama kabul etmeli
expExpiration (bitiş)Bu andan sonra token reddedilmeli
nbfNot before (başlangıç)Bu andan önce token henüz geçerli değil
iatIssued at (oluşturulma)Token'ın oluşturulduğu an
jtiJWT IDTekil kimlik; tekrar kullanımı engellemek ya da iptal için
auth_timeGiriş zamanıKullanıcının gerçekten giriş yaptığı an (OpenID Connect)

Elle ya da kodla çözme

Base64url standart Base64'ten farklıdır: + ve / yerine eksi ve alt çizgi kullanır, = dolgusu silinir. Çözme hatalarının çoğu, JWT parçasını doğrudan standart bir Base64 çözücüye vermekten gelir. Eksiyi + ile, alt çizgiyi / ile değiştir, uzunluk 4'ün katı olana kadar = ekle, sonra çöz.

Python'da base64.urlsafe_b64decode(parca + "==") alfabeyi halleder, fazla dolguyu da sorun etmez. Tarayıcı konsolunda iki karakteri değiştirdikten sonra atob çalışır ama baytları Latin 1 olarak döndürür; içerikteki Türkçe isimlerin (Şükrü, Gülşen gibi) doğru görünmesi için UTF-8'e TextDecoder ile çevirmek gerekir. Python'da PyJWT, Node.js'te jsonwebtoken, .NET'te System.IdentityModel.Tokens.Jwt gibi kütüphaneler çözme ve doğrulamayı tek çağrıda yapar; canlı sistemde sadece çözen kısayolu değil, doğrulayan fonksiyonu kullan.

Hızlıca bakmak için araç daha pratiktir ve token'ı komut geçmişinde bırakmaz.

Çözmek doğrulamak değildir

İçeriği okumak token'ın ne iddia ettiğini söyler, iddiaların doğru olduğunu kanıtlamaz. Herkes "role": "admin" yazan bir token oluşturup Base64 ile kodlayabilir. İçeriği güvenilir yapan tek şey doğru anahtarla kontrol edilmiş geçerli bir imzadır. Sunucular hiçbir claim'i kullanmadan önce mutlaka doğrulama yapmalı.

Araçta HS256, HS384 ve HS512 token'ları paylaşılan gizli anahtarla doğrulanır. RS, PS ve ES token'ları yayıncının PEM biçimindeki açık anahtarıyla, yani BEGIN PUBLIC KEY ile başlayan blokla doğrulanır. Kimlik sağlayıcın anahtarları sadece JWKS listesi olarak yayınlıyorsa önce uygun anahtarı (kid değeri başlıktakiyle aynı olanı) PEM'e çevir. Sonuç İmza geçerli ya da İmza anahtarla eşleşmiyor olarak görünür. Özel anahtar yapıştırırsan araç onun yerine açık anahtarı ister.

Şu uyarı işaretlerine dikkat et: alg değerinin none olması (token'da hiç imza yoktur, araç imzasız olarak işaretler), beklenmeyen bir algoritma (RS256 bekleyen bir sunucu HS256 token'ı asla kabul etmemeli, bilinen bir saldırıdır) ve iss ya da aud değeri senin sisteminle uyuşmayan token'lar.

Süresi dolmuş ve geçersiz token sorunları

  • Süresi doldu: Tarihler bölümündeki bitiş tarihine bak. Erişim token'ları genelde bilerek sadece 5 ile 60 dakika yaşar; uygulama yenisini almak için refresh token kullanmalı.
  • Henüz geçerli değil: nbf ya da iat ileri bir tarihte; bu genelde sunucu saatiyle yayıncının saatinin farklı olduğunu gösterir. Birçok kütüphane birkaç saniyeden birkaç dakikaya kadar küçük bir saat farkına izin verir; saati otomatik zaman eşitlemesiyle düzelt.
  • Bu bir JWT'ye benzemiyor: token kesilmiş, tırnak içine alınmış ya da kopyalarken boşluk girmiş. Asıl başlıktan ya da çerezden yeniden kopyala.
  • Başlık ya da içerik okunamadı: token'ın bir kısmı eksik. Uzun token'lar loglarda sık sık kırpılır.
  • İmza eşleşmiyor: yanlış gizli anahtar, başka bir ortamın (test ve canlı) açık anahtarı, değiştirilmiş bir anahtar ya da üzerinde oynanmış bir token.

Token'ları güvenle kullan

Geçerli bir erişim token'ı süresi dolana kadar şifre gibi çalışır. Canlı sistem token'larını onları sunucuya gönderen sitelere yapıştırma, destek kayıtlarına ya da sohbet gruplarına yazma. Bu çözücü tamamen tarayıcında çalışır: token gönderilmez, kaydedilmez, saklanmaz.

Token üreten tarafta içeriği küçük ve gizli bilgiden arınmış tut. Herkes okuyabildiği için JWT'ye asla şifre, API anahtarı ya da istemcinin görmemesi gereken kişisel veri koyma. Kullanıcı kimliğini ve rolleri sakla, gerisini sunucuda sorgula.

Adım adım

  1. Token'ı yapıştırJWT'yi giriş alanına yapıştır. Bearer ön eki sorun değil.
  2. Başlığı ve içeriği okuBaşlık ve içerik biçimlendirilmiş JSON olarak, token'daki tarihler de yerel saatinle görünür.
  3. Durumu kontrol etDurum satırı token'ın süresinin dolduğunu, henüz geçerli olmadığını, imzasız ya da şifreli olduğunu gösterir.
  4. İmzayı doğrulaHS algoritmaları için paylaşılan gizli anahtarı, RS, PS ve ES için PEM açık anahtarı yaz ve imzanın geçerli olup olmadığını gör.

Sık sorulan sorular

Gizli anahtar olmadan JWT çözebilir miyim?

Evet. Başlık ve içerik sadece Base64url ile kodlanmıştır, herkes okuyabilir. Gizli ya da açık anahtar sadece imzayı doğrulamak için gerekir.

Token'ımı bu çözücüye yapıştırmak güvenli mi?

Evet. Çözme ve doğrulama tarayıcında yapılır; token hiçbir sunucuya gönderilmez, saklanmaz. Araç ücretsizdir ve sayfa bir kez açıldıktan sonra internetsiz de çalışır.

JWT'nin ne zaman dolacağını nasıl anlarım?

Saniye cinsinden Unix zaman damgası olan exp claim'ine bak. Araç bunu yerel tarih ve saatine çevirir, ne kadar önce dolduğunu ya da ne kadar süresi kaldığını söyler.

Hangi imza algoritmaları doğrulanabiliyor?

HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384 ve ES512.

JWT şifreli mi?

Normal bir JWT (JWS) şifrelenmez, imzalanır; içeriği okunabilir. Şifreli token'lar (JWE) beş parçalıdır ve okumak için özel anahtar gerekir.

Çözülen içerikte Türkçe harfler neden bozuk görünüyor?

İçerik büyük ihtimalle UTF-8 yerine Latin 1 olarak çözüldü ya da token eksik kopyalandı. Bu araç UTF-8'i doğru çözer; ğ, ş, ı gibi harfler olması gerektiği gibi görünür.