JWT Token Yapısı Açıklandı: Header, Payload ve Signature
JWT Token Yapısı Açıklandı
Her JSON Web Token (JWT), iki taraf arasında talepleri (claims) taşıyan kompakt, URL açısından güvenli bir dizedir. Token tabanlı güvenlikle çalışan her geliştirici için iç yapısını anlamak önemlidir.
JWT'nin Üç Bölümü
Bir JWT, noktalarla (.) ayrılmış üç bölümden oluşur:
header.payload.signature
Örnek:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Her bölüm base64url ile kodlanmış JSON'dur. JWT imzalanır, şifrelenmez — herkes içeriğini çözebilir ve okuyabilir.
Bölüm 1: Header (Başlık)
Header, token hakkında meta verileri — imzalama algoritması ve token türünü içerir.
| Alan | Açıklama | Örnek Değerler |
|-------|-------------|----------------|
| alg | İmzalama algoritması (zorunlu) | HS256, RS256, ES256 |
| typ | Token türü (isteğe bağlı) | JWT |
| kid | Anahtar Kimliği (isteğe bağlı) | "key-1" |
{
"alg": "HS256",
"typ": "JWT"
}
alg alanı, doğrulayıcıya imzayı hangi algoritmanın oluşturduğunu söyler. Algoritma uyumsuzluğu — veya alg: "none" kabul etmek — yaygın bir JWT güvenlik açığıdır.
Bölüm 2: Payload (Yük)
Payload, kullanıcı ve meta veriler hakkında talepleri (claims) içerir. Talepler üç kategoriye ayrılır:
Kayıtlı Talepler (Registered Claims)
| Talep | Tam Adı | Amacı |
|-------|-----------|---------|
| iss | Issuer (Yayınlayıcı) | Token'ı kimin yayınladığı |
| sub | Subject (Konu) | Kullanıcıyı tanımlar |
| aud | Audience (Hedef Kitle) | Amaçlanan alıcı |
| exp | Expiration (Son Kullanma) | Token son kullanma zaman damgası |
| nbf | Not Before (Öncesinde Geçersiz) | Token bu zamandan önce geçerli değil |
| iat | Issued At (Düzenlenme Zamanı) | Token oluşturma zaman damgası |
| jti | JWT ID | Benzersiz token tanımlayıcısı |
Çözülmüş Payload Örneği
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"iss": "https://auth.example.com"
}
Genel talepler (public claims) IANA kaydında tanımlanır veya çakışmaya dayanıklı URI'ler kullanır. Özel talepler (private claims), yayınlayıcı ve tüketici arasında kararlaştırılan özel taleplerdir.
Bölüm 3: Signature (İmza)
İmza, header'daki algoritma kullanılarak kodlanmış header, kodlanmış payload ve gizli bir anahtarın birleştirilmesiyle oluşturulur. İki amaca hizmet eder:
- Bütünlük — token'ın imzalandıktan sonra değiştirilmediğini onaylar.
- Kimlik Doğrulama — token'ın beklenen tarafça imzalandığını kanıtlar.
HS256 İmza Oluşturma
HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
RS256 İmza Oluşturma
RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Base64url ve Standart Base64 Karşılaştırması
| Özellik | Standart Base64 | Base64url |
|--------|-----------------|-----------|
| Karakter 62 | + | - |
| Karakter 63 | / | _ |
| Dolgu | = | Kullanılmaz |
Bu kodlama, JWT'lerin HTTP başlıkları, sorgu parametreleri ve URL yolları için yüzde kodlaması olmadan güvenli olmasını sağlar.
Tam JWT Oluşturma Süreci
- Header JSON'ını oluşturun ve base64url ile kodlayın.
- Payload JSON'ını oluşturun ve base64url ile kodlayın.
.ayracı ile birleştirin.- Seçilen algoritma ve gizli anahtarla imzalayın.
- İmzayı base64url ile kodlayın.
- Üç bölümü
.ayraçlarıyla birleştirin.
Güvenlik Hususları
- Gizli bilgileri asla payload'da saklamayın. Payload kodlanmıştır, şifrelenmemiştir.
- Her zaman imzayı doğrulayın. Doğrulama olmadan, herkes token oluşturabilir.
algheader'ını kontrol edin.alg: "none"ve algoritma düşürme girişimlerini reddedin.- Kısa son kullanma süreleri belirleyin.
exptaleplerini aylar değil, dakikalar veya saatler cinsinden kullanın.
JWT Token'ı Çevrimiçi Çözme
Herhangi bir token'ı incelemek için JWT decoder aracını kullanın. Token'ı yapıştırın ve çözülmüş header, payload ve imzalama algoritmasını anında görün. Tüm işlemler tarayıcınızda gerçekleşir.