JWT şifreli değil, sadece base64
Uygulamanın her isteğinde giden JWT token'ın içine kim bakabilir? Cevap: herkes. Token'ın gerçekte ne sakladığı, neden imza doğrulaması yeterli olduğu ve payload'a asla koymaman gereken 4 şey.

Uygulamanın her isteğinde giden token bu. İçinde ne yazdığını kim okuyabilir sence? Cevap basit: herkes.
Üç parça
Her JWT noktalarla üçe ayrılır: header.payload.signature. İlk ikisi şifreli
değil, sadece base64 ile kodlanmış. Base64 bir şifreleme yöntemi değil, yalnızca
bir yazım biçimi — istediğin an geri çevrilebilir.
const [header, payload] = token.split(".");
console.log(JSON.parse(atob(payload)));
// { sub: "user_123", email: "...", role: "admin", exp: 1735689600 }Tarayıcı konsoluna bunu yazdığında karşına e-posta adresin, kullanıcı numaran, rolün ve token'ın son kullanma tarihi çıkar. O yüzden bir JWT payload'ına şifre, TC kimlik numarası ya da kart bilgisi asla koyma.
Peki değiştirip admin olabilir miyim?
Payload'ı değiştirip role: "admin" yazabilirsin — base64 sonuçta iki yönlü bir
kodlama. Ama sunucu, yalnızca kendisinde duran gizli bir anahtarla imzayı yeniden
hesaplıyor. Senin uydurduğun payload'la imza tutmuyor, sunucu token'ı reddediyor:
401. Payload'ı okuyabilirsin, ama fark ettirmeden değiştiremezsin.
Dört kural
- Payload'a hassas veri koyma — herkese açık kabul et.
- Yetkiyi (
role,permissions) her zaman sunucuda yeniden doğrula, token'a güvenme. - Süreyi kısa tut, uzun oturumlar için refresh token kullan.
- İmzalama anahtarını (
secret) koddan değil.env'den oku ve hiçbir yere loglama.
Kapanış
JWT'nin işi gizlilik değil, bütünlük: içeriğin kurcalanmadığını garanti eder, içeriği kimden sakladığını değil. Gerçekten gizli kalması gereken bir veri varsa JWE (şifreli JWT) ya da klasik sunucu tarafı oturum kullanmalısın.
