JSON Web Token

Vikipedi, özgür ansiklopedi

JSON Web Token (JWT), tarafların birbirleri arasındaki veri alışverişini ve bunun doğrulamasını sağlayan JSON tabanlı RFC 7519'de tanımlanmış açık bir standarttır. Örneğin bir sunucu, kullanıcının yönetici ayrıcalıklarına sahip olduğunu belirten bir anahtar (token) oluşturabilir ve bunu kullanıcıya gönderebilir. Kullanıcı daha sonra bu anahtar ile kendisine tanımlanmış olan yönetici yetkisini bir istemcide kullanabilir ve bütün taraflar tarafından yetkisi doğrulanabilir.[1]

Yapı[değiştir | kaynağı değiştir]

JSON Web Token'ları genellikle üç bölümden oluşur; header (başlık), payload (yük) ve signature (imza). Header, oluşturulacak imzada hangi algoritmanın kullanılacağını belirtir.[2]

header = '{"alg":"HS256","typ":"JWT"}'

HS256 algoritmanın HMAC-SHA256 ile imzalandığını gösterir.

Payload, taraflar arasındaki benzersiz bilgileri içerir.

payload = '{"loggedInAs":"admin","iat":1422779638}'

iat, anahtarın oluşturulma zamanını içeren bilgiyi taşır ve JWT'de önerilen bir kullanımdır.

Signature ise header ve payload'ın base64url (RFC 4648 §5) ile kodlanıp nokta simgesiyle bir araya getirilmesinin ardından bir gizli anahtarla şifrelenmesiyle ortaya çıkar.

key           = 'secretkey'
unsignedToken = encodeBase64Url(header) + '.' + encodeBase64Url(payload)
signature     = HMAC-SHA256(key, unsignedToken)

Son olarak üç bölümün bir araya gelip, signature'ün de base64url ile kodlanmasıyla anahtar (token) ortaya çıkar.

token = encodeBase64Url(header) + '.' + encodeBase64Url(payload) + '.' + encodeBase64Url(signature) # oluşan anahtar: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

Çıktısı HTML ve HTTP ortamlarına kolayca entegre edilebilen, base64url ile kodlanmış güvenilir karakterlerden oluşmaktadır. Tipik kriptografik algoritmaları olarak HMAC ile birlikte SHA-256 (HS256) ve RSA ile birlikte SHA-256 (RS256) kullanılmaktadır.

Kullanım[değiştir | kaynağı değiştir]

Kimlik doğrulaması sırasında, kullanıcının gönderdiği bilgiler de doğrulandıysa bir anahtar (token) oluşturulup kullanıcıya döndürülür ve bu lokalde saklanır (örneğin çerezler ya da web storage).

Kullanıcı doğrulaması gerektiren durumlarda, istemci tarafından sunucuya Bearer şemasına sahip Authorization header'ı gönderilir. Header içeriği aşağıdaki gibi görünecektir:

 Authorization: Bearer eyJhbGci...<snip>...yu5CSpyHI

Bu durumsuz (stateless) kimlik doğrulama yöntemidir ve kullanıcı durumu asla sunucu belleğine kaydedilmez. Sunucu daima Authorization header'ından gönderilen JWT'nin geçerli olup olmadığını kontrol eder ve geçerliyse kullanıcının korumalı kaynaklara erişmesine izin verilir. Tüm bilgiler JWT'nin içerisinde olduğundan veritabanının birden fazla sorgulanma ihtiyacını azaltır.

Standart etiketler[değiştir | kaynağı değiştir]

Aşağıda JWT'nin IETF taslağında belirtilen, JWT'nin payload kısmında doğrulama amacıyla kullanılabilecek, önerilen standart etiketler bulunmaktadır:

etiket isim açıklama
iss Verici ("issuer") JWT'yi oluşturan/veren kuruluşun adı.
sub Alıcı ("subject") JWT'nin alıcısını belirten eşsiz değer.
aud Hedef kitle ("audience") JWT'yi yürütecek tarafı belirten değer. Eğer değer yürütmeciyle eşleşmiyorsa JWT reddedilir.
exp Bitiş zamanı ("expiration") JWT'nin hangi süreye kadar geçerli olduğunu belirten değer. Sayısal formatta olmalıdır.[3]
nbf Öncesi olamaz ("not before") JWT'nin hangi süreden önce geçerli olamayacağını belirtir. Sayısal formatta olmalıdır.
iat Oluşturulma zamanı ("issued at") Anahtarın oluşturulma zamanını içeren bilgiyi taşır. Sayısal formatta olmalıdır.
jti JWT ID Büyük/küçük harfe duyarlı, JWT'yi tanımlayan eşsiz anahtar kodu.

Geçersiz Hale Getirme[değiştir | kaynağı değiştir]

JWT'ler aslında birkaç şekilde uzaktan geçersiz hale getirilebilir. Bu yöntemlerden ilki jeton için bir ömür tanımlamaktır. Bu süre dolduğunda anahtar reddedilir ve geçerliliğini yitirmiş olur. Eğer sistem kullanıcısı, kendisi için önceden oluşturulmuş bir anahtarın artık işe yaramaması gerektiğine karar verirse bunu uzaktan etkisiz hale getirebilmek isteyecektir. Böyle bir senaryoda anahtarlar için oldukça kısa ömür tanımlanmalıdır. Anahtar ömrü dolunca, client mekanizması, yenileme amacıyla eski anahtarı da ileterek server tarafından bir anahtar ister. Server, eski anahtarın geçerliliğini kontrol eder. Güvenilirse kara listesinde olup olmadığına bakar. Kara listede değilse aynı anahtardan yeni bir tane oluşturup gönderir. Böyle bir işleyişte, kullanıcı sisteme başka bir cihazdan erişip bir anahtarı kara listeye gönderecek olursa anahtar bir sonraki yenileme periyodunda artık yenilenmez ve geçersiz hale gelmiş olur. Bu yöntemde bir anahtar en kötü ihtimalle ömrü kadar (veya daha kısa) bir süre sonra uzaktan geçersiz kılınabilir.

Avantajlar[değiştir | kaynağı değiştir]

  • JWT'ler durumsuz (stateless) oldukları için kullanıcı durumlarının elde edilmesi için veritabanı sorgulamasına gerek kalmaz.
  • Oturum yönetimi, çerezler kullanılmaksızın yapılabilir.
  • Tek bir anahtar, birden fazla arka uçta (backend) kullanılabilir.
  • Veritabanı sorgulaması ya da dosya sistemi kullanımı gerektirmediği için performanslıdır.

Dezavantajlar[değiştir | kaynağı değiştir]

  • JWT'ler durumsuz oldukları için, sunucuda durum tutulmadığı sürece anahtarları gerektiğinde geçersiz kılmanın bir yolu yoktur.
  • JWT gizli anahtarı yeterince güçlü değil ise, kırılması daha kolay olur.

Kaynakça[değiştir | kaynağı değiştir]

  1. ^ "JSON Web Token (JWT)". ietf.org. 27 Mart 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mart 2019. 
  2. ^ "Introduction to JSON Web Tokens". 20 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mart 2019. 
  3. ^ John, Bradley,; Nat, Sakimura,; Michael, Jones,. "JSON Web Token (JWT)". tools.ietf.org (İngilizce). 16 Haziran 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Aralık 2017. 

Dış bağlantılar[değiştir | kaynağı değiştir]

  • jwt.io, JWT için araçlar ve kaynaklar sunan bir website. (İngilizce)