Türkçe
  • auth
  • authentication
  • oauth
  • oidc
  • identity

Neden Çoğu OAuth 2.0 Servisinde JWT Kullanılır?

Bu makale, JWT'nin OAuth 2.0'da erişim belirteçleri formatı olarak neden yaygın olarak benimsendiğini, avantajları ve sınırlamalarını vurgulayarak açıklar.

Yijun
Yijun
Developer

OAuth 2.0 bugün yaygın olarak kullanılmaktadır. Yetkilendirme servislerinin temel bir çerçevesi olarak, OAuth 2.0'ın ana sorumluluklarından biri kullanıcılara erişim belirteçleri vermektir. Piyasadaki birçok OAuth servis sağlayıcısının, erişim belirteçlerini JWT formatında verdiğini fark ettik.

Bu makalede, JWT'nin ne olduğunu ve OAuth 2.0 tarafından verilen erişim belirteçlerinin formatı olarak neden geniş ölçüde benimsendiğini tanıtacağız.

JWT'ye Giriş

JWT, JSON Web Token anlamına gelir ve RFC 7519 tarafından şu şekilde tanımlanmıştır:

JSON Web Token (JWT), iki taraf arasında taşınacak iddiaları temsil eden kompakt, URL güvenli bir araçtır.

Bu tanım, JWT'nin farklı taraflar arasında iddiaları aktarmak için kullanılan bir belirteç olduğunu açıkça ortaya koymaktadır.

JWT'ler birden fazla taraf arasında geçtiği için, verilerin bütünlüğünü ve özgünlüğünü sağlamak amacıyla imzalanırlar.

İmzalı bir JWT'nin aşağıdaki formatı vardır:

Üç bölümden oluşur ve . ile ayrılır: başlık, yük ve imza.

Gerçek dünya JWT'sine bir örnek:

Bunu https://jwt.io adresinde ayrıştırmayı deneyebilirsiniz:

jwt.io'da JWT Ayrıştır

Görüntüde gösterildiği gibi, JWT'nin header bölümü kullanılan imza algoritması ve tokenin türü hakkında bilgiler içerir. payload bölümü ise JWT tarafından taşınan iddiaları içerir ve signature JWT'nin bütünlüğünü doğrulamak için kullanılır.

JWT'nin ne olduğunu ve farklı parçalarının anlamlarını şimdi anladığımıza göre, OAuth yetkilendirme servislerinin neden erişim tokeni olarak JWT'yi seçtiğini açıklamaya geçelim.

JWT Kullanmanın Faydaları

JWT ile geleneksel rastgele üretilmiş dize tabanlı tokenler arasındaki temel ayrımlar şunlardır: JWT'ler bilgi taşıyabilir ve kod çözme ile doğrulanabilir. Bu farklılıklar iki önemli avantaj sağlar:

  • Kaynak Verimliliği: JWT'ler kullanıcı veya oturum hakkında bilgi taşıyabilir, bu da sık sık bir veritabanı sorgusu yapılması gereksinimini ortadan kaldırır. Bu verimlilik, hizmetlerin kaynak tüketimini azaltabilir.
  • Geliştirilmiş Kullanılabilirlik ve Ölçeklenebilirlik: JWT'ler sunucu tarafı durum yönetimine bağımlılığı azaltır. Bu, hizmetlerin daha az durumlu olmalarını sağlar ve kullanılabilirliklerini ve ölçeklenebilirliklerini artırır.

Geleneksel rastgele dize tabanlı tokenler kullanılırken, doğrulama ve kimlik doğrulama için tipik süreç aşağıdaki gibidir:

Diyagramda gösterildiği gibi, bir sistemde çok sayıda kullanıcı ve birçok farklı Kaynak Sunucu bulunduğunda, Bu durum, Yetki Sunucu'ya sayısız token doğrulama talebi gönderilmesine neden olabilir.

Zamanla, sistem büyüdükçe, Yetki Sunucu kolayca bir darboğaz haline gelebilir ve genel hizmet kullanılabilirliğine zorluk çıkarabilir.

Ancak, JWT'ler devreye girdiğinde, doğrulama işlemi şu şekilde değişir:

JWT'lerin kod çözme yoluyla doğrulama özelliği sayesinde, Kaynak Sunucu JWT'lerin bütünlüğünü doğrulayıp kullanıcı bilgilerini alabilir ve Yetki Sunucu ile etkileşime girmesi gerekmez (JWT'lerin kod çözme ve doğrulama detayları için Logto dokümentasyonuna başvurabilirsiniz).

JWT'nin Sınırlamaları

JWT'ler modern yazılım mimarilerinde önemli avantajlar sunsalar da dikkate alınması gereken sınırlamaları da vardır.

Kolayca gözlenebilir yük

Daha önce belirtildiği gibi, bir JWT üç bölümden oluşur: header,payload ve signature. Bu bileşenler nasıl üretilir? Önceki örnekten alınan JWT'yi alalım ve JWT üretim sürecini gösterelim:

Yukarıdaki kodda gösterildiği gibi, JWT'nin başlık ve yük kısımları sadece base64 dizeleri olarak kodlanır.

Bu, bir tokena erişimi olan birinin JWT yükünün base64 dizisini kolayca çözebileceği ve taşıdığı bilgilere erişebileceği anlamına gelir. Tersine, bir yükü sahtelemek ve orijinal JWT'nin yükünü manipüle edilmiş bir tanesiyle değiştirmek de nispeten kolaydır.

JWT yükünün nispeten kolayca sahteleyebildiği doğru olsa da, JWT'nin imza kısmı sahte içerikle değiştirilemez, çünkü gizli imza anahtarı gerektirir. Bu yüzden doğru imza olmadan, JWT doğrulamayı geçemez.

Bu nedenle, JWT kullanırken aşağıdaki hususları göz önünde bulundurmak önemlidir:

  1. Her zaman SSL kullanın: JWT bilgilerinin aktarım sırasında sızdırılmamasını sağlamak için, veriyi aktarımda şifrelemek amacıyla SSL (Güvenli Yuva Katmanı) veya halefi TLS (Taşıma Katmanı Güvenliği) kullanmak önemlidir.
  2. Hassas verileri depolamaktan kaçının: JWT yükünde hassas verileri depolamak önerilmez. Yük, daha önce belirtildiği gibi, kolayca çözülebilir ve öncelikle hassas olmayan, ilgili iddiaları içermelidir.
  3. JWT'leri doğrulayın: İçindeki bilgilere güvenmeden önce, JWT'nin geçerli ve güvenli bir doğrulama sürecinden geçtiğinden, imzanın doğrulandığından ve tokenin süresinin dolmadığından emin olun. Bu, sahte veya yetkisiz tokenlerin kullanımını önlemeye yardımcı olur.

Geri almak zor

Genel olarak, erişim tokenleri genellikle bir son kullanma süresine sahiptir. Erişim tokeni bilgi içermeyen rastgele dizelerle temsil ediliyorsa, Yetki Sunucu'da her doğrulama sırasında tokenin iptal edilip edilmediğini kontrol edebiliriz.

JWT'ler için ise, JWT'lerin içinde kendilerini süresiz hale getirebilecek bilgi barındırmaları ve JWT doğrulamasının Yetki Sunucu'ya bağımlı olmaması nedeni ile, Yetki Sunucu bir JWT formatında erişim tokeni verdiğinde, tokenin kullanım süresi boyunca durumunu değiştirmek imkansız hale gelir.

Bir JWT tokeni doğal olarak süresi dolduktan sonra, bir yenileme tokeni kullanarak yetkilendirme sunucusundan yeni bir JWT alabiliriz (yenileme tokenleri hakkında bilgi için Logto'nun bloguna başvurabilirsiniz).

Ancak, kullanıcının yetkilendirmeyi iptal etmesi veya şifresini değiştirmesi gibi durumlarda ve hali hazırda verilmiş fakat henüz süresi dolmamış bir tokeni geri almak gerektiğinde, doğrudan bir çözüm mevcut değildir.

Token geri alının ortadaki etkisini hafifletmek için iki yaygın yaklaşım vardır:

  1. Erişim tokenine daha kısa bir son kullanma süresi ayarlayın ve tokenin durumunu hızlı bir şekilde yenilemek için token yenileme mekanizmasına güvenin.

Erişim tokeninin daha kısa bir son kullanma süresi olması sayesinde, bir kullanıcı erişim tokeninin süresinin dolduğunu fark ettiğinde, yetkilendirme servisinden bir yenileme tokeni ile yeni bir erişim tokeni talep edebilir. Böylelikle, kullanıcının tarafındaki token durumu en kısa sürede arka uç ile senkronize olabilir. Ancak, bu yaklaşım ek bir maliyetle gelir, ki kullanıcıların bunu hesaba katmaları gerekmektedir.

  1. Erişim tokenleri için bir geri alma listesi tutun ve her doğrulama sırasında tokenin listede olup olmadığını kontrol edin.

Bu yöntemin belirli sınırlamaları vardır. JWT'nin avantajlarından biri, sunucunun durum bilgisini saklamaya gerek olmadan kullanılabilir olmasıdır ve JWT'ler tipik olarak durumsuzdur. Ancak, bir geri alma listesi tutmak etkili bir depolama ve bakım gerektirir, bu da ekstra depolama mekanizmalarına ihtiyaç duyar. Bu özünde JWT'nin avantajlarından vazgeçmeyi gerektirir ve potansiyel olarak performans sorunlarına yol açabilir. Bu nedenle, token geri alma mekanizmasının geliştirilmesi, geliştiriciler tarafından belirli kullanımlarına uygun bir şekilde yapılmalıdır.

Özet

Bu makalede, JWT'nin kısaca tanıtımını yaptık, avantajları ve sınırlamalarını vurguladık. Şimdiye kadar, JWT'nin ve yaygın olarak kullanıldığı senaryoların derinlemesine bir anlaşılırlığına sahip olmalısınız. JWT'nin zorlukları olsa da, OAuth 2.0 hizmetlerinde belirteç formatı olarak kullanıldığında getirdiği avantajlar, dezavantajlarından çok daha ağır basmaktadır.

Logto, hızla büyüyen bir kimlik doğrulama hizmeti olarak, erişim tokenleri formatı olarak JWT'yi de kullanmaktadır. Çeşitli yetkilendirme ve kimlik doğrulama protokollerine sıkı sıkıya bağlıdır ve kimlik doğrulama hizmetlerini ürünlerinize entegre etmeyi son derece kolay hale getirmektedir. Logto, resmi olarak SaaS hizmetini başlatmıştır ve bugün ücretsiz olarak deneyebilirsiniz.