top of page
Yazarın fotoğrafıŞerif Aydın

JWT - Json Web Token Nedir ? Nasıl kullanırız ?

Güncelleme tarihi: 9 Ara 2021

Herkese merhaba, bugün sizlere JWT hakkında bilgi vermek istiyorum.

Bildiğimiz bir durum da yazdığımız API ların Authorization sürecidir. Ben yeni projemizde baya araştırdıktan sonra JWT kullanmaya karar verdim.

Yapısını sizlerde anladığınızda neden kullanmanız gerektiğini anlayacaksınız. Ben bu makale ile işinizi biraz daha kolaylaştırmak istedim.


Json Web Token IETF (Internet Engineering Task Force) kuruluşu tarafından tasarlanan standart bir Token biçimidir.


Json Web Token, Kullanıcının doğrulanması, Api Güvenliği, data güvenliği gibi bir çok konuda kulanılabiliyor. JWT en çok tercih edilen token biçimidir.


IETF nin JWT ile ilgili dökümanına göz atmanızı tavsiye ederim hiç ummadığınız çözümler sağlayabilirisniz.


JWT nin kendi sitesinde Token oluşturma süreci ile ilgili editörü kullanabilir ve fikir sahbii olabiliriz.


JWT NİN AVANTAJLARI

  • Stateless çalışır, Bilgiler bir server da tutulmaz.

  • Claim bilgileri veya token geçerlilik süresi vb. gibi bilgiler ne sunucuda nede client da tutulur. Token içerisinde gerekli tüm bilgiler vardır.

  • Token içerisinde istediğimiz datayı tutarız. DB ye gerek kalmaz.

  • Doğrulama işlemi hızlıdır. Authorization doğrulama işlemini DB ile yapmaz.

  • Boyutu küçüktür ve kompaktır.

  • Web çerezleri kullanma zorunluluğu yoktur.

  • Veri bütünlüğünü ve doğrulamasını sağlar.

  • İstersek Redis de Token verilerini saklayabiliriz. JWT nin Redis ile ortak çalışma mimarisi vardır.

  • CSRF (Token kullanıcı hackleme) lara karşı daha kapsamlı korunma.

  • Mobile Application lar için tavsiye edilen en kullanışlı yöntem.


JWT nin tek dezavantajı, durumsuz ve bir ortamda saklanmadıkları için Token geçersiz bırakma işlemi yoktur.

Fakat istersek middleware yazarak bu sorunuda çözebiliriz. ama bu duruma ihtiyaç olacağını pek düşünmüyorum, olursada istediğimiz taktirde Stateless yapısını bozup kendi yapımıza JWT yi entegre edebiliriz.


JWT NİN YAPISI


JWT ile üretilen token Base64 ile hashlenmiş 3 ana kısımdan oluşmaktadır.

  1. Header (Başlık)

  2. Payload (Data)

  3. Signature (İmza)

JWT ile oluşturulan token header.payload.signature şeklinde 3 noktalı ayrılarak oluşturulur.

Json Web Token yapısı


Header (Başlık)

JWT ile oluşturulan ilk kısımdır. Header kısmında 2 bilgi girişi yapılmalıdır. Girilen bu bilgiler oluşturulacak olan Token'ın crytographic hash algoritmasını ve tipini içermektedir.

  1. 'alg' : Algoritma Tipi

  2. 'typ' : Token tipi

{
    "alg" : "HS256",
    "typ" : "JWT"
}

Algoritma tipi olarak; HS256, HMAC SHA256, RSA, SHA512 vb. gibi hashleme algoritmaları kullanılabilir.

Type kısmında 'JWT' olduğunu belirtmemiz gerekmektedir.


Payload (Data)

Bu kısma Claim dataları belirtilir. Bu kısımdaki veriler istemci ve sunucu arasında paylaşılır ve eşsiz olmalıdır.


Claim; Doğrulanmış kullanıcının istemci ve sunucu arasında paylaşılmak istenen bilgileri tutar.


Payload içerisinde hassas bilgiler olmamalıdır ! Burası ortak ve decode edildiğinde işe yaramayacak veriler belirtilmelidir. Örneğin kullanıcının Adı, Id'si Rolü vb.


var claims = new[]
    {
       new Claim(JwtRegisteredClaimNames.Sub,userInfo.Name),
       new Claim(JwtRegisteredClaimNames.Sub,userInfo.Surname),
       newClaim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString()),
    };

Yukarıda örnek bir kod paylaştım 'Sub' kısmına dikkat çekmek istedim, JWT nin bize sunduğu özelliklerin dışında, İstediğimiz kadar custom özellik tanımlayabiliriz.


3 tip Claim bulunmaktadır.

  1. Registered (Kayıtlı) Claim.

  2. Public (açık) Claim.

  3. Private (Gizli) Claim.


1. Registeder Claims


JWT tarafından kullanileceğimiz düşünülmüş 3 harf uzunluğunda claimler'dir. Bu bilgilerin girilmesi zorunlu değildir, fakat girilmesi önerilmektedir. Aşağıda kullanım amacı ile birlikte listelenmiştir.


  1. iis (issuer) - Tokenı veren, burası için Şirket ismi vb verilebilir.

  2. exp (Expire) - Token' ın son kullanım süresi.

  3. sub - konu.

  4. aud (audience) - token alıcısı.

  5. nbf - belirtilen tarihten önce kullanılmaması.

  6. iat - Token verilme tarihi.

  7. jti - Unique Identifier.


Expiration Date bilgisini çok uzun tutmamak önemlidir. kısa tutmak öneriliyor.


2. Public Claims


İsteğe bağlı açık şekilde yayınlanan Claimlerdir. İsteğe bağlı data oluşturulabilir.


3. Private Claims


İstemci ve sunucunun kendi aralarında bilgi taşımak için kullandığı gizli Claimlerdir. İsteğe bağlı data oluşturulabilir.


{
   "sub" : 1,
   "name" : "Şerif",
   "iat" : Date.Add
   "admin" : true,
   "userid" : 1,
   "exp" : Date.Add,
   "roles" : ["admin","user"]
}

Örnek Claim data.


Signature (imza)

JWT Token bilgisinin son kısmıdır. Bu kısmın oluşturulması için header, payload ve gizli anahtar gereklidir. İmza ile veri bütünlüğü garanti altına alınmış olur.

var credentials = new SigningCredentials(securtyKey, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
                issuer: _config["Jwt:Issuer"],
                audience: _config["Jwt:Issuer"],
                claims,
                expires: DateTime.Now.AddSeconds(30),
                signingCredentials: credentials);
var encodetoken = new JwtSecurityTokenHandler().WriteToken(token);

JWT Identity Service için aşağıda bir startup.cs örneği bulunmaktadır.


​ClockSkew

​Verilen sürede token sonlanır. eğer Zero olarak verilmez ise default da 5 dakikadır. Jetonunuzun süresinin tam zamanında bitmesini istiyorsanız; ClockSkew'i aşağıdaki gibi sıfıra ayarlamanız gerekir

​ValidIssuer

Kimliği veren sağlayıcı.

ValidAudience

Kimliği kullanacak olan firma, uygulama vs.


Jwt nin kullanımı ile ilgili çizdiğim mimari, fikir verme açısından inceleyebilirsiniz.

örnek bir token : "token""eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOlsixZ5lcmlmIiwiQXlkxLFuIl0sImp0aSI6Ijg3MjkxZDczLWJjZDEtNDEyYi1iZGEwLWQzZjFiZDMyMjRlNiIsImV4cCI6MTYwMDYzODE1OCwiaXNzIjoiQUNNUyIsImF1ZCI6IkFydmF0byJ9.cTvMZbgL86wfhUbkbD93jtMzjIdPd7kfDei8v2MhhG0"


Örnek uygulamaya Github dan erişebilirsiniz.


JWT ile ilgili anlatacaklarım bu kadar umarım faydalı olur. Teşekkürler.









































5.157 görüntüleme0 yorum

Son Yazılar

Hepsini Gör

header.all-comments


bottom of page