En başından tartışalım:
JWT, Json Web Jetonlarını genişleten çok modern, basit ve güvenli bir yaklaşımdır. Json Web Jetonları kimlik doğrulama için durumsuz bir çözümdür. Bu nedenle, elbette dinlendirici API'ler için mükemmel olan herhangi bir oturum durumunu sunucuda depolamaya gerek yoktur. Dinlendirici API'ler her zaman vatansız olmalıdır ve JWT'lerle kimlik doğrulamanın en yaygın kullanılan alternatifi, oturumları kullanarak kullanıcının oturum açma durumunu sunucuda depolamaktır. Ancak elbette, huzurlu API'lerin vatansız olması gerektiğini söyleyen ilkeyi takip etmiyor ve bu yüzden JWT gibi çözümler popüler ve etkili oldu.
Şimdi, kimlik doğrulamanın Json Web Tokens ile gerçekten nasıl çalıştığını öğrenelim. Veritabanımızda zaten kayıtlı bir kullanıcımız olduğu varsayılarak. Kullanıcının istemcisi, kullanıcı adı ve parola ile bir gönderi isteği yaparak başlar, uygulama daha sonra kullanıcının var olup olmadığını kontrol eder ve parola doğru ise, uygulama yalnızca o kullanıcı için benzersiz bir Json Web Jetonu oluşturur.
Belirteç bir kullanılarak oluşturulan gizli dize olan bir sunucuda depolanan . Daha sonra, sunucu bu JWT'yi istemciye geri gönderir ve bu da bir çerezde veya yerel depoda saklar.
Bunun gibi, kullanıcı kimliği doğrulanır ve temel olarak sunucuda herhangi bir durum bırakmadan uygulamamıza giriş yapar.
Yani sunucu aslında hangi kullanıcının gerçekten giriş yaptığını bilmiyor, ancak elbette kullanıcı, uygulamanın korumalı bölümlerine erişmek için biraz pasaport gibi geçerli bir Json Web Jetonuna sahip olduğu için giriş yaptığını biliyor.
Yine, sadece fikri anladığınızdan emin olmak için. Bir kullanıcı, sunucuda herhangi bir yere kaydedilmemiş olan benzersiz geçerli Json Web Jetonunu geri alır almaz oturum açar. Dolayısıyla bu süreç tamamen vatansızdır.
Ardından, her kullanıcı, kullanıcı profili verileri gibi korunan bir rotaya her erişmek istediğinde. Json Web Jetonunu bir istekle birlikte gönderir, bu yüzden bu rotaya erişmek için pasaportunu göstermek gibi.
İstek sunucuya çarptığında, uygulamamız Json Web Token'ın gerçekten geçerli olup olmadığını doğrular ve kullanıcı gerçekten söylediği kişi ise, o zaman istenen veriler istemciye gönderilir ve değilse, o zaman kullanıcıya bu kaynağa erişmesine izin verilmediğini söyleyen bir hata olabilir.
Tüm bu iletişim https üzerinden gerçekleşmelidir, Herkesin parolalara veya Json Web Jetonlarına erişmesini önlemek için şifreli Http'yi güvenli hale getirin. Ancak o zaman gerçekten güvenli bir sistemimiz var.
Yani bir Json Web Jetonu, jwt.ioSo'daki JWT hata ayıklayıcısından alınan bu ekran görüntüsünün sol kısmına benziyor, aslında üç bölümden oluşan bir kodlama dizesi. Üstbilgi, yük ve imza Şimdi üstbilgi, yalnızca belirtecin kendisi hakkında bazı meta verilerdir ve yük, belirtecin içine kodlayabildiğimiz, gerçekten istediğimiz verilerdir. Yani burada daha fazla veri kodlamak istediğimizde JWT daha büyük olur. Her neyse, bu iki bölüm yalnızca şifrelenecek ancak şifrelenmeyecek düz metindir.
Böylece kimse bunları çözebilir ve okuyabilir , burada hassas verileri saklayamayız. Ama bu hiç de sorun değil çünkü üçüncü bölümde, yani imzada, işlerin gerçekten ilginçleştiği yer. İmza, üstbilgi, faydalı yük ve sunucuya kaydedilen sır kullanılarak oluşturulur.
Ve tüm bu sürece Json Web Jetonunu imzalama denir . İmza algoritması, benzersiz bir imza oluşturmak için başlığı, yükü ve sırrı alır. Yani sadece bu veri artı sır bu imzayı yaratabilir, tamam mı? Daha sonra üstbilgi ve yük ile birlikte bu imza, daha sonra istemciye gönderilen JWT'yi oluşturur.
Sunucu korumalı bir rotaya erişim izni vermek için bir JWT aldığında, kullanıcının gerçekte kim olduğunu iddia edip etmediğini belirlemek için bunu doğrulaması gerekir. Başka bir deyişle, kimsenin jetonun başlığını ve yük verilerini değiştirip değiştirmediğini doğrular. Bu nedenle, bu doğrulama adımı, hiçbir üçüncü tarafın Json Web Token'ın üstbilgisini veya yükünü gerçekten değiştirip değiştirmediğini kontrol edecektir.
Peki, bu doğrulama aslında nasıl çalışıyor? Aslında oldukça basittir. JWT alındıktan sonra, doğrulama üstbilgisini ve yükünü alır ve hala sunucuda kayıtlı olan sır ile birlikte temel olarak bir test imzası oluşturur.
Ancak, JWT ilk oluşturulduğunda oluşturulan orijinal imza hala belirteçte, değil mi? Ve bu doğrulamanın anahtarı bu. Çünkü şimdi tek yapmamız gereken test imzasını orijinal imzayla karşılaştırmak. Test imzası orijinal imzayla aynıysa, yükün ve başlığın değiştirilmediği anlamına gelir.
Çünkü değiştirilmiş olsaydı, test imzasının farklı olması gerekirdi. Bu nedenle, verilerde değişiklik olmadığı bu durumda, kullanıcının kimliğini doğrulayabiliriz. Ve elbette, iki imza gerçekten farklıysa, o zaman birisinin veriyi kurcaladığı anlamına gelir. Genellikle yükü değiştirmeye çalışarak. Ancak, yükü manipüle eden üçüncü tarafın elbette sırra erişimi yoktur, bu nedenle JWT'yi imzalayamazlar. Böylece orijinal imza asla manipüle edilen verilere karşılık gelmez. Bu nedenle, doğrulama bu durumda her zaman başarısız olacaktır. Ve tüm bu sistemi çalıştırmanın anahtarı budur. JWT'yi bu kadar basit, ama aynı zamanda son derece güçlü yapan sihir.
md5('original messaged' + secret) != md5('changed message' + secret)
böylece birisi mesajı değiştirirse onu tespit edebilirsiniz