JWT token nasıl çözülür: geliştiriciler için eksiksiz kılavuz
API’niz az önce 401 Unauthorized döndürdü. Authorization: Bearer eyJhbGciOi... header’i düzgün görünüyor. Token’in süresi mi dolmuştu, audience mi yanlıştı, yoksa issuer bir anahtarı mı döndürdü? Token’in gerçekte içinde ne olduğunu okumadan bu soruyu yanıtlayamazsınız ve bir JWT token’i çözmek için bir secret’e, bir kütüphaneye, hatta bir ağ bağlantısına bile ihtiyacınız yoktur. Bir JWT, noktalarla birleştirilmiş üç base64url kodlu parçadır. Çözmek mekanik bir işlemdir: ayır, base64url, JSON.parse. Sihir yok, kriptografi yok.
Bu kılavuz anatomiyi adım adım anlatır, Node.js, Python, Go ve tarayıcıda bir JWT’nin nasıl çözüleceğini gösterir, çoğu ekibin tökezlediği decode-vs-verify ayrımını ele alır ve sizi ısıracak gerçek hata modlarını listeler. Şu anda yalnızca bir token incelemeniz gerekiyorsa ücretsiz JWT çözücümüze atlayın. Tamamen tarayıcınızda çalışır, böylece üretim token’leriniz cihazınızdan asla ayrılmaz.
JWT nedir? (Hızlı anatomi)
Bir JSON Web Token (JWT), RFC 7519’da tanımlanan kompakt, URL güvenli bir kimlik bilgisidir. İki taraf arasında claim’leri, yani kullanıcı ve token’in kendisi hakkındaki verileri taşır. Bir JWT, noktalarla birleştirilmiş üç base64url kodlu parçadan oluşur: bir header, bir payload ve bir signature.
Yapıyı görebilmeniz için parçalarına ayrılmış gerçek bir token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ← header
.
eyJzdWIiOiJ1c2VyXzEyMyIsImV4cCI6MTk5OTk5OTk5OX0 ← payload
.
4NhxPjwoZxPNuxG-2C5ugGxaUsUJ0QyskAz7Ymz5Sg0 ← signature
Header, token’in nasıl imzalandığını tanımlar; genellikle { "alg": "HS256", "typ": "JWT" }. Payload, claim’leri taşır: sub, exp, iat gibi tescilli olanlar ve role veya tenant gibi özel olanlar. Signature ise header ve payload üzerinden hesaplanan, alıcının kurcalamayı tespit etmesini sağlayan kriptografik bir kanıttır. Base64url, base64’ün URL güvenli bir varyantıdır; MIME, data URL ve karakter kümesi farklılıkları üzerine bir başlangıç için Base64 ileri düzey rehberimize bakın.
Modern auth’un yaşadığı her yerde JWT’lerle karşılaşacaksınız: OAuth 2.0 access token’leri, OpenID Connect ID token’leri, Auth0, Okta, Clerk, Supabase, Firebase tarafından basılan API kimlik bilgileri ve bir mesh içinde mikro servisler arasında iletilen token’ler. Son on yılın varsayılan kimlik bilgisi formatıdır.
Daha ileri gitmeden önce içselleştirmeniz gereken bir cümle: JWT’ler kodlanmıştır, şifrelenmemiştir. Token’i elinde bulunduran herkes her claim’i okuyabilir. Signature kaynağı kanıtlar; içeriği gizlemez. Bu tek gerçek, sonrasında geleni belirler: payload’a ne koymanın güvenli olduğu, çözmenin neden bir secret gerektirmediği ve sunucu tarafında signature doğrulamasının neden tartışılamaz olduğu.
JWT çözme nasıl çalışır (base64url, şifre çözme değil)
Bir JWT’nin çözülmesi kriptografik bir işlem değildir. Dört mekanik adımdır:
- Token’i
.üzerinden tam olarak üç segmente ayırın. - İlk segmenti base64url ile çözün ve JSON olarak ayrıştırın. Bu, header’dir.
- İkinci segmenti base64url ile çözün ve JSON olarak ayrıştırın. Bu, payload’dır.
- Üçüncü segmenti (signature) ham byte olarak bırakın. Doğrulamak için anahtar gereklidir.
Tüm algoritma budur. Hiçbir kütüphane zorunlu değildir. Base64 ve bir JSON ayrıştırıcısı olan herhangi bir dil, bir JWT’yi beş satırda çözebilir. Mekanizmayı görmek isterseniz Base64 kodlayıcı/çözücümüz 2. ve 3. adımları sizin için elle yapacaktır.
base64url nedir?
Base64url, çıktının URL’lerde ve HTTP header’larında güvenli olması için üç ufak değişiklikle düzenlenmiş düz base64’tür: -, + yerine geçer, _, / yerine geçer ve sondaki = dolgusu atılır. Ham base64url’i, bu yer değiştirmeleri tersine çevirmeden standart bir base64 çözücüye verirseniz ya çöp ya da bir hata alırsınız. Gelişmiş Base64 kılavuzu padding uç durumlarını derinlemesine ele alır.
| Standart base64 | base64url | |
|---|---|---|
| Alfabe | A-Z a-z 0-9 + / | A-Z a-z 0-9 - _ |
| Padding | Sonda = zorunlu | Atılır |
| URL güvenli mi? | Hayır | Evet |
| Örnek | PDw/Pz8+ | PDw_Pz8- |
Yüksek sesle söylenmesi gereken bir şey daha: signature’i istemci tarafında çözemezsiniz. Çözme, kodlanmış byte’lardan JSON’a tek yönlüdür. Signature’i doğrulamak ayrı bir işlemdir ve ya HMAC secret’ine (HS ailesi algoritmaları için) ya da issuer’in açık anahtarına (RS, PS, ES, EdDSA için) ihtiyaç duyar.
Çözmek için neden secret’e ihtiyacınız yok
Çünkü payload, şifreli metin değil, base64url artı JSON’dur. Bir secret yalnızca token’in kurcalanmadığını kanıtlamak istediğinizde, yani bir signature kontrolünde devreye girer. Ağ üzerindeki herkes, bir log satırında token’i tutan herkes, tarayıcısı olan herkes, içine koyduğunuz her claim’i okuyabilir. Bu nedenle bir JWT payload’ına asla parolaları, API anahtarlarını veya alıcının zaten bildiklerinin ötesindeki PII’yi koymamalısınız. Base64’ün neden şifreleme olmadığını ele alan Base64 ileri düzey rehberimizin güvenlik bölümüne bakın.
JWT’yi çevrimiçi 3 tıkla çözün: ücretsiz JWT çözücü
Bazen şu anda bir cevaba ihtiyacınız vardır. Bu token’in süresi doldu mu, aud claim’i sandığım gibi mi, header alg:none mi diyor? En hızlı yol çevrimiçi JWT çözücümüzdür. Sabah 2’deki olay müdahale yolu için tasarlanmıştır.
- Tam token’i giriş alanına yapıştırın. Üç noktayla ayrılmış segmentin tümünü dahil edin.
- Çözülmüş header’i, payload’ı ve üstteki durum çiplerini okuyun: algoritma, issued-at, expiration ve
expzaten geçmişteyse kırmızı birExpiredrozeti. - İhtiyacınız olan paneli hata raporunuza, Slack thread’inize veya test fixture’ınıza kopyalayın.
Gerçek üretim token’leri için neden güvenli olduğu:
- %100 tarayıcı tabanlı. Çözme, native
atobveJSON.parseüzerinden çalışır. Asla bir ağ isteği yapılmaz. - Loglama yok, izleme yok, cookie yok, kayıt yok.
- Sayfa bir kez yüklendikten sonra çevrimdışı çalışır.
JWT Çözücü aracı algoritmadan bağımsızdır. Çözme yalnızca base64url ve JSON gerektirdiğinden her JWS varyantını okur: HS256/384/512, RS256/384/512, PS256/384/512, ES256/384/512, EdDSA ve alg:none. Yalnızca signature doğrulaması algoritmaya bağlıdır ve doğrulama, herkese açık bir web aracının yapmasını isteyeceğiniz bir şey değildir. Birazdan buna döneceğiz.
Aracı çapraz kontrol etmek için bir segmenti elle base64-decode etmeniz mi gerekiyor? Base64 kodlayıcı/çözücümüzü kullanın ve her segmenti base64url olarak besleyin.
Kodda JWT nasıl çözülür (Node.js, Python, Go, tarayıcı)
Etkileşimli hata ayıklama dışındaki her şey için, yani middleware, testler, geçiş scriptleri, CLI araçları, bir kütüphaneye uzanırsınız. Karşılaşma olasılığınızın en yüksek olduğu dört ortamda bir JWT’yi çözmek için minimum kod, salt okuma yolu ve doğrulama yolu yan yana. Her snippet kopyala-yapıştır yapılabilir ve yorumlarda gösterilen çıktıları üretir.
Node.js’te JWT çözme (jsonwebtoken)
// npm install jsonwebtoken
const jwt = require('jsonwebtoken');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJzdWIiOiJ1c2VyXzEyMyIsImV4cCI6MTk5OTk5OTk5OX0' +
'.4NhxPjwoZxPNuxG-2C5ugGxaUsUJ0QyskAz7Ymz5Sg0';
// Sadece çöz — signature'i DOĞRULAMAZ
const decoded = jwt.decode(token, { complete: true });
console.log(decoded.header); // { alg: 'HS256', typ: 'JWT' }
console.log(decoded.payload); // { sub: 'user_123', exp: 1999999999 }
// Doğrula — üretim yolu
const secret = process.env.JWT_SECRET;
const verified = jwt.verify(token, secret, { algorithms: ['HS256'] });
verify’a her zaman açık bir algorithms allowlist’i verin. Bunu atlamak, tarihsel olarak saldırganların, açık anahtarı bir HMAC secret’i olarak imzalayarak bir RS256 token’ini HS256’ya düşürmesine izin vermiştir; klasik algoritma karışıklığı saldırısı. Allowlist sizin savunmanızdır.
Python’da JWT çözme (PyJWT)
# pip install PyJWT
import jwt
token = (
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
".eyJzdWIiOiJ1c2VyXzEyMyIsImV4cCI6MTk5OTk5OTk5OX0"
".4NhxPjwoZxPNuxG-2C5ugGxaUsUJ0QyskAz7Ymz5Sg0"
)
# Sadece çöz — auth için güvensiz, inceleme için uygun
decoded = jwt.decode(token, options={"verify_signature": False})
print(decoded) # {'sub': 'user_123', 'exp': 1999999999}
# Payload'a dokunmadan header
header = jwt.get_unverified_header(token)
print(header) # {'alg': 'HS256', 'typ': 'JWT'}
# Doğrula — üretim yolu
payload = jwt.decode(
token,
key="your-hs256-secret",
algorithms=["HS256"],
audience="api.example.com",
)
PyJWT, bir algorithms listesi olmadan doğrulamayı reddeder; Node örneğinin uyardığı aynı karışıklık saldırısını engelleyen mantıklı bir varsayılan.
Go’da JWT çözme (golang-jwt/jwt/v5)
// go get github.com/golang-jwt/jwt/v5
package main
import (
"fmt"
"github.com/golang-jwt/jwt/v5"
)
func main() {
tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +
".eyJzdWIiOiJ1c2VyXzEyMyIsImV4cCI6MTk5OTk5OTk5OX0" +
".4NhxPjwoZxPNuxG-2C5ugGxaUsUJ0QyskAz7Ymz5Sg0"
// Sadece çöz
parser := jwt.NewParser()
claims := jwt.MapClaims{}
_, _, err := parser.ParseUnverified(tokenString, claims)
if err != nil {
panic(err)
}
fmt.Println(claims["sub"], claims["exp"]) // user_123 1.999999999e+09
// Doğrula
secret := []byte("your-hs256-secret")
token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected alg: %v", t.Header["alg"])
}
return secret, nil
})
fmt.Println(token.Valid, err)
}
keyFunc closure’ı algoritma ailesini zorunlu kıldığınız yerdir. Anahtarı geri vermeden önce beklediğiniz yöntem olmayan her şeyi reddedin.
Tarayıcıda JWT çözme (sıfır bağımlılık)
Bazen hiç bağımlılık istemezsiniz: hızlı bir hata ayıklama paneli, bir tarayıcı eklentisi, mevcut kullanıcının rolünü gösteren küçük bir UI rozeti. Native tarayıcı API’leri yeterlidir.
function decodeJwt(token) {
const [h, p] = token.split('.');
const pad = (s) => s + '==='.slice((s.length + 3) % 4);
const decodeSegment = (s) => {
const b64 = pad(s).replace(/-/g, '+').replace(/_/g, '/');
const bytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));
return JSON.parse(new TextDecoder().decode(bytes));
};
return { header: decodeSegment(h), payload: decodeSegment(p) };
}
const { header, payload } = decodeJwt(token);
console.log(header); // { alg: 'HS256', typ: 'JWT' }
console.log(payload); // { sub: 'user_123', exp: 1999999999 }
TextDecoder geçişi, ASCII olmayan payload’a sahip her token için önemlidir (görüntülenen ad alanında emoji, preferred_username içinde Kiril). Düz atob, JSON.parse’ı çok byte’lı UTF-8’de bozan ikili bir string döndürür. Çevrimiçi JWT çözücümüzün tarayıcınızda yerel olarak çalıştırdığı şey tam olarak budur, eksi UI.
Karşılaştırma tablosu
| Dil | Sadece çöz | Doğrula | Kütüphane |
|---|---|---|---|
| Node.js | jwt.decode(token) | jwt.verify(token, key, { algorithms: [...] }) | jsonwebtoken |
| Python | jwt.decode(token, options={"verify_signature": False}) | jwt.decode(token, key, algorithms=[...]) | PyJWT |
| Go | parser.ParseUnverified(token, claims) | jwt.Parse(token, keyFunc) | golang-jwt/jwt/v5 |
| Tarayıcı | atob + TextDecoder + JSON.parse | Backend tarafına sorun | — |
Decode vs verify: kritik fark
Bir JWT’yi çözmek, claim’lerini okumaktır; bir JWT’yi doğrulamak ise bu claim’lerin kurcalanmadığını kanıtlamaktır. Çözme asla güvenmez; güven, doğrulamadır. İşleyen bir auth uygulamasını bir CVE’den ayıran tek ayrım budur.
| Decode | Verify | |
|---|---|---|
| Secret/anahtar gerekir mi? | Hayır | Evet |
| İstemci tarafında çalışır mı? | Güvenle | Asla |
| Özgünlüğü kanıtlar mı? | Hayır | Evet |
| Süreyi kontrol eder mi? | İsteğe bağlı | Evet |
| Kullanım durumu | Hata ayıklama, inceleme | Authentication, authorization |
Çözülmüş (doğrulanmamış) bir JWT’den asla bir authorization kararı vermeyin. Middleware’de değil, bir React hook’unda değil, gateway’in arkasında olduğunu sandığınız bir serverless işlevde değil. Çözülmüş claim’ler token’in ne iddia ettiğini söyler; doğrulanmış claim’ler issuer’in neyi imzaladığını söyler. Sunucunuza geçerli bir signature olmadan elle hazırlanmış bir token veren bir saldırgan, payload’a istediği her şeyi koyabilir ve yalnızca signature kontrolü onu reddeder.
HMAC ailesi hakkında bir ayrıntı daha: HS256 kullanıyorsanız secret’inizin entropisi her şeydir. Kısa, tahmin edilebilir bir secret, bir saldırganın yakaladığı herhangi bir token’e karşı çevrimdışı brute-force ile kırılır ve ardından kendi token’lerini basıp ön kapıdan içeri girerler. En az 256 bit gerçek rastgelelik kullanın. Kaba kuvvet direncinin arkasındaki matematik için MD5 vs SHA-256 karşılaştırma rehberimize bakın.
Yaygın JWT claim’leri referansı
Karşılaştığınız her JWT, RFC 7519’daki tescilli claim’lerin bir alt kümesini kullanır. Kısa listeyi ezberleyin:
| Claim | Adı | Örnek | Notlar |
|---|---|---|---|
iss | Issuer | https://auth.example.com | Token’i kimin bastığı |
sub | Subject | user_123 | Genellikle kullanıcı kimliği |
aud | Audience | api.example.com | Token’in kimin için olduğu — sunucuda eşleşmek zorundadır |
exp | Expiration | 1715003600 | Unix saniyeleri; geçmiş = süresi dolmuş |
iat | Issued At | 1715000000 | Token’in basıldığı Unix saniyeleri |
nbf | Not Before | 1715000060 | Token’in kullanılabileceği en erken zaman |
jti | JWT ID | d1f8… | Token başına benzersiz; replay’i önler |
kid | Key ID (header) | key-2025-01 | Bunu JWKS’inizdeki hangi anahtarın imzaladığı |
Uygulamaya özgü claim’ler bunların yanında durur: role, scope, email, tenant_id, identity provider’inizin yaydığı her şey. Onları kısa tutun. Her byte her istekte birlikte gider.
iat ve exp’tan insan tarafından okunabilir tarihler okumak için Unix zaman damgası dönüştürücümüzü deneyin. Sayıyı yapıştırın, yerel saat diliminizdeki tarihi alın ve bir saniyede bir saat kayması hatasını yakalayın.
Sorun giderme: JWT’m neden çözülmüyor?
Beş gerçek hata modu, kabaca sıklık sırasına göre. Her biri Belirti → Neden → Düzeltme olarak çerçevelenmiştir.
- “Geçersiz JWT formatı, üç segment bekleniyordu.” Yalnızca payload’ı kopyaladınız ya da shell token’i satırlara böldü ve siz yalnızca ilk satırı aldınız. Düzeltme: tam
xxx.yyy.zzzdeğerini orijinal yanıt gövdesinden, render edilmiş bir terminalden değil yeniden kopyalayın. Uzun tek satırlı değerler bir tarayıcı devtools Network sekmesinde, kaydırılmış bir terminalde olduğundan daha iyi hayatta kalır. - Üç yerine beş segment. Bir JWS’iniz değil, bir JWE’niz (şifreli JWT) var. Format
header.encryptedKey.iv.ciphertext.tagşeklindedir. Bir çözücü header’i okur, ancak payload şifreli metindir. Düzeltme: payload’ı çözmek için şifre çözme anahtarı gerekir; genellikle bir hata ayıklama aracı tarafından değil, auth SDK’nız tarafından sunucu tarafında işlenir. - Aksi takdirde geçerli görünen bir token’de Base64url hatası. Token, kopyalama yolunda bir yerde URL ile kodlanmıştı (bir cookie, bir yönlendirme URL’si, yakalanmış bir proxy logu). String’de literal
%2Eveya%2Bgöreceksiniz. Düzeltme: önce URL ile çözün, ardından sonucu JWT çözücüye besleyin. - Payload’da JSON ayrıştırma hatası. Bir terminal veya sohbet istemcisi yumuşak sarmalı yeni satırlar ekledi ya da bir script bir tanımlayıcı etrafına akıllı tırnak yapıştırdı. Düzeltme: ham yanıt byte’larını görüntüleyin (curl ile
-o file.txtveya devtools’un Raw görünümü), boşlukları temizleyin ve tekrar yapıştırın. - Temiz çözülür ama backend yine de reddeder. Bir çözme sorunu değil, bir doğrulama sorunu. Token yapısal olarak geçerli; sunucunun kontrol ettiği bir şey (signature,
aud,exp, saat kayması,kidaraması) başarısız oluyor. Bir sonraki bölüme atlayın.
Ayrıştırma hataları olmayan ancak çözücü açıkken yakalamaya değer iki onurlu söz: header’de none alg değeri (üretimde düşmanca davranın) ve geçmişteki bir exp değeri. Çözücü, hata ayıklayabilmeniz için claim’leri yine de gösterir; bu doğru davranıştır ve aracımız bunu kırmızı bir Expired rozetiyle işaretler.
Çözmek yetmediğinde: signature doğrulaması
Çözme, “işte token’in iddia ettiği şey” noktasında biter. Doğrulama, bir iddiayı bir güven kararına dönüştüren şeydir. Signature, issuer’in özel anahtarı veya paylaşılan secret ile hesaplanan, header ve payload’ı birbirine bağlayan bir kanıttır. Tek bir byte’ı değiştirin ve signature kontrolü başarısız olur. O kontrol olmadan, endpoint’inize POST atabilen herkes payload’ı düzenleyip signature’i tamamen atlayarak elle bir “admin” token’i hazırlayabilir.
alg:none değerini asla kabul etmeyin.
Üretim doğrulaması, her dilde ve framework’te kabaca şu kontrol listesine benzer. Eksik öğeleri hata olarak değerlendirin:
- Açık bir
algorithms: ['RS256'](veya kullandığınız her neyse) allowlist’i verin. Bu, algoritma karışıklığı saldırılarını yener. aud’un servisinizin tanımlayıcısıyla veiss’in beklendiğiniz issuer URL’siyle eşleştiğini doğrulayın.exp’i mevcut zamana karşı en fazla 60 saniyelik saat kayması toleransıyla kontrol edin.- Anahtar rotasyonunda, açık anahtarı bir JWKS endpoint’inden
kidile arayın. Tek bir anahtarı asla sonsuza dek hardcode etmeyin. exp’i kısa tutarak (gün değil, dakika) etkin biçimde iptal edin ve isteğe bağlı olarak yüksek değerli token’ler için birjtidenylist sürdürün.
Her ana akım JWT kütüphanesi bunları tek bir çağrıda seçenek olarak sunar. Doğrulama kodunuz bunları ayarlamıyorsa varsayılanları açık bırakıyorsunuz demektir ve varsayılanlar tarihsel olarak hatanın kendisi olmuştur. Doğrulama kütüphanesi seçim kriterleri için Base64 ileri düzey rehberimizin güvenlik bölümüne bakın.
SSS
Bir JWT’yi secret anahtarı olmadan çözebilir miyim?
Evet. Header ve payload base64url ile kodlanmıştır, şifrelenmemiştir; dolayısıyla token’i elinde bulunduran herkes claim’lerini okuyabilir. Secret veya açık anahtar yalnızca signature’i doğrulamak için gereklidir. Bu tasarım gereğidir: payload, alıcının authorization kararları verebilmesi için okunabilir olacak şekilde tasarlanmıştır.
Üretim JWT’mi çevrimiçi bir çözücüye yapıştırmak güvenli mi?
Yalnızca çözücü tarayıcınızda çalışıyor ve token’i asla yüklemiyorsa. JWT Çözücümüz native atob ve JSON.parse ile yerel olarak ayrıştırır; hiçbir şey hiçbir sunucuya gönderilmez. Token’inizi bir API’ye POST eden uzak hata ayıklayıcılar, kimlik bilgisi sızıntıları olarak değerlendirilmelidir.
Bir JWT’yi çözmek ile doğrulamak arasındaki fark nedir?
Çözmek yalnızca claim’leri okur. Hiçbir anahtara gerek duymaz ve hiçbir şeyi kanıtlamaz. Doğrulamak, signature’i issuer’in anahtarına karşı kontrol eder ve token’in kurcalanmadığını teyit eder. Çözülmüş ancak doğrulanmamış bir token’den asla bir authentication kararı vermeyin.
JWT’m kesilmiş görünüyor. Geçerli format ne sayılır?
Geçerli bir JWT, noktalarla ayrılmış tam olarak üç base64url segmentine sahiptir: header.payload.signature. Beş segment, bir JWS değil, şifreli bir JWT (JWE) demektir. Sıfır nokta, sarmalı bir terminal satırından yalnızca bir segment kopyaladığınız anlamına gelir.
Çözücü neden hâlâ süresi dolmuş bir token gösteriyor?
Bir çözücü, reddetmeleri hata ayıklayabilmeniz için claim’leri geçerlilikten bağımsız olarak okur. Yalnızca bir doğrulayıcı süresi dolmuş token’leri reddeder. Aracımız, exp’i yerel saatinize göre karşılaştırarak bir Expired rozeti yüzeyler; böylece Unix zaman damgalarına göz kısmadan sorunu anında yakalayabilirsiniz.
Hangi algoritmaları çözebilirim?
Hepsini. Çözme yalnızca base64url ve JSON ayrıştırma gerektirir, dolayısıyla algoritmadan bağımsızdır. Buna HS256/384/512, RS256/384/512, PS256/384/512, ES256/384/512, EdDSA ve alg:none dahildir. Yalnızca doğrulama, seçtiğiniz algoritmaya bağlıdır.
Node.js’te jwt-decode mu yoksa jsonwebtoken mu kullanmalıyım?
Yalnızca payload’ı okumanız gereken durumlarda, örneğin bir access token’inden kullanıcı adı göstermek için, frontend’de jwt-decode kullanın. Backend’de jsonwebtoken kullanın çünkü yalnızca backend imzalama anahtarını tutabilir ve jwt.verify gerçekleştirebilir. Asla istemcide doğrulamayın.
Sonuç
Bir JWT’yi çözmek, “kriptografik token”ın çağrıştırdığı kadar gizemli değildir. Beş çıkarım ve bir daha asla opak bir eyJhbGciOi… string’ine bakar halde takılı kalmayacaksınız:
- Çözme, base64url artı JSON ayrıştırmasıdır. Secret gerekmez.
- Bir JWT, noktalarla birleştirilmiş üç parçaya sahiptir (header, payload, signature).
- Çözme asla özgünlüğü kanıtlamaz. Daima sunucu tarafında issuer’in anahtarıyla doğrulayın.
alg:none’u reddedin veverify’a daima açık bir algoritma allowlist’i geçirin.- Payload’a asla parolaları, özel anahtarları veya hassas PII’yi koymayın. Token’i elinde bulunduran herkes tarafından okunabilir.
Çağrı nöbetinde hata ayıklama için ücretsiz JWT çözücümüzü yer imlerinize ekleyin. Bir token yapıştırın, claim’leri okuyun ve süre dolumlarını bir saniyede yakalayın; üstelik token’iniz tarayıcıdan asla ayrılmadan.