JWT nedir?
JWT (JSON Web Token), iki taraf arasında bilgiyi kompakt ve imzalı bir JSON nesnesi olarak taşıyan açık bir standarttır. Genellikle kullanıcının kimliğini ve yetkilerini bildiren oturum jetonu olarak kullanılır. İmza sayesinde içeriğin sonradan değiştirilip değiştirilmediği doğrulanabilir.
Sunucunun her istekte veritabanına bakmadan jetonu doğrulayabilmesi JWT’yi API ve mikroservis mimarilerinde popüler kılar. Ancak içeriği şifreli değil, yalnızca imzalıdır.
Nasıl çalışır?
JWT, noktayla ayrılmış üç bölümden oluşur: başlık (algoritma bilgisi), yük (iddialar: kullanıcı kimliği, bitiş süresi vb.) ve imza. İlk iki bölüm Base64URL ile kodlanır; imza ise gizli anahtar ya da özel anahtarla üretilir. Sunucu jetonu aldığında imzayı yeniden hesaplayıp karşılaştırır, ayrıca bitiş süresini kontrol eder.
Önemli nokta: yük kodlanmıştır ama şifrelenmemiştir; jetonu ele geçiren herkes içeriği okuyabilir. Bu yüzden parola veya hassas veri yük içine konmamalıdır.
Sunucu ve hosting ortamında
Uygulamanız veya API’niz oturum yönetiminde JWT kullanıyorsa imza anahtarı sunucuda güvenle saklanmalı, kaynak kodunda ya da herkese açık depolarda bulunmamalıdır. Anahtar sızarsa saldırgan geçerli görünen sahte jetonlar üretebilir.
Ters vekil veya API ağ geçidi jeton doğrulamasını uygulamanın önünde merkezi olarak yapabilir. Jetonların tarayıcıda nerede saklandığı da önemlidir; çerez kullanılıyorsa HttpOnly, Secure ve SameSite bayrakları etkinleştirilmelidir.
Nelere dikkat edilmeli?
- İmzayı her zaman doğrulayın ve beklediğiniz algoritmayı sabitleyin; ‘none’ algoritmasını kabul etmeyin.
- Kısa ömürlü erişim jetonu ve ayrı bir yenileme jetonu kullanın.
- Bitiş (exp), alıcı (aud) ve düzenleyen (iss) alanlarını doğrulayın.
- Yük içine hassas veri koymayın.
- İmza anahtarını düzenli olarak yenileyin ve gizli tutun.
- Gerekirse iptal listesi veya sunucu tarafı oturum kaydıyla jetonu erken geçersiz kılma yolu sağlayın.
Sık yapılan hatalar
- JWT’nin şifreli olduğunu sanıp içine gizli veri koymak.
- Çok uzun ömürlü jetonlar vermek.
- Zayıf veya tahmin edilebilir imza anahtarı kullanmak.
- Jetonu tarayıcıda erişilebilir bir yerde (örneğin localStorage) saklayıp XSS riskini görmezden gelmek.
Sık sorulan sorular
JWT ne işe yarar?
Kimlik ve yetki bilgisini imzalı ve taşınabilir bir jeton olarak iletir. Sunucu, oturum bilgisini saklamadan her isteği bu jetonla doğrulayabilir.
JWT şifreli midir?
Hayır. Standart JWT yalnızca imzalıdır; içeriği Base64 kodlamasıyla herkes okuyabilir. Gizlilik gerekiyorsa şifreli bir biçim (JWE) kullanılmalı ya da hassas veri hiç eklenmemelidir.
JWT ile oturum çerezi arasındaki fark nedir?
Oturum çerezi genellikle sunucuda saklanan bir kaydı gösteren rastgele bir kimliktir. JWT ise bilginin kendisini imzalı olarak taşır. İkincisi ölçeklenmesi kolaydır ama erken iptal etmek daha zordur.
İlgili terimler
- KerberosParolayı ağdan geçirmeden, bilet (ticket) tabanlı ve karşılıklı doğrulama yapan ağ kimlik doğrulama protokolü.
- Kimlik doğrulama (authentication)Bir kullanıcının ya da sistemin iddia ettiği kişi olduğunun doğrulanması.
- LDAPKullanıcı, grup ve cihaz gibi dizin bilgilerini sorgulamak ve merkezi kimlik doğrulama yapmak için kullanılan dizin erişim protokolü.
- OAuthBir uygulamaya parola vermeden sınırlı erişim yetkisi tanıma protokolü.
- Parola özeti (hash)Parolanın geri döndürülemez biçimde saklanan matematiksel özeti.
- Parola yöneticisiParolaları şifreli bir kasada saklayan, güçlü ve benzersiz parolalar üreten ve otomatik dolduran uygulama.