JSON Web Token (JWT) Nedir?
JSON Web Token (JWT) temellerini 5 dakika içinde net bir şekilde anlayın.
JSON Web Token (JWT) genellikle modern web uygulamaları ve OpenID Connect gibi açık standartlarda kullanılır ve kimlik doğrulama ve yetkilendirme kolaylaştırır. Resmi RFC 7519 esaslı bir referans oluştururken, başlangıç seviyesindekilerin anlaması zor olabilir. Bu makalede, JWT'nin çekirdek kavramlarına odaklanacak ve bu kavramları örneklerle sade bir dilde sunacağız.
Neden JWT'ye ihtiyacımız var?
Son zamanlarda, iki taraf arasında veri alışverişi yapmak için JSON'ı kullanmak oldukça yaygın. Bir kullanıcıyı temsil eden bir JSON objesi düşünün:
'sub' 'konu' anlamına gelen "subject"in kısaltmasıdır ve OpenID Connect'teki kullanıcı belirleyicisini (user ID) temsil etmek için bir standart iddia olduğunu belirtir.
Bu JSON objesinin bütünlüğünü nasıl garanti edebiliriz? Başka bir deyişle, verilerin iletim esnasında manipüle edilmediğinden nasıl emin olabiliriz? Yaygın bir çözüm dijital imzaları kullanmaktır. Örneğin, genel anahtar şifrelemesi'ni kullanabiliriz: sunucu JSON objesine özel anahtarıyla imza atar ve istemci, sunucunun genel anahtarıyla imzayı doğrulayabilir.
Kısacası, JWT, JSON objesi ve imzasını temsil etmek için standartlaştırılmış bir yaklaşım sunar.
JWT'nin formatı
Çünkü dijital imzalar oluşturmak için birçok algoritma var, JWT imzası için kullanılan algoritmayı belirtmek gerekir. Bu, bir JSON objesi oluşturarak gerçekleştirilir:
'alg', 'algoritma' için kullanılan kısaltmadır ve 'typ' 'tür' anlamındaki "type" kelimesinin kısaltmalarıdır.
Genellikle, 'typ' büyük harflerle 'JWT' olarak ayarlanır. Örneğimiz için, 'alg' 'HS256'dır, bu da HMAC-SHA256'nın bir göstergesidir (birazdan açıklayacağız) ve bu algoritmayı imza oluşturmak için kullandığımızı gösterir.
Şimdi, bir JWT için gereken tüm öğelere sahibiz:
- Başlık JSON: Algoritma ve tür
- Yük JSON: Gerçek veri
- İmza: Başlığı ve yükü kapsayan imza.
Ancak, boşlukları ve satır sonları gibi belirli karakterler ağ iletimine dost olmayabilir. Bu yüzden, başlık ve yük Base64URL-encoded olmalıdır. Tipik bir JWT şöyle gözükür:
'.' ayracı görevi görür.
Hepsini bir araya getirelim ve bir JWT yaratalım:
Başlık
JSON: {"alg":"HS256","typ":"JWT"}
Base64URL kodlu: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Yük
JSON: {"sub":"foo","name":"John Doe"}
Base64URL kodlu: eyJzdWIiOiJmb28iLCJuYW1lIjoiSm9obiBEb2UifQ
İmza
HMAC-SHA256'da, imza bir gizlilik anahtarıyla oluşturulur:
Örneğin, gizlilik anahtarı some-great-secret
olarak ayarlanırsa, imza XM-XSs2Lmp76IcTQ7tVdFcZzN4W_WcoKMNANp925Q9g
olur.
JWT
Son JWT şu şekildedir:
Bu geçerli JWT, gizlilik anahtarına sahip herhangi bir taraf tarafından doğrulanabilir.
İmzayı oluşturmak için algoritmayı seçin
Daha önce belirtildiği gibi, dijital imzalar oluşturmak için birçok algoritma var. `HS256'ı bir örnek olarak kullandık, ancak gizlilik anahtarının taraflar (ör. istemci ve sunucu) arasında paylaşımlı olması gerektiği için yeterince güçlü olmayabilir.
Gerçek dünya senaryolarında, istemciler, gizlilik anahtarını güvende tutamayan halka açık uygulamalar olan React uygulamalarını içerebilir. Bu nedenle, tercih edilen yaklaşım, JWT'nin imzalanması için genel anahtar şifrelemesini (yani. asimetrik şifrelemeyi) kullanmaktır. En popüler algoritmayla başlayalım: RSA.
RSA
RSA, asimetrik bir algoritmadır ve bir anahtar çifti kullanır: genel bir anahtar ve özel bir anahtar. Genel anahtar imzanın doğrulanması için kullanılırken, özel anahtar imza atması için kullanılır.
RSA için başlık JSON şu şekildedir:
'RS256' RSA-SHA256'dır, bu da imzanın RSA algoritması ve SHA256 hash fonksiyonuyla oluşturulduğu anlamına gelir. SHA384 ve SHA512 hash fonksiyonlarıyla imza oluşturmak için
RS384
veRS512
kullanabilirsiniz.
İmza özel anahtarla oluşturulur:
Yeniden, bu parçaları bir araya getirebiliriz ve bir JWT oluşturabiliriz, ve son JWT şu şekilde gözükür:
Artık, istemci, özel anahtarı bilmeden imzayı doğrulayabilir.
ECDSA
RSA yaygın olarak kabul görse de, daha büyük imza boyutlarından muzdarip olabilir, bazen başlık ve yük boyutunu geçebilir. Elliptik Eğri Dijital İmza Algoritması (ECDSA), daha kompakt imzalar oluşturabilen ve daha performanslı olan başka bir asimetrik algoritmadır.
ECDSA için özel bir anahtar oluşturmak gerekir, bir eğri seçmemiz gerekiyor. Konu bu makalenin kapsamı dışındadır, ancak daha fazla bilgiyi burada bulabilirsiniz.
ECDSA için başlık JSON şu şekildedir:
'ES256', ECDSA-SHA256'ın bir göstergesidir, bu da imzanın ECDSA algoritması ve SHA256 hash fonksiyonuyla oluşturulduğu anlamına gelir. SHA384 ve SHA512 hash fonksiyonlarıyla imza oluşturmak için
ES384
veES512
kullanabilirsiniz.
İmza özel anahtarla oluşturulur:
Son JWT, RSA ile aynı yapıyı korur, ancak önemli ölçüde daha kısa bir imza ile:
JWT'yi doğrulayın
Bir JWT'yi doğrulamak, bir JWT oluşturmanın ters işlemi kadar basittir:
- '.' ayracını kullanarak JWT'yi üç parçaya (başlık, yük ve imza) ayırın.
- Başlığı ve yükü Base64URL ile çözümleyin.
- İmzayı, başlıkta belirtilen algoritma ve genel anahtarla (asimetrik algoritmalar için) doğrulayın.
JWT doğrulamaya yardımcı olmak için kullanılabilir birçok kütüphane var, örneğin Node.js ve web tarayıcıları için jose.
Sonuç
Bu makalede, kısaca JWT'nin çekirdek kavramlarını ve onu nasıl oluşturup doğrulayacağınızı açıkladık. Birçok detay keşfedilmeyi bekliyor ve bunları gelecek makalelerde ele alacağız.
Logto, JWT ve OpenID Connect gibi açık standartları, her geliştirici için basitleştirilmiş iş akışlarıyla uygulamalarınızı ve API'lerinizi güvenli hale getirir. İlgileniyorsanız, ücretsiz deneyebilirsiniz (kredi kartı gerekli değil).