JWT nedir ve nasıl okunur?
JWT (JSON Web Token), genellikle bir kullanıcının giriş yaptığını kanıtlamak için kullanılan küçük bir metindir. Noktalarla ayrılmış üç parçadan oluşur ve içini okumak sandığından kolaydır.
Üç parça: başlık, içerik, imza
Bir JWT şuna benzer: xxxxx.yyyyy.zzzzz. Noktalarla ayrılmış üç parçanın her biri Base64url ile kodlanmıştır.
- Başlık (header): Hangi imza algoritmasının kullanıldığını söyler, örneğin HS256.
- İçerik (payload): Asıl bilgilerdir. Kullanıcının kimliği (sub), token'ı kimin verdiği (iss), ne zaman verildiği (iat) ve ne zaman biteceği (exp) gibi alanlar (claim) burada bulunur.
- İmza (signature): Başlık ve içeriğin gizli bir anahtarla imzalanmış halidir. Token değiştirilirse imza tutmaz.
JWT şifreli değildir
En sık yapılan yanlış anlama budur. Standart bir JWT imzalıdır ama şifreli değildir. İçeriği kodlanmıştır, yani Base64url çözen herkes okuyabilir. Bu yüzden JWT içine parola, kredi kartı numarası gibi gizli bir şey koyma.
İmza sadece "bu token verildikten sonra değiştirilmemiş" garantisini verir, içeriği gizlemez.
Okumak ile doğrulamak farklıdır
JWT çözücü gibi araçlar yalnızca içeriği okur. İmzayı doğrulamak için gizli anahtar (ya da açık anahtar) gerekir ve bu işi token'ı kabul eden sunucu yapmalıdır. Bir token'ın içeriğini görmek onun gerçek olduğunu kanıtlamaz, herkes sahte içerikli bir JWT üretebilir.
Süre alanları: exp, iat, nbf
Bu alanlar 1 Ocak 1970'ten bu yana geçen saniyeyi tutar (Unix zamanı). exp token'ın bitiş zamanıdır, iat verildiği zaman, nbf "bu tarihten önce geçerli değil" demektir. Bir token hâlâ geçerli mi diye bakmak için exp'in şimdiki zamandan sonra olduğuna bakarsın. Zamanı okunabilir tarihe çevirmek için zaman damgası aracı işine yarar.
Sık yapılan güvenlik hataları
- İmzayı doğrulamadan içeriğe güvenmek.
- Sunucuda "alg" alanına körü körüne güvenmek. Kabul edilen algoritmayı sabitle.
- Çok uzun ömürlü token vermek. Kısa ömürlü token ve yenileme mekanizması daha güvenlidir.
- Token'ı tarayıcıda localStorage'da saklamak. Sayfaya zararlı bir betik girerse token okunabilir, bu yüzden ciddi uygulamalarda çoğunlukla HttpOnly çerez tercih edilir.
Canlı bir sistemin geçerli token'ını başkalarıyla ya da herkese açık sitelerle paylaşma. Bizim araç token'ı tarayıcında çözer, sunucuya göndermez.