JWT Nedir? Neden Kullanmak Gerekir?

Umut CANOĞLU
FowApps
Published in
3 min readDec 19, 2022

Yeni tanışanlar için sade bir şekilde JWT nedir, nasıl oluşturulur ve neden ihtiyacımız olur gibi konulara değineceğim.

JSON Web Token (JWT) Internet Engineering Task Force (IETF) tarafında oluşturulmuş bir standarttır. İki taraf arasında güvenli bir şekilde veri gönderilmesini sağlar. Temelde güvenliği yani verinin doğruluğunu, değiştirilmediğini onaylamak için bir şifreleme algoritması ile dijital olarak imzalanması üzerine kurgulanmıştır.

Neden JWT’ye ihtiyaç duyabiliriz?

Genelde api sunucusu ve istemci arasındaki iletişimde istemcinin ilgili sunucu ve/veya işlem için yetkili olup olmadığını kontrol etmek için kullanılır. JWT en basit haliyle verilerin şifrelenmiş hallerinden oluşturulmuş bir String’tir. Aynı API hem webden hem mobilden hem de bir IoT cihazından istekler alabilir. Bu durumda MVC projelerinde kullandığımız web odaklı, tarayıcı üzerinde gerekli bilgilerin saklandığı yöntemler (Session, Cookie vb.) tüm istemcilerde kullanmak için yeterli değildir. İsteği göndereni tanımlamak ve yetkisini kontrol edebilmek için JWT iyi bir seçenektir.

JWT oluşturmak için tanımlama nasıl yapılır?

JWT Header, Payload ve Signature adındaki üç kısımdan oluşmaktadır. Bu kısımlardan ilk ikisi (Header ve Payload) JSON objesi olarak tanımlanır. Header kısmı iki Property’e sahip bir objedir ve biz bunlardan yalnızca birini (imza için kullanılacak şifreleme yöntemi) değiştirerek kullanırız. Payload kısmı ise asıl veriyi taşıyacağımız objemizdir ve burada kaç property kullanacağımız bize kalmış bir durumdur. Birkaç adet ne için kullanılacağı önceden tanımlanmış property vardır fakat bunların kullanılması zorunlu değildir. Aynı zamanda önceden tanımlanmış olanlar dışında kendimiz de property ekleyebiliriz. Üçüncü kısımda bir Json objesi tanımlamak yerine şifreleme algoritması çağırılır. Bu algoritma Header üzerinde belirttiğimiz algoritmadır ve algoritmayı çalıştırırken kullanacağımız anahtarı tanımlamamız gerekir.

Daha sade bir ifadeyle ilk iki kısmı oluşturmak için birer Json objesine ihtiyacımız var. Üçüncü kısmı oluşturmak içinse bir şifreleme algoritmasını çalıştırmaya ihtiyacımız var.

JWT nasıl oluşturulur?

JWT’nin daha önce bahsettiğim üç kısmı nokta (.) ile birbirinden ayrılır. İlk iki kısım tanımlanan JSON objelerinin base64 olarak şifrelenmiş halleridir. Üçüncü kısım ise ilk iki kısım için tanımlanan JSON objelerinin base64 olarak şifrelenmiş hallerinin Header kısmında belirtilen şifreleme yöntemini kullanarak şifrelenmesi sonucu oluşturulur. Bu şifrelemenin eşsiz olması için kullanıcının verdiği anahtar kullanılır.

JWT oluşturmakla ilgili denemeler yapmak için buraya tıklayabilirsiniz.

JWT’nin geçerliliği nasıl kontrol edilir?

JWT’nin geçerli olup olmadığını anlamak için basit bir onay mekanizması kullanılır ve bu kontrolü yapabilmek için kontrolü yapacak tarafta JWT’ye ait herhangi bir bilgi tutulması gerekmez. Kontrolü yapacak olan sistem kendisine gelen Token’ı tıpkı Token’ın oluşturulması sırasında olduğu gibi tekrar şifreler ve imza kısmı ile karşılaştırır. Ana hatlarıyla adımlara değinirsek; öncelikle birinci kısmı (Header) base64’ten tekrar JSON objesine çevirerek kullanılacak şifreleme algoritmasını bulur. Ardından üçüncü kısmı (Signature) oluşturmak için kullanılan yöntemi sistemde bulunan anahtarla tekrar ederek bir imza çıktısı elde eder. Son olarak elde ettiği imzayı Token üzerindeki imza ile karşılaştırır. Eğer imzalar eşleşirse verinin değiştirilmediğini anlamış oluruz.

JWT ne gibi avantajlar sunar? Ne gibi dezavantajları vardır?

JWT’nin en çok tercih edildiği senaryo olan api için yetki kontrolünde bazı artıları ve eksileri mevcuttur. Önce artılarından bazılarına sonra da eksilerinden bazılarına değineceğim.

Değineceğim ilk artısı verinin doğruluğundan emin olabilmemiz. Token bir şekilde üçüncü şahıslara ulaşırsa base64 ile şifrelenen kısımlarda basit bir Decoding işlemiyle şifreleme yöntemini ve veriyi okuyabilirler fakat şifreleme için kullandığınız anahtarı bilmeden değişiklik yapsalar dahi tekrar doğru şekilde şifreleyemezler. Dolayısıyla siz veri değiştirildiğinde bunu kolayca fark edebilirsiniz.

İkinci artısı ise doğrulama işlemi için veri tabanına gitmenize gerek olmamasıdır. Token’ı sizin oluşturup oluşturmadığınızı doğrulamak için herhangi bir bilgi saklamanız gerekmediği için doğrulama işleminde veri tabanı sorgusu gerekmez. Önceden tanımlanmış Property’lerden biri Token’ın son geçerlilik tarihi için kullanılan property’dir. Bu sayede token’ın süresinin bitip bitmediğini de veri tabanına ihtiyaç olmadan kolayca kontrol edebilirsiniz.

İlk eksisine gelecek olursak istediğimiz zaman Token’ları geçersiz kılamayız. Token üzerinde ki son geçerlilik tarihi gelmeden token’ı geçersiz kılmak için bazı yöntemler geliştirilebilir ama bunu sağlayabilmek için token’ı veri tabanında saklamak gerekir ve doğrulama esnasında veri tabanına bağlanmak gerekir. Bu JWT kullanırken tercih edeceğimiz bir durum değildir.

İkinci eksisi ise kullanıcı rolü veya adı gibi bilgileri Token üzerinde gönderiyorsanız eğer değişiklikleri Token’a yansıtamamanızdır. Kullanıcının adı veya rolü değişse bile bu değişiklikten önce oluşturulan token’lar eski bilgiyi içerecektir ve süreleri bitmediği takdirde hala geçerli token’lar olacaklardır. Çoğu zaman bir kullanıcımızın yetkisini kaldırdığımız durumda bu değişikliğin en hızlı şekilde aktif olmasını isteriz.

Bahsettiğim negatif durumların etkilerini en aza indirmek için Token’larınızın geçerlilik süresini çok uzun tutmamak ve normal akış esnasında değişebilecek bilgileri Token üzerinden göndermemek faydalı olacaktır.

--

--