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ı okuOAuth
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ı okuJWT ve OAuth karşılaştırması
| Özellik | JWT | OAuth |
|---|---|---|
| Ne olduğu | Bir token biçimi | Bir yetkilendirme çerçevesi: akışlar bütünü |
| Cevapladığı soru | Token'ın ne söylediği ve değiştirilip değiştirilmediği | Bir uygulamanın bir kullanıcı adına API çağırma iznini nasıl aldığı |
| Tanımlandığı yer | RFC 7519 | RFC 6749 (OAuth 2.0) |
| Parçaları | Bir başlık, subject ve son kullanma gibi claim'ler ve bir imza | Roller: istemci, kullanıcı, yetkilendirme sunucusu, kaynak sunucusu |
| Kullanıldığı yer | Eriş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 yerde | Evet, sunucunun denetlediği opak token'larla |
| Yaygın hata | İmzayı doğrulamadan çözmek | Onu 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
// 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// 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 pageSı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.