czay.dev
Yazılar

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.

Furkan Özay15 Eylül 2026 · 2 dk okuma
JWT şifreli değil, sadece base64

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.

JavaScript
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

JWT'yle çalışırken
  1. Payload'a hassas veri koyma — herkese açık kabul et.
  2. Yetkiyi (role, permissions) her zaman sunucuda yeniden doğrula, token'a güvenme.
  3. Süreyi kısa tut, uzun oturumlar için refresh token kullan.
  4. İ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.