JSON Web Token OAuth protokolü üzerinde veri değiş tokuşu sırasında kullanılan JSON formatında veriler içeren veri yapılarıdır.
JSON Web Token, Web içerik kaynağına erişmek için kullanılan bir bilet gibi düşünülebilir. Erişilmek istenen Web kaynağı, bir servis veya web sitesi olabilir. Kaynağa erişmek isteyen kullanıcı uygulamanın, doğrulanmış ve yetkili olup olmadığını tanıtan bir kart gibi düşünebiliriz. Genel olarak access token olarak da adlandırılır.
Token Kullanım Amacı
JSON Web Token kullanım amacı güvenliği sağlamaktır. Web Api gibi kaynaklara erişim talepleri mobil, SPA (Single Page Application) veya Web sitesi gibi uygulamalardan yapılabilmektedir. Sınırlı erişime sahip yada kullanıcı doğrulama gerektiren Web Api kaynağına yapılan her talep(request) bünyesinde bir erişim bileti(access token) bulundurmak zorundadır.
- Güvenlik amacıyla kullanılan veri yapılarıdır.
- İçeriğinde issuer ve subject (claims) bilgileri bulunur.
- Simetrik veya asimetrik imzalar içerir.
- Kullanım bitiş süresi(expiration time) içerir.
- Kullanıcı(Client) uygulama, token talebini yapan taraftır.
- Yayıncı(issuer), kullanıcıya token veren taraftır.
- Kaynak(resource) token bilgisini kullanan taraftır.
- Yayıncı(issuer) ile güvenli bir iletişim içerisindedir.
Token Yapısı
Access token şifrelenmiş ve nokta(.) ile ayrılmış üç bölümden oluşur ve her bir bölüm, kendine has bilgiler barındırır. Bunlar:
- Header
- Payload
- Signature şeklindedir
Bir token içeriğinde bulunan bilgiler şifre çözülerek edilerek elde edilebilir. Online olarak bu işlemi gerçekleştirmek için jwt.io kullanılabilir.
Bir JWT kendisi ile ilgili bilgileri bünyesindeki ilgili bölümde barındırır.
JWT Header Bölümü: İki kısımdan oluşur
- Tür bilgisi (Örnek: JWT)
- Şifreleme algoritma bilgisi (Örnek: HMAC, SHA256)
JWT Payload Bölümü: Bu bölümde uygulamalar için gerekli bilgiler bulunur. JWT Claims olarak da adlandırılır. JWT Claims üç farklı bölüme ayrılmıştır.
1- Registered Claims: Bu bölümde bulunabilecek içerik bilgisi aşağıdaki gibi olmakla beraber hepsinin kullanılması zorunlu değildir.
- “iss“(issuer): Token üreten yayıncı.
- “sub“(subject): Token başlığı.
- “aud“(audience): Token alıcısı.
- “exp“(expiration time): Token bitiş süresi.
- “nbf“(not before): Belirtilen tarihten önce kullanılamaması.
- “iat“(issued at): Token yayınlanma zamanı.
- “jti“(JWT ID): Unique identifier.
2-Public Claims: Bu bölümde tanımlanan bilgilere URI veya URN şeklinde adlandırma yapılarak token gönderen ve alan tarafların aynı ağda olmadığı durumlarda namespace belirteci ile çarpışmalar önlenebilir. Örneğin: https://www.bayramucuncu.com/jwt_claims/is_admin
3-Private Claims: Genelde kurumsal özel ağlarda kullanılan ve token üretici ve tüketicisi arasında kullanılan özel isimlerdir.
{ "iss": "bayramucuncu.com", //Registered Claim "exp": 123456789, //Registered Claim "https://bayramucuncu.com/jwt_claims/is_admin": true, // Public Claim "username": "bayram", // Private Claim "user_id": "7617dfa9-9084-4e1e-8140-e1dc161ac594" // Private Claim }
JWT Signature Bölümü:
Bu bölüm JWT için imza niteliğindedir ve üç bölümün şifrelenmiş olarak birleştirilmesinden oluşur.
- JWT Header
- JWT Payload
- Secret
Örneğin HMAC SHA256 algoritması ile şifreleme yapmak için aşağıdaki yol izlenebilir.
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
Token imza bölümü gönderenin kim olduğu bilgisini içerir ve bilginin yolda gelirken değiştirilmediğini garanti altına alır.
Token elde etme süreci nasıl işler?
Adım-1: İstemci (client)tarafından JWT üreten sunucuya kullanıcı adı ve şifre ile birlikte POST talebi gönderilir.
Adım-2: Eğer kullanıcı bilgileri doğru ise sunucu istemciye bir JWT gönderir.
Adım-3: Elde edilen JWT bilgisi ile artık istenen kaynaktan veri elde etmek mümkündür. Kullanıcı tarafı, yeni bir talep gönderirken JWT bilgisini talebin HTTP header bölümüne ekler ve talebi kaynağa iletir.
Adım-4: Sunucu JWT kontrolü sonrasında istemciye cevabı geri gönderir.
JWT Kullanmanın Avantajları
- Kaynak tarafında oturum yönetimi(session management) yoktur.
- Cookie kulanımına gerek yoktur.
- Kaynaklar farklı domainlerde olsa bile tek bir token ile birden fazla kaynağa ulaşmak mümkündür. Çünkü JWT üreten sunucu diğer sunuculardan tamamen bağımsızdır ve her kaynak JWT doğrulamasını JWT üreten sunucudan yapar.
- Mobil uyumludur. iOS, Android, Windows Mobile gibi ortamlarda token kullanarak kaynağa erişim sağlamak mümkündür.
- Her token kendi bitiş süresine sahiptir ve logout gibi işlemlere gerek yoktur. Süresi bitmiş bir Token ile kaynağa erişim mümkün değildir.
- Performansı yüksektir.
- RFC tarafından standartlaştırılmıştır. Standart kodu RFC 7519‘dur.
Kaynaklar:
- https://jwt.io/introduction/
- https://jwt.io/
- https://tools.ietf.org/html/rfc7797
- http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#RegisteredClaimName
- https://auth0.com/blog/2014/12/02/using-json-web-tokens-as-api-keys/