JWT Nedir? Token Yapısı ve Kullanımı
Modern web uygulamalarında bir kez giriş yaptıktan sonra her sayfada tekrar şifre girmenize gerek kalmaz. Sunucu, sizi tanıyan bir "bilet" verir ve siz her istekte bu bileti gösterirsiniz. İşte JWT (JSON Web Token), bu biletin günümüzde en yaygın kullanılan biçimidir. Bu rehberde JWT'nin ne olduğunu, hangi parçalardan oluştuğunu, kimlik doğrulama akışında nasıl kullanıldığını ve dikkat edilmesi gereken güvenlik noktalarını adım adım inceleyeceğiz.
JWT Tam Olarak Nedir?
JWT (JSON Web Token), iki taraf arasında bilgileri güvenli biçimde aktarmak için kullanılan, kompakt ve URL-güvenli bir standarttır (RFC 7519). En sık karşılaşılan kullanımı kimlik doğrulama ve yetkilendirmedir.
Bir JWT, içine gömülmüş JSON verilerini taşır ve bu veriler dijital olarak imzalanmıştır. İmza sayesinde, token'ı alan taraf içeriğin yolda değiştirilmediğini doğrulayabilir. Burada kritik bir nokta var: JWT varsayılan olarak şifreli değildir, yalnızca imzalıdır. Yani içindeki bilgiler herkes tarafından okunabilir; imza sadece bunların kurcalanmadığını garanti eder.
Token'ın Üç Parçası
Bir JWT, nokta (.) ile ayrılmış üç bölümden oluşur:
xxxxx.yyyyy.zzzzz
header.payload.signature
Her parça ayrı ayrı Base64Url ile kodlanır. Tipik bir token şuna benzer:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFobWV0In0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
İlk bakışta anlamsız görünse de bu üç parça düzenli bir yapı taşır.
1. Header (Başlık)
Header genellikle iki bilgiyi içerir: token'ın tipi (typ) ve imzalamada kullanılan algoritma (alg).
{
"alg": "HS256",
"typ": "JWT"
}
2. Payload (Yük)
Payload, token'ın asıl içeriğini, yani claim denilen iddiaları taşır. Burada kullanıcı kimliği, roller, son kullanma tarihi gibi bilgiler bulunur.
{
"sub": "1234567890",
"name": "Ahmet Yılmaz",
"role": "admin",
"iat": 1748736000,
"exp": 1748739600
}
Sık kullanılan standart claim'ler şunlardır:
| Claim | Anlamı |
|---|---|
iss |
Token'ı yayınlayan (issuer) |
sub |
Konu / kullanıcı kimliği (subject) |
aud |
Hedef kitle (audience) |
exp |
Son kullanma zamanı (expiration) |
iat |
Yayınlanma zamanı (issued at) |
nbf |
Bu zamandan önce geçersiz (not before) |
Önemli: Payload yalnızca Base64Url ile kodlanmıştır, şifrelenmemiştir. Bu yüzden parola, kredi kartı numarası gibi hassas veriler asla payload'a konulmamalıdır.
3. Signature (İmza)
İmza, header ve payload'ın birleştirilip gizli bir anahtarla işlenmesiyle üretilir. HS256 algoritması için kabaca şöyle hesaplanır:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
Sunucu, token'ı her aldığında imzayı yeniden hesaplar ve gelen imzayla karşılaştırır. Eşleşmiyorsa token sahte ya da değiştirilmiş demektir ve reddedilir.
Kimlik Doğrulama Akışında JWT Nasıl Kullanılır?
JWT tabanlı bir oturum genellikle şu adımlarla işler:
- Giriş: Kullanıcı e-posta ve şifresiyle giriş yapar.
- Token üretimi: Sunucu bilgileri doğrular, payload'ı hazırlar ve gizli anahtarla imzalayarak bir JWT üretip istemciye gönderir.
- Saklama: İstemci token'ı saklar (genellikle
HttpOnlybir cookie veya bellek içinde). - İstekler: Sonraki her istekte token,
Authorization: Bearer <token>başlığıyla gönderilir. - Doğrulama: Sunucu imzayı ve
expgibi claim'leri kontrol eder; geçerliyse isteği işler.
Bu yaklaşımın en büyük avantajı stateless (durumsuz) olmasıdır: Sunucunun her kullanıcı için oturum bilgisi tutması gerekmez, çünkü gerekli bilgi token'ın içindedir. Bu da yatay ölçeklemeyi ve mikroservis mimarilerini kolaylaştırır.
Token'ı Çözmek (Decode) ile Doğrulamak (Verify) Aynı Şey Değildir
Bir JWT'nin içeriğini görmek için gizli anahtara ihtiyacınız yoktur. Header ve payload sadece Base64Url ile kodlandığı için herkes bunları çözüp okuyabilir. Geliştirme sırasında bir token'ın içinde ne olduğunu hızlıca görmek isterseniz, tarayıcınızda çalışan JWT Decoder aracımızı kullanarak header ve payload'ı saniyeler içinde okunur JSON haline getirebilirsiniz. Bu işlem tamamen tarayıcıda gerçekleşir; token'ınız hiçbir sunucuya gönderilmez.
Token'ın yalnızca bir parçasını ele alıyorsanız, örneğin payload bölümünü ayrı olarak çözmek isterseniz, Base64 Çözücü aracımızla ilgili parçayı tek başına da çözebilirsiniz; çünkü her bölüm aslında bir Base64Url metnidir.
Buradaki ayrımı net tutmak gerekir:
- Decode (çözme): Token'ı okunur hale getirir. Anahtar gerekmez, güvenlik sağlamaz.
- Verify (doğrulama): İmzanın gizli anahtarla geçerli olup olmadığını kontrol eder. Yalnızca sunucu gizli anahtara sahip olduğu için bunu güvenli biçimde sadece sunucu yapabilir.
Bu yüzden bir token'ın "çözülebilmesi" onu güvenilir kılmaz. İstemci tarafında okuduğunuz bilgilere asla kör güvenmeyin; yetki kararları her zaman sunucuda, imza doğrulandıktan sonra verilmelidir.
Güvenlik Notları
JWT güçlü bir araçtır ama yanlış kullanıldığında ciddi açıklara yol açabilir. Dikkat edilmesi gereken başlıca noktalar:
- Hassas veri koymayın: Payload herkes tarafından okunabilir. Şifre, gizli token veya kişisel hassas bilgi taşımayın.
- Kısa ömür belirleyin:
expclaim'i ile token'lara mümkün olduğunca kısa geçerlilik süresi verin. Uzun oturumlar için ayrı bir refresh token mekanizması kullanın. - HTTPS zorunludur: Token'lar her zaman şifreli bağlantı üzerinden taşınmalıdır; aksi halde araya giren biri token'ı çalabilir.
alg: nonetuzağına dikkat: Bazı kütüphaneler, imzasız token'ları kabul edecek şekilde yanlış yapılandırılabilir. Sunucu, beklediği algoritmayı açıkça zorlamalıdır.- Güçlü gizli anahtar kullanın: HS256 için kısa veya tahmin edilebilir bir anahtar, kaba kuvvet saldırılarıyla kırılabilir.
- Güvenli saklama: Tarayıcıda token'ı
localStorageyerineHttpOnlycookie'de tutmak, XSS saldırılarına karşı daha güvenlidir.
Özet
JWT, header, payload ve signature olmak üzere üç parçadan oluşan, imzalı ama şifresiz bir token formatıdır. Stateless kimlik doğrulamayı kolaylaştırır, ancak içeriği herkes tarafından okunabildiği için doğru güvenlik önlemleriyle kullanılması şarttır. Çözmek ile doğrulamak arasındaki farkı akılda tutmak, JWT'yi güvenle kullanmanın anahtarıdır.
Elinizdeki bir token'ın içinde tam olarak ne olduğunu merak ediyorsanız, hiçbir veriyi sunucuya göndermeden tamamen tarayıcınızda çalışan ücretsiz JWT Decoder aracımızı deneyebilirsiniz.
İlgili Araçlar
- JWT Decoder — Bir JWT'nin header ve payload bölümlerini tarayıcıda okunur hale getirin.
- Base64 Çözücü — Token'ın tek bir parçasını veya herhangi bir Base64 metnini çözün.

