Jwt Nedir, Nasıl Çalışır?
JWT (JSON Web Token) Nedir ?
JWT (JSON Web Token) IETF kuruluşu tarafından tasarlanan bir token biçimidir.
Nasıl kullanılır ?
JWT, Base64 biçiminde kodlanmış 3 ayrı parçadan oluşmaktadır. Parçalar (.) sembolüyle ayrılır.
-
Client k.adı ve şifresini sunucuya gönderir
-
Sunucu veritabanına bakar, eğer kullanıcı valid ise 3 parçadan oluşan JWT oluşturulur. Oluşan JWT istemciye döndürülür.
JWT, HMAC veya RSA,ECDSA kriptolama mantıklarından birisi ile kullanılır. HMAC’de tek bir gizli anahtar vardır (secret key), JWT imzalama ve doğrulama bu anahtarla yapılır. RSA ve ECDSA kriptolama algoritmalarında ise private ve public olmak üzere 2 anahtar vardır. Eğer JWT bu kripto algoritmalarını kullanıyorsa, private key ile imzalanır public key ile validate edilir. Örneğin birden fazla servisin doğrulama yapabilmesinin gerektiği sistemlerde (mikroservis gibi) herkesle private key paylaşmak riskli olduğundan public key kullanılabilir. Eğer sistem monolitikse, HMAC kullanılarak secret key ile hem şifreleme hem doğrulama yapılabilir.
- İstemci her istek yaptığında JWT’yi sunucuya tekrar yollar. Sunucu, veritabanında kaydedilmiş secret keyi çeker, JWT’nin ilk 2 parçası ve secret key ile imza oluşturur ve bu imzayı JWT’nin 3.parçası olan imza ile kıyaslar. Eğer aynıysa bu gelen valid bir JWT tokendır der ve yetkilendirmeyi onaylamış olur.
Burada dikkat edilmesi gereken en önemli nokta : JWT imzası üretirken kullanılan key gizli olmalıdır. Çünkü eğer gizli olmazsa başkaları da valid JWT imzaları oluşturur ve backend bunları valid gördüğü için authenticade edecek ve saldırgana kullanmaması gereken sourceları kullanma imkanı verecektir. Bununla beraber, JWT imzasını oluşturmak değil, sadece verify etmek için kullanılan key public key olabilir.
JSON Web Token parçaları
1) JOSE Header
JOSE HEADER örneği
{
"alg":"HS256", (1)
"typ":"JWT" (2)
}
- 1 : JWT imzalanırken kullanılan algoritmayı gösterir
- 2 : Bunun bir JWT nesnesi olduğunu belirtir.
JOSE Header , JWT içine Base64 olarak kodlanarak eklenir. Örneğin yukarıdaki Header’in Base64 ile kodlanmış hali ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9 şeklindedir.
2) JWT Payload
JWT içerisindeki kişiye ait vs bilgilerin bulunduğu bölümdür. Bir JWT Payload örneği aşağıda görülebilir ;
{
"userId": "3344552266",
"expire": 1486220816,
"roles": ["admin", "user"]
}
3) JWT Signature
Postun başında belirttiğim gibi, JWT’nin ilk 2 bölümü kullanılarak oluşturulur. 1. bölümde belirtilen algoritma ile üretilir. (HS256 vb.) Üretilmesiyle alakalı örnek adımlar aşağıda verilmiştir
PART1= doBASE64(HEADER)
PART2= doBASE64(PAYLOAD)
PART1_PART2= PART1 + "." + PART2
SECRET_KEY= "Merhaba KodEdu"
PART3= doBASE64(doHMACSHA256(PART1_PART2, SECRET_KEY))
JWT_TOKEN= PART1_PART2 + "." + PART3
Kaynaklar
https://jwt.io/introduction/
https://kodedu.com/2017/03/jwt-json-web-tokens-nedir-ne-ise-yarar/
Leave a comment