**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.

Yapı
----

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.

```
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
--------

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
------------------

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. |
| `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
---------------------

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
----------

* 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
-------------

* 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
--------

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
---------------

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