Ana içeriğe geç

Yan yana

JWTvsOAuth

JWT ile OAuth arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

OAuth, uygulamaya kullanıcı verisine sınırlı erişim veren bir çerçeve, JWT ise bir token biçimidir. Rakip değiller: OAuth çoğu zaman JWT erişim token'ı verir.

JWT

JSON Web Token

JWT, kullanıcı kimliği ve son kullanma zamanı gibi bilgileri taşıyan, imzalı ve kompakt bir token'dır; sunucunun oturum aramadan istekleri doğrulamasını sağlar.

JWT sayfasını oku

OAuth

OAuth, bir uygulamanın kullanıcının parolasını hiç görmeden başka bir servisteki verilerine erişmesini sağlayan açık bir yetkilendirme standardıdır.

OAuth sayfasını oku

JWT ve OAuth karşılaştırması

ÖzellikJWTOAuth
Ne olduğuBir token biçimiBir yetkilendirme çerçevesi: akışlar bütünü
Cevapladığı soruToken'ın ne söylediği ve değiştirilip değiştirilmediğiBir uygulamanın bir kullanıcı adına API çağırma iznini nasıl aldığı
Tanımlandığı yerRFC 7519RFC 6749 (OAuth 2.0)
ParçalarıBir başlık, subject ve son kullanma gibi claim'ler ve bir imzaRoller: istemci, kullanıcı, yetkilendirme sunucusu, kaynak sunucusu
Kullanıldığı yerErişim token'ları, ID token'ları ve oturum token'larıBir uygulamanın takviminizi okuması gibi devredilmiş erişim
Diğeri olmadan çalışır mı?Evet, imzalı token gereken her yerdeEvet, sunucunun denetlediği opak token'larla
Yaygın hataİmzayı doğrulamadan çözmekOnu tek başına bir giriş protokolü olarak kullanmak

Fark, açıklamalı

JSON Web Token (JWT) bir biçimdir: kullanıcının kim olduğu ve token'ın ne zaman sona ereceği gibi claim'ler taşıyan imzalı bir metin. OAuth 2.0 ise bir yetkilendirme çerçevesidir: bir uygulamanın, kullanıcının parolasını hiç görmeden, onun adına bir API'yi çağırmak için kullanıcıdan izin aldığı akışlar bütünü.

İkisi, OAuth'un token dağıttığı yerde buluşur. Kullanıcı bir uygulamayı onayladıktan sonra yetkilendirme sunucusu bir erişim token'ı verir, API de onu her istekte kabul eder. OAuth bu token'ın neye benzeyeceğini söylemez: API'nin sunucuya sorarak denetlediği rastgele bir metin de olabilir, API'nin imzasından kendi başına doğruladığı bir JWT de. Pek çok sağlayıcı bu yüzden JWT'yi seçer; OAuth üzerine kurulu OpenID Connect de ID token'ı için her zaman JWT kullanır.

Yani JWT mi OAuth mu diye sormak, pasaport mu sınır kontrolü mü diye sormaya benzer: biri bir belgedir, diğeri kimin belge alacağına ve belgenin neye izin vereceğine karar veren süreçtir. JWT'leri OAuth olmadan, örneğin kendi giriş sisteminizin oturum token'ları olarak kullanabilirsiniz; OAuth'u da JWT olmadan, opak token'larla kullanabilirsiniz.

İki hata yaygındır. Birincisi OAuth'u giriş sistemi sanmaktır: OAuth bir uygulamanın ne yapabileceğini cevaplar, kullanıcının kim olduğunu değil; kullanıcıları başka bir sağlayıcıyla giriş yaptırmak OAuth üzerine kurulu OpenID Connect ile yapılır. İkincisi bir JWT'ye imzasını, yayıncısını, hedef kitlesini ve süresini denetlemeden güvenmektir: bir token'ı çözmek onu doğrulamak değildir.

Hangisini kullanmalısınız?

JWT şu durumlarda doğru seçim:

  • Servislerin, merkezî bir sunucuyu çağırmadan bir token'ı kendi başlarına doğrulaması gerekiyor.
  • Bir token'ın içine ne gireceğine ve nasıl imzalanacağına karar veriyorsunuz.
  • Kendi servisleriniz arasında kimliği taşımak için kompakt ve imzalı bir yola ihtiyacınız var.

OAuth şu durumlarda doğru seçim:

  • Üçüncü taraf bir uygulamanın, servisinizdeki bir kullanıcının verilerine sınırlı erişime ihtiyacı var.
  • Kullanıcılar parola paylaşmadan izin verebilmeli ve izni geri alabilmeli.
  • Mevcut istemcilerin ve kütüphanelerin zaten desteklediği standart akışlar istiyorsunuz.

Bir JWT'yi doğrulamak ile bir OAuth akışı başlatmak

JWTjavascript
// JWT: decoding shows the claims, verifying proves they are genuine
import { jwtVerify } from "jose";

const { payload } = await jwtVerify(token, publicKey, {
  issuer: "https://auth.example.com",
  audience: "orders-api",
});
console.log(payload.sub, payload.scope); // who, and what they may do
OAuthjavascript
// OAuth: send the user to approve, then swap the code for tokens
const url = new URL("https://auth.example.com/authorize");
url.search = new URLSearchParams({
  response_type: "code",
  client_id: CLIENT_ID,
  redirect_uri: "https://app.example.com/callback",
  scope: "orders:read",
  state,
  code_challenge,               // PKCE
  code_challenge_method: "S256",
});
location.href = url; // the user signs in and approves on the provider's page

Sık sorulan sorular

OAuth ile OpenID Connect aynı şey mi?

Hayır. OpenID Connect, OAuth 2.0'ın üzerinde girişi ekleyen bir katmandır: JWT olan bir ID token uygulamaya kullanıcının kim olduğunu söyler.

OAuth erişim token'ları her zaman JWT mi?

Hayır. Spesifikasyon biçimi açık bırakır. Bazı sağlayıcılar API'lerin yerel olarak doğrulayabileceği JWT'ler verir; diğerleri ise API'nin yetkilendirme sunucusuna sorarak denetlediği opak metinler verir, bu da iptali kolaylaştırır.

Kendi uygulamamın girişi için OAuth gerekir mi?

Şart değil. Kendi kullanıcılarınız kendi uygulamanıza giriş yaparken bir oturum ya da kendi verdiğiniz bir token yeterlidir. OAuth, başka uygulamalar kullanıcılarınız adına iş yaptığında ya da kullanıcılar başka bir sağlayıcı üzerinden giriş yaptığında önem kazanır.

Daha fazla

Ayarlar