JWT Nedir? Nasıl Çalışır?

Yunus Emre KAŞ
Kodcular
Published in
3 min readOct 12, 2019

Herkese merhabalar, bu benim ilk yazım olacak ve seri gibi gidecek olan React ile JWT kullanarak SignalR Core ile nasıl iletişim kurulur anlatmaya çalışacağım. İlk aşamada JWT nedir ? Neden ihtiyaç duyulmuş gibi sorulara yanıt vermek ve küçük bir örnekle nasıl kullanacağımızı göstermek için bu yazıyı yazmaya karar verdim. Çizelge olarak şöyle ilerlemeyi planlıyorum :

  1. JWT nedir?
  2. JWT ile ASP.Net Core Web API uygulaması
  3. SignalR Core nedir?
  4. ASP.Net Core SignalR kullanımı
  5. React üzerinden ASP.Net Core SignalR ile nasıl iletişim kurulur ?
  6. React Native üzerinden ASP.Net Core SignalR ile nasıl iletişim kurulur ?
  7. ASP.NET Core SignalR ile JWT nasıl kullanılır ?

Kimdir Bu JWT?

JWT(JSON Web Token), bir JSON nesnesi olarak taraflar arasında güvenli bir şekilde bilgi iletimi için tasarlanmış bir RFC 7519 standartıdır. Teorik açıklamayı bir kenara bırakırsak genellikle token(anahtar) bazlı oturum işlemlerinde kullanılan bir yöntemdir.

Avantajları Nelerdir ?

  • JSON kullanması
  • URL üzerinde taşınabilmesi
  • Web çerezleri kullanma zorunluluğu olmaması
  • Yöntem ve mantık basit olduğu için hızlı doğrulama yapılabilmesi
  • Oluşturulan tokenlar(anahtarlar) ile HTTP request atılabilen her istemcide kullanılabilmesi
  • Web uygulamaları açısından HTTP session gerekmemesi, stateless kullanıma uygun olması
  • Veri bütünlüğünü sağlaması

Yapısı Nasıldır ?

Yukarıdan da görebileceğiniz gibi JWT’ yi oluşturan üç kısım vardır. Bu kısımlar Base64 ile kodlanmış JSON nesnelerinden oluşur ve birbirinde nokta (.) ile ayrılırlar.

Oluşturulmuş bir JWT örneği:

Kırmızı(Başlık).Mor(Veri).Mavi(İmza)

🤠 Header(Başlık)

Başlık tipik olarak iki bölümden oluşur. Örnek olarak:

{
"alg": "HS256", //JWT imzası için algoritma tipi
"typ": "JWT" //Tokenın tipi
}

“alg” —HMAC SHA256 veya RSA gibi kullanılan algoritmalar kullanılabilir.

“typ” — CaseSensitive(büyük-küçük harf duyarlı) değildir fakat “JWT” şeklinde yazılması önerilir.

🤓 Payload(Yük/Veri)

Bu kısım asıl mevzunun olduğu yani verinin tutulduğu kısımdır. Bu kısım da kendi içinde 3 ayrı bölümde incelenir. Bunları açıklamadan önce Claims(iddia/hak talep) türkçe çevirisini kendimce yorumladım. Tokenı sunucuya gönderdiğiniz zaman içindeki verilerin doğru olduğunu iddia etmek olarak düşünebiliriz.

Registered Claims(Kayıtlı iddialar)

Bu kısım JWT geliştiricilerinin bizler için ayırmış olduğu muhtemel en çok kullanılabilecek üç harfden oluşan tanımlamalardır. Bunlardan bazıları :

iss (issuer), exp (expiration time), sub (subject), aud(audience) daha detaylı görmek isterseniz dökümantasyona buradan ulaşabilirsiniz.

Bunlardan en çok kullanılan olan exp biraz inceleyelim. Bu arkadaş bildiğimiz son kullanma tarihidir. Ona bir tarih tanımlarsın o tarihe kadar oluşturulan tokenı kullanabilirsin. Exp tipi kesinlikle number(numara) olmalı ve dönüştürüldüğünde NumericDate karşılık gelmelidir.

Public Claims(Açık iddialar): İsteğe göre eklenen alanlardır. Fakat registered(kayıtlı) edilmiş veya URI’da tanımlanan parametreler ile aynı olmamalıdır.

Private Claims(Gizli iddialar) : Bilgi paylaşımı için tarafların kendi aralarında anlaştığı özel claim’lerdir.

Basit bir payload örneği için :

{
"sub": "Learn JWT",
"iss": "emrekas",
"iat": 1570905029,
"exp": 1672590000,
"admin" : true
}

Oluşturulan json property(özellik) isimleri unique(eşsiz) olmalıdır aksi takdirde hata alacaksınız.

🤐 Signature(İmza)

Bu kısım tokenın son kısmıdır. Bu kısım header kısmında tanımladığımız algoritmayla 1.Kısım(header), 2.Kısım(payload) ve oluşturduğumuz gizli anahtarın(secret key) imzalanmasıyla oluşur. Böylece nur topu gibi bir tokenımız oluyor.

Bu kısım için örnek :

HMACSHA256 (
base64UrlEncode (header) + "." +
base64UrlEncode (payload),
gizli-anahtar
)

😬 JWT Verify(Doğrulama)

Yapısı gibi doğrulama yöntemi de çok basittir. Yukarıda yapılan yöntemin tam tersi uygulanır. Kullanıcının gönderdiği tokenın Header(1. kısım) ve Payload(2. kısım) sunucumuzda bulunan gizli anahtar ile imzalanır ve 3. kısım oluşturulur. Daha sonra bu oluşturulan 3.kısım(imza) kullanıcı tarafından gönderilen 3.kısım(imza)ile karşılaştırılır. Eğer imzalar aynı ise token geçerli sayılır ve kullanıcıya erişim verilir.

Yazı beklediğimden uzun olduğu için gelecek yazımda ASP.NET Core 3.0 Web API ile JWT üzerinden authentication(oturum) işlemlerini yapacağım. Yaptığım imla ve anlatım bozuklukları için şimdiden özür dilerim.😔 Yanlış veya eksik gördüğünüz yerler varsa Linkedin’den ulaşabilirsiniz.

--

--