Türkçe
  • jwt
  • auth
  • kimlik doğrulama
  • kimlik
  • api
  • openid
  • oauth

JSON Web Token (JWT) Nedir?

JSON Web Token (JWT) temellerini 5 dakika içinde net bir şekilde anlayın.

Gao
Gao
Founder

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 ve RS512 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 ve ES512 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:

  1. '.' ayracını kullanarak JWT'yi üç parçaya (başlık, yük ve imza) ayırın.
  2. Başlığı ve yükü Base64URL ile çözümleyin.
  3. İ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).