Opak Erişim Belirteci vs JWT
Opak erişim belirteçleri ile JWT (JSON Web Tokens) arasındaki farkları, kullanım durumlarını ve OIDC tabanlı sistemlerde nasıl doğrulandıklarını anlayın.
Logto'da, bir OIDC tabanlı kapsamlı CIAM platformu olarak, yetkilendirme belirteçleri, kullanıcı etkileşimlerinin güvenli hale getirilmesinde ve kaynaklara erişimin yönetilmesinde kritik bir rol oynar. Yetkilendirme için kullanılan çeşitli belirteç türleri arasında, opak belirteçler ve JWT'ler (JSON Web Tokens) en önemli olanlardır.
Topluluğumuzdan birkaç soru aldık, örneğin: Opak bir belirteç ile JWT arasındaki fark nedir? Aldığım erişim belirtecini neden çözemiyorum ve neden belirteç uzunluğu kısa görünüyor? Bu blog yazısı, bu kavramları açıklığa kavuşturmayı ve opak belirteçlerle JWT'ler arasındaki farklılıkları, kullanım durumlarını anlamanızı sağlamayı amaçlıyor.
Opak belirteç nedir?
Opak bir belirteç, erişim belirteçleridir ve adı gereği, istemci veya herhangi bir dış taraf için opaktır veya şeffaf değildir. Bu, belirtecin kendisinin kullanıcı veya verilen yetkilendirme hakkında okunabilir bilgi taşımadığı anlamına gelir.
Bir opak belirteç aldığınızda, genellikle rastgele bir karakter dizisi gibi görünür ve onu çözmeye çalışmak hiçbir anlamlı veri sağlamaz.
İşte bir opak belirtecin örneği:
Belirtecin gerçek içeriği yalnızca onu veren yetkilendirme sunucusu tarafından bilindiğinden, bir opak belirteci doğrulamak için istemci onu sunucuya geri göndermelidir, bu da daha sonra belirtecin geçerliliğini doğrular ve ilişkili izinleri belirler. Bu yaklaşım, hassas bilgilerin gizli kalmasını sağlarken ek bir güvenlik katmanı sağlar, ancak belirtecin doğrulanması için ek sunucu iletişimi gerektirir.
Artılar:
- güvenli: Opak belirteçler, istemciye herhangi bir hassas bilgi sızdırmaz. Belirtecin içeriği yalnızca yetkilendirme sunucusu tarafından bilinir.
- iptal edilebilir: Belirteç sunucuda saklandığından ve onu doğrulamanın tek yolu yetkilendirme sunucusundaki not işlemi üzerinden olduğundan, sunucu gerektiğinde belirteci kolayca iptal edebilir ve yetkisiz erişimi önleyebilir.
- küçük boyut: Opak belirteçler, genellikle JWT'lerden daha kısa olur, bu da performans ve depolama açısından faydalı olabilir.
Eksiler:
- durumsal: Opak belirteçlerin doğrulanabilmesi için yetkilendirme sunucusunun durumunu koruması gerekir, bu da ek karmaşıklık ve yük getirebilir.
- performans: Belirtecin doğrulanması için ek sunucu iletişimi gereksinimi, özellikle yüksek trafik senaryolarında performansı etkileyebilir.
JWT nedir?
Opak belirteçlerin aksine, JWT (JSON Web Token) yapılandırılmış ve okunabilir bir formatta bilgi taşıyan bağımsız, durumsuz bir belirteçtir.
Bir JWT, üç bölümden oluşur: header
, payload
ve signature
ve her biri Base64URL ile kodlanmıştır.
İşte bir JWT örneği:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
header
, belirtecin türü ve imzalama için kullanılan algoritma hakkında bilgi içerir. Örneğin,{"alg": "HS256", "typ": "JWT"}
.payload
bölümü, kullanıcı veya yetkilendirme hakkında bilgiler içeren iddiaları içerir, örneğin kullanıcı kimliği, bitiş zamanı ve kapsamlar gibi. Bu veri kodlanmış ancak şifrelenmemiş olduğundan, belirtece sahip olan herkes iddiaları görerek belirteci çözümleyebilir ancak imzayı geçersiz kılmadan değiştiremez. Belirteç, kendi kendine yeterli doğasını bu şekilde kazanır. Örneğin,{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
.signature
, önceden belirtilen algoritmayı kullanarak header, payload ve gizli bir anahtar birleştirilerek oluşturulur. Bu imza, belirtecin bütünlüğünün doğrulanması ve üzerindeki değişikliklerin tespit edilmesini sağlar.
JWT'ler, istemci veya herhangi bir hizmet tarafından yerel olarak doğrulanabilir olduğu için yaygın olarak kullanılır, bu sayede yetkilendirme sunucusuyla etkileşime ihtiyaç duyulmadan doğrulanabilir. Bu, JWT'leri dağıtık sistemler için özellikle verimli kılar, çünkü birden fazla hizmet belirtecin geçerliliğini bağımsız olarak doğrulamak isteyebilir.
Ancak, bu kolaylık aynı zamanda belirtecin iddialarının aşırı derecede maruz kalmasını önleme sorumluluğunu da getirir, çünkü belirtece erişimi olan herkese görünür olabilirler. Ayrıca, JWT'ler genellikle kısa ömürlüdür ve belirtecin iddialarından biri olarak bitiş zamanı içerilir, bu şekilde belirtecin süresiz geçerli olmayacağı garanti altına alınır.
Artılar:
- durumsuz: JWT'ler bağımsızdır ve server-taraflı doğrulama için duruma gerek duymazlar.
- çapraz hizmet uyumluluğu: JWT'ler farklı hizmetler arasında kolayca paylaşılıp doğrulanabilir, bu da onları dağıtık sistemler için ideal kılar.
- genişletilebilir: JWT'nin yükü özel iddialar içerebilir ve bu da esnek yetkilendirme ve bilgi paylaşımı sağlar.
- standart: JWT belirteçleri iyi tanımlanmış bir standarda (RFC 7519) uyar, bu da onları geniş ölçüde desteklenen ve birlikte çalışabilir kılar.
Eksiler:
- maruz kalma: Bir JWT'deki iddialar, belirtece erişimi olan herkes tarafından görülebilir, bu nedenle hassas bilgilerin yükte bulunmaması gerekir.
- büyük boyut: JWT'ler, üzerlerindeki ek bilgi nedeniyle opak belirteçlerden daha büyük olabilir, bu da performans ve depolama hususlarını etkileyebilir. JWT belirteçlerindeki iddialar azaltılmalı, böylece belirteç boyutu minimize edilmelidir.
- iptali zorluk: JWT'ler durumsuz olduğu için genellikle kısa süreli geçerlidirler ve süresi dolmadan önce belirteçlerin iptal edilmesini sağlayan bir mekanizma yoktur, yani belirteç ele geçirilirse geçerliliğini kaybedene kadar kullanılabilir.
Opak erişim belirteci doğrulaması
Opak bir erişim belirteci, yetkilendirme sunucusuna doğrulama için geri gönderildiğinde doğrulanır. Yetkilendirme sunucusu, çıkarılan belirteçlerin durumunu saklar ve dahili deposuna dayalı olarak belirteç geçerliliğini belirleyebilir.
- İstemci, yetkilendirme sunucusundan bir erişim belirteci talep eder.
- Yetkilendirme sunucusu bir opak belirteç çıkarır.
- İstemci, başlıkta opak belirteç ile kaynak erişim isteği gönderir.
- Kaynak sağlayıcı, belirteci doğrulamak için yetkilendirme sunucusuna bir belirteç inceleme isteği gönderir.
- Yetkilendirme sunucusu, belirteç bilgisi ile yanıt verir.
JWT erişim belirteci doğrulaması (çevrimdışı)
Bir JWT erişim belirteci, belirtecin açık anahtarına erişimi olan herhangi bir hizmet veya istemci tarafından çevrimdışı olarak doğrulanabilir.
- Kaynak sağlayıcı, yetkilendirme sunucusunun açık anahtarını OIDC keşif uç noktasından önceden alır. Bu açık anahtar, belirteç imzasını doğrulamak ve bütünlüğünü sağlamak için kullanılır.
- İstemci, yetkilendirme sunucusundan bir erişim belirteci talep eder.
- Yetkilendirme sunucusu bir JWT belirteci çıkarır.
- İstemci, başlıkta JWT belirteci ile kaynak erişim isteği gönderir.
- Kaynak sağlayıcı, yetkilendirme sunucusundan alınan açık anahtarı kullanarak JWT belirtecini çözümler ve doğrular.
- Kaynak sağlayıcı, belirteç geçerliliğine dayanarak erişim izni verir.
OIDC'deki kullanım durumları
OIDC (OpenID Connect) bağlamında, opak belirteçler ve JWT'ler farklı amaçlara hizmet eder ve farklı senaryolarda kullanılır.
Opak belirteçler
- Kullanıcı profilinin alınması:
Varsayılan olarak, bir istemci bir kaynak belirtmeden ve openid
kapsamını ekleyerek bir erişim belirteci talep ettiğinde, yetkilendirme sunucusu opak bir erişim belirteci çıkarır. Bu belirteç, öncelikle OIDC /oidc/userinfo
uç noktasından kullanıcı profili bilgilerini almak için kullanılır. İstemciden opak erişim belirteci ile bir istek aldığında, yetkilendirme sunucusu, ilişkili yetkilendirme bilgisini almak için dahili deposunu kontrol eder ve kullanıcının profil ayrıntılarını yanıtlamadan önce belirtecin geçerliliğini doğrular.
- Yenileme belirteçlerinin değişimi:
Yenileme belirteçleri yalnızca istemci ve yetkilendirme sunucusu arasında değiştirilecek şekilde tasarlanmıştır ve kaynak sağlayıcılarla paylaşılmasına gerek yoktur. Bu nedenle, yenileme belirteçleri tipik olarak opak belirteç olarak verilir. Mevcut erişim belirteci süresi dolduğunda, istemci opak yenileme belirtecini yeni bir erişim belirteci elde etmek için kullanabilir ve kullanıcının yeniden kimlik doğrulaması olmadan sürekli erişimi sağlar.
JWT'ler
- Kimlik belirteci:
OIDC'de, kimlik belirteci, kullanıcı bilgilerini içeren ve kullanıcıyı kimlik doğrulayan bir JWT'dir. Genellikle erişim belirtecinin yanında verilen kimlik belirteci, istemcinin kullanıcının kimliğini doğrulamasına olanak tanır. Örneğin:
İstemci, kimlik doğrulayıcısının kimliğini doğrulamak ve kişiselleştirme veya yetkilendirme amaçları için kullanıcı bilgilerini çıkarmak için kimlik belirtecini doğrulayabilir. Kimlik belirteci, yalnızca tek seferlik kullanım içindir ve API kaynağı yetkilendirmesi için kullanılmamalıdır.
- API kaynak erişimi:
İstemci, belirli bir kaynak göstergesi ile erişim belirteci talep ettiğinde, yetkilendirme sunucusu, bu kaynağa erişim amacıyla bir JWT erişim belirteci verir. JWT, kaynak sağlayıcısının istemcinin erişimini yetkilendirmek için kullanabileceği iddialar içerir. Örneğin:
Kaynak sağlayıcı, iddiaları kontrol ederek isteği doğrulayabilir:
iss
: Jetonun güvenilir bir yetkilendirme sunucusu tarafından verilen olduğunu doğrular.sub
: Belirteçle ilişkili kullanıcıyı tanımlar.aud
: Belirtecin belirli bir kaynak için verildiğini garanti eder.scope
: Kullanıcıya verilen izinleri doğrular.
Sonuç
Özetle, opak belirteçler ve JWT'ler, OIDC tabanlı sistemlerde farklı amaçlara hizmet eder, opak belirteçler güvenli ve durumlu bir yöntem sunarken, JWT'ler bağımsız ve durumsuz bir alternatif sunar. Bu belirteç türlerinin arasındaki farkları ve kullanım durumlarını anlamak, uygulamalarınızda güvenli ve verimli kimlik doğrulama ve yetkilendirme mekanizmaları tasarlamak için gereklidir.
Logto'daki daha fazla erişim belirteci özelliğini keşfedin: