JWT Nedir? Token Tabanlı Kimlik Doğrulama
JWT, kullanıcının kim olduğunu imzalı küçük bir metinle taşıyan token biçimidir. Yapısını, avantajlarını ve güvenli kullanım kurallarını anlatıyorum.
İçindekiler
Mobil uygulamanıza bir kez giriş yaptığınızda, sonraki her ekranda şifrenizi yeniden yazmazsınız. Uygulama, sunucuya her istekte “bu kişi daha önce doğrulandı” bilgisini bir şekilde iletir. Bu bilgiyi taşımanın en yaygın yollarından biri JWT’dir. Peki JWT nedir? JSON Web Token, kullanıcı veya istemci hakkındaki bilgileri JSON biçiminde taşıyan ve dijital olarak imzalanan kompakt bir metindir. İmza sayesinde sunucu, token’ın kendisi tarafından üretildiğini ve yolda değiştirilmediğini anlayabilir. Bu yazıda JWT’nin yapısını, nasıl çalıştığını ve en sık yapılan hataları anlatacağım.
Oturum mu, token mı? Kısa bir arka plan
Klasik web sitelerinde kullanıcı giriş yaptığında sunucu bir oturum (session) kaydı oluşturur ve tarayıcıya bu kaydın numarasını çerez olarak verir. Her istekte sunucu bu numarayla kendi kaydına bakar. Bu yöntem iyi çalışır ama sunucunun oturum bilgisini saklamasını gerektirir.
Token tabanlı yaklaşımda ise gerekli bilgi token’ın içinde taşınır. Sunucu, imzayı kontrol ederek token’a güvenebilir; her istekte veritabanına bakmak zorunda kalmaz. Bu özellik, özellikle mobil uygulamalar, birden fazla sunucuya dağılan sistemler ve farklı servislerin birbirine güvenmesi gereken yapılarda kolaylık sağlar.
JWT nedir ve hangi parçalardan oluşur?
Bir JWT, noktalarla ayrılmış üç bölümden oluşur:
xxxxx.yyyyy.zzzzz
başlık.içerik.imza
- Başlık (header): Token’ın türünü ve kullanılan imza algoritmasını belirtir (ör. HS256 veya RS256).
- İçerik (payload): Token’ın taşıdığı bilgilerdir; bunlara “claim” denir. Örneğin kullanıcı kimliği (
sub), token’ın oluşturulma zamanı (iat) ve son geçerlilik zamanı (exp). - İmza (signature): Başlık ve içeriğin, sunucunun gizli anahtarıyla imzalanmış hâlidir. İçerikte tek bir karakter değişirse imza tutmaz.
Başlık ve içerik Base64URL ile kodlanır. Burada önemli bir ayrıntı var: Kodlama şifreleme değildir. Bir JWT’nin içeriğini herkes çözüp okuyabilir. İmza yalnızca değiştirilmediğini garanti eder, gizliliği sağlamaz. Bu yüzden token içine şifre, kart bilgisi veya hassas kişisel veri konmamalıdır.
JWT ile giriş akışı nasıl işler?
- Kullanıcı e-posta ve şifresiyle giriş isteği gönderir.
- Sunucu bilgileri doğrular, kullanıcı kimliğini ve son geçerlilik süresini içeren bir JWT üretip imzalar.
- Uygulama token’ı saklar ve sonraki her istekte genellikle
Authorization: Bearerbaşlığıyla gönderir. - Sunucu her istekte imzayı ve süreyi kontrol eder; geçerliyse isteği işler.
- Süre dolduğunda uygulama yeni bir token alır ya da kullanıcıdan tekrar giriş ister.
Token’ın doğrulanması kimlik sorusunu çözer; kullanıcının istediği kayda erişme yetkisi olup olmadığı ise ayrıca kontrol edilmelidir. Bu katmanları API güvenliği: kimlik doğrulama, yetki ve sınırlama yazısında bütün olarak anlattım.
Erişim token’ı ve yenileme token’ı
JWT’nin zayıf yanlarından biri, bir kez verildikten sonra süresi dolana kadar geçerli kalmasıdır. Çalınan bir token’ı anında iptal etmek, ek bir yapı kurmadan kolay değildir. Bu yüzden yaygın uygulama iki token kullanmaktır:
| Erişim token’ı | Yenileme token’ı | |
|---|---|---|
| Görevi | API isteklerinde kimliği kanıtlamak | Süresi dolan erişim token’ını yenilemek |
| Ömrü | Kısa (dakikalar mertebesinde) | Daha uzun |
| Gönderildiği yer | Her API isteği | Yalnızca yenileme uç noktası |
| İptal | Süresi dolunca kendiliğinden | Sunucuda kayıtlı tutulur, çıkışta iptal edilir |
Böylece erişim token’ı çalınsa bile kısa sürede geçersiz olur; kullanıcı çıkış yaptığında ya da şüpheli bir durum görüldüğünde yenileme token’ı sunucuda iptal edilir.
JWT kullanırken sık yapılan hatalar
- İmzayı doğrulamamak: Token’ı yalnızca çözüp içeriğe güvenmek, herkesin istediği kimliğe bürünmesine izin vermek demektir.
- Algoritmayı token’dan okumak: Sunucu kabul edeceği algoritmayı kendisi belirlemeli; başlıkta “none” gibi değerlere izin verilmemelidir.
- Zayıf gizli anahtar: HS256 gibi simetrik algoritmalarda anahtar uzun ve rastgele olmalı, kodda değil ortam değişkeninde saklanmalıdır.
- Çok uzun ömür: Haftalarca geçerli erişim token’ları, çalınma durumunda riski büyütür.
- Hassas veri taşımak: İçerik okunabilir olduğu için yalnızca gerekli, hassas olmayan bilgiler konmalıdır.
- Tarayıcıda dikkatsiz saklamak: Web uygulamalarında token’ı JavaScript’in erişebildiği yerlerde tutmak, XSS açığı olduğunda çalınmasını kolaylaştırır. HttpOnly ve Secure işaretli çerezler gibi seçenekler değerlendirilmelidir.
JWT her zaman doğru seçim mi?
JWT nedir ve nasıl çalışır sorularını yanıtladıktan sonra en önemli soru, onun sizin projeniz için gerekli olup olmadığıdır. Kısa cevap: her zaman değil.Tek sunuculu, klasik bir web sitesi için sunucu taraflı oturum hâlâ basit ve güvenli bir çözümdür. JWT; mobil uygulamalar, birden fazla servisin aynı kimliği tanıması gereken yapılar ve üçüncü taraf entegrasyonlar gibi durumlarda daha çok fayda sağlar. “Google ile giriş” gibi senaryolarda ise JWT genellikle OAuth ve OpenID Connect akışlarının bir parçası olarak karşınıza çıkar; bu konuyu OAuth nedir yazısında anlattım. Mobil arka uç tasarımında kimlik doğrulamanın yerini görmek isterseniz mobil uygulama backend yazısına da göz atabilirsiniz.
Bu işi nasıl birlikte yaparız?
Uygulamanıza token tabanlı giriş eklemek ya da mevcut yapıyı güvenli hâle getirmek için şu adımları izliyorum:
- Kullanım senaryolarını belirleme: Web, mobil ve panel gibi hangi istemcilerin giriş yapacağını, oturumun ne kadar sürmesi gerektiğini konuşuruz.
- Yöntem seçimi ve teklif: Oturum mu, JWT mi, yoksa OAuth ile dış giriş mi gerektiğine gerekçeli karar verip kapsamı teklifle netleştiririm.
- Geliştirme ve test: Token üretimi, yenileme, çıkış ve iptal akışlarını kurar; süresi dolmuş ve değiştirilmiş token senaryolarını test ederim.
- Teslim ve destek: Anahtar yönetimini ve yapılandırmayı belgeleyerek teslim eder, sonrasında destek veririm.
Projenizi konuşmak için iletişim sayfasından bana ulaşabilirsiniz.
Sık sorulan sorular
JWT şifreli midir?
Standart JWT’ler imzalıdır ama şifreli değildir; içeriği herkes okuyabilir. İçeriğin gizli kalması gerekiyorsa şifreli token biçimleri (JWE) kullanılabilir, ancak çoğu durumda hassas veriyi token’a hiç koymamak daha doğrudur.
JWT’nin süresi ne kadar olmalı?
Kesin bir değer yoktur; uygulamanın hassasiyetine göre belirlenir. Genel yaklaşım, erişim token’larını kısa tutup yenileme token’ıyla oturumu sürdürmektir.
Kullanıcı çıkış yaptığında JWT geçersiz olur mu?
Kendiliğinden olmaz; token süresi dolana kadar geçerlidir. Bu yüzden kısa ömürlü erişim token’ı ve sunucuda iptal edilebilen yenileme token’ı birlikte kullanılır.
HS256 ile RS256 arasındaki fark nedir?
HS256 tek bir gizli anahtarla imzalar ve doğrular. RS256 ise özel anahtarla imzalar, açık anahtarla doğrular; böylece token’ı doğrulayan servislerin imzalama anahtarına sahip olması gerekmez.
Sonuç
JWT nedir sorusunun kısa cevabı: kimlik bilgisini imzalı ve kompakt bir biçimde taşıyan bir token standardı. Doğru kullanıldığında mobil uygulamalar ve dağıtık sistemler için pratik bir çözümdür; ancak imza doğrulama, kısa ömür ve güvenli saklama kurallarına uyulması şarttır. Uygulamanız için doğru kimlik doğrulama yapısını birlikte kurmak isterseniz bana yazabilirsiniz.
