Od samego początku dyskutujmy:
JWT to bardzo nowoczesne, proste i bezpieczne podejście, które obejmuje także tokeny Json Web. Tokeny internetowe Json to bezpaństwowe rozwiązanie do uwierzytelniania. Nie ma więc potrzeby przechowywania żadnego stanu sesji na serwerze, co oczywiście jest idealne dla spokojnych interfejsów API. Spokojne interfejsy API powinny zawsze być bezstanowe, a najczęściej stosowaną alternatywą dla uwierzytelniania za pomocą JWT jest po prostu przechowywanie stanu logowania użytkownika na serwerze za pomocą sesji. Ale oczywiście nie jest to zgodne z zasadą mówiącą, że uspokajające interfejsy API powinny być bezstanowe i dlatego rozwiązania takie jak JWT stały się popularne i skuteczne.
Teraz dowiedzmy się, jak uwierzytelnianie faktycznie działa z tokenami Json Web. Zakładając, że mamy już zarejestrowanego użytkownika w naszej bazie danych. Tak więc klient użytkownika zaczyna od wysłania żądania postu z nazwą użytkownika i hasłem, aplikacja sprawdza następnie, czy użytkownik istnieje i czy hasło jest poprawne, a następnie aplikacja wygeneruje unikalny token Json Web tylko dla tego użytkownika.
Token jest tworzony przy użyciu tajnego ciąg , który jest przechowywany na serwerze . Następnie serwer wysyła ten JWT z powrotem do klienta, który zapisze go w pliku cookie lub w lokalnej pamięci.
W ten sposób użytkownik jest uwierzytelniany i zasadniczo zalogowany do naszej aplikacji bez pozostawiania żadnego stanu na serwerze.
Tak więc serwer nie wie, który użytkownik jest faktycznie zalogowany, ale oczywiście użytkownik wie, że jest zalogowany, ponieważ ma ważny token Json Web, który jest trochę jak paszport umożliwiający dostęp do chronionych części aplikacji.
Więc ponownie, aby upewnić się, że masz pomysł. Użytkownik jest zalogowany, gdy tylko odzyska swój unikalny ważny Json Web Token, który nie jest zapisany nigdzie na serwerze. Dlatego proces ten jest całkowicie bezpaństwowy.
Następnie za każdym razem, gdy użytkownik chce uzyskać dostęp do chronionej trasy, na przykład danych swojego profilu użytkownika. Wysyła swój Json Web Token wraz z prośbą, więc to trochę jak pokazanie swojego paszportu, aby uzyskać dostęp do tej trasy.
Gdy żądanie trafi na serwer, nasza aplikacja sprawdzi, czy token sieci Web Jsona jest rzeczywiście prawidłowy, a jeśli użytkownik naprawdę jest tym, za kogo się podaje, dobrze, wtedy żądane dane zostaną wysłane do klienta, a jeśli nie, to nastąpi być błędem informującym użytkownika, że nie ma on dostępu do tego zasobu.
Cała ta komunikacja musi odbywać się przez https, więc bezpieczny szyfrowany HTTP, aby uniemożliwić każdemu dostęp do haseł lub tokenów Json Web. Tylko wtedy mamy naprawdę bezpieczny system.
Tak więc token WWW Jsona wygląda jak lewa część tego zrzutu ekranu, który został pobrany z debugera JWT na stronie jwt.io. Zasadniczo jest to ciąg kodujący złożony z trzech części. Nagłówek, ładunek i podpis Teraz nagłówek to tylko niektóre metadane dotyczące samego tokena, a ładunek to dane, które możemy zakodować w tokenie, dowolne dane, które naprawdę chcemy. Im więcej danych chcemy tutaj zakodować, tym większy JWT. W każdym razie te dwie części są zwykłym tekstem, który zostanie zakodowany, ale nie zaszyfrowany.
Aby każdy mógł je odkodować i odczytać , nie możemy przechowywać tutaj żadnych wrażliwych danych. Ale to wcale nie jest problem, ponieważ w trzeciej części, a więc w podpisie, rzeczy naprawdę stają się interesujące. Podpis jest tworzony przy użyciu nagłówka, ładunku i klucza tajnego zapisanego na serwerze.
Cały proces nazywany jest podpisywaniem tokenu internetowego Json . Algorytm podpisywania pobiera nagłówek, ładunek i klucz tajny, aby utworzyć unikalny podpis. Więc tylko te dane plus sekret mogą stworzyć ten podpis, dobrze? Następnie wraz z nagłówkiem i ładunkiem podpis ten tworzy JWT, który następnie jest wysyłany do klienta.
Gdy serwer otrzyma JWT w celu udzielenia dostępu do chronionej trasy, musi go zweryfikować, aby ustalić, czy użytkownik naprawdę jest tym, za kogo się podaje. Innymi słowy, sprawdzi, czy nikt nie zmienił nagłówka i danych ładunku tokena. Zatem ponownie, ten krok weryfikacji sprawdzi, czy żadna strona trzecia nie zmieniła ani nagłówka, ani ładunku tokenu Json Web.
Jak zatem działa ta weryfikacja? Cóż, w rzeczywistości jest to całkiem proste. Po otrzymaniu JWT weryfikacja zajmie jego nagłówek i ładunek, a wraz z kluczem tajnym, który jest nadal zapisywany na serwerze, w zasadzie tworzy podpis testowy.
Ale oryginalny podpis, który został wygenerowany przy pierwszym tworzeniu JWT, wciąż znajduje się w tokenie, prawda? I to jest klucz do tej weryfikacji. Ponieważ teraz wszystko, co musimy zrobić, to porównać podpis testowy z podpisem oryginalnym. A jeśli podpis testowy jest taki sam jak podpis oryginalny, oznacza to, że ładunek i nagłówek nie zostały zmodyfikowane.
Ponieważ gdyby zostały zmodyfikowane, podpis testowy musiałby być inny. Dlatego w tym przypadku, gdy nie nastąpiła zmiana danych, możemy następnie uwierzytelnić użytkownika. I oczywiście, jeśli te dwa podpisy są faktycznie różne, to znaczy, że ktoś manipulował danymi. Zwykle poprzez zmianę ładunku. Ale ta osoba trzecia manipulująca ładunkiem nie ma oczywiście dostępu do tajemnicy, więc nie mogą podpisać JWT. Oryginalny podpis nigdy nie będzie odpowiadał zmanipulowanym danym. Dlatego weryfikacja zawsze zakończy się niepowodzeniem. I to jest klucz do uruchomienia całego systemu. To magia sprawia, że JWT jest tak proste, ale także niezwykle potężne.
md5('original messaged' + secret) != md5('changed message' + secret)
więc jeśli ktoś zmieni wiadomość, możesz ją wykryć