Давайте відмовимося від самого початку:
JWT - це дуже сучасний, простий та безпечний підхід, який поширюється на веб-маркери Json. Веб-маркери Json - це рішення без громадянства для аутентифікації. Тому немає необхідності зберігати будь-який стан сеансу на сервері, що, звичайно, ідеально підходить для спокійних API. API відпочинку завжди повинні бути без стану, і найбільш широко використовуваною альтернативою автентифікації з JWT є просто зберігання стану входу користувача на сервер за допомогою сеансів. Але, звичайно, не слідує принципу, який говорить, що спокійні API повинні бути без громадянства, і саме тому такі рішення, як JWT, стали популярними та ефективними.
Тож тепер давайте дізнаємось, як насправді працює автентифікація з веб-маркерами Json. Якщо припустити, що ми вже маємо зареєстрованого користувача в нашій базі даних. Таким чином, клієнт користувача починає з подання запиту на повідомлення з ім'ям користувача та паролем, після чого програма перевіряє, чи існує користувач, і чи правильний пароль, тоді програма створить унікальний Json Web Token тільки для цього користувача.
Маркер створюється за допомогою секретного рядка, який зберігається на сервері . Потім сервер відправляє цей JWT назад клієнту, який зберігатиме його у файлі cookie або в локальному сховищі.
Подібно до цього, користувач має автентифікацію та в основному увійшов у наш додаток, не залишаючи жодного стану на сервері.
Таким чином, сервер насправді не знає, який саме користувач увійшов у систему, але, звичайно, користувач знає, що він увійшов, оскільки у нього є дійсний веб-маркер Json, який схожий на паспорт для доступу до захищених частин програми.
Тож ще раз, щоб переконатися, що ви отримали ідею. Користувач входить у систему, як тільки повертає свій унікальний дійсний Json Web Token, який не зберігається ніде на сервері. І тому цей процес є цілком бездержавним.
Потім, кожен раз, коли користувач хоче отримати доступ до захищеного маршруту, як, наприклад, дані його профілю користувача. Він надсилає свій веб-маркер Json разом із запитом, тож це схоже на те, щоб показати його паспорт, щоб отримати доступ до цього маршруту.
Після того, як запит потрапить на сервер, наша програма потім перевірить, чи дійсний веб-маркер Json і чи дійсно користувач справді той, про кого він каже, що добре, тоді запитувані дані будуть надіслані клієнтові, а якщо ні, то з'явиться бути помилкою, повідомляючи користувачеві, що він не має доступу до цього ресурсу.
Вся ця комунікація повинна відбуватися через https, тому захистіть зашифрований Http, щоб запобігти будь-якому користувачеві доступ до паролів або веб-токенів Json. Тільки тоді ми маємо дійсно безпечну систему.
Таким чином, веб-маркер Json виглядає як ліва частина цього скріншота, яка була знята з відладчика JWT на jwt.ioSo, по суті, це рядок кодування, що складається з трьох частин. Заголовок, корисне навантаження та підпис Тепер заголовок - це лише деякі метадані про сам маркер, а корисне навантаження - це дані, які ми можемо кодувати в маркер, будь-які дані, які нам дійсно потрібні. Отже, чим більше даних ми хочемо кодувати тут, тим більший JWT. У будь-якому разі, ці дві частини - це просто звичайний текст, який буде закодований, але не зашифрований.
Тож кожен зможе їх розшифрувати та прочитати , ми не можемо зберігати тут жодних конфіденційних даних. Але це зовсім не проблема, тому що в третій частині, так і в підписі, де речі дійсно стають цікавими. Підпис створюється за допомогою заголовка, корисного навантаження та секрету, який зберігається на сервері.
І весь цей процес тоді називається підписанням веб-маркера Json . Алгоритм підписання займає заголовок, корисне навантаження та секрет для створення унікальної підпису. Тож тільки ці дані плюс секрет можуть створити цей підпис, все правильно? Потім разом із заголовком та корисним навантаженням цей підпис формує JWT, який потім надсилається клієнту.
Як тільки сервер отримує JWT для надання доступу до захищеного маршруту, він повинен перевірити його, щоб визначити, чи дійсно користувач є тим, ким він претендує. Іншими словами, він перевірить, чи ніхто не змінив заголовок та дані корисного набору маркера. Отже, знову-таки цей крок перевірки перевірить, чи жодна третя сторона фактично не змінила ні заголовка, ні корисного набору веб-маркера Json.
Отже, як насправді працює ця перевірка? Ну, насправді це досить просто. Після отримання JWT верифікація прийме його заголовок та корисне навантаження та разом із секретом, який все ще зберігається на сервері, в основному створить тестовий підпис.
Але оригінальний підпис, який був створений під час першого створення JWT, все ще знаходиться в токені, правда? І ось ключ до цієї перевірки. Тому що зараз все, що нам потрібно зробити, - це порівняти тестовий підпис з оригінальним підписом. І якщо тестовий підпис такий же, як оригінальний підпис, то це означає, що корисне навантаження та заголовок не були змінені.
Бо якби вони були змінені, то тестовий підпис мав би бути іншим. Тому в цьому випадку, коли не було внесено змін до даних, ми можемо аутентифікувати користувача. І звичайно, якщо два підписи насправді різні, ну це означає, що хтось підробляє дані. Зазвичай, намагаючись змінити корисне навантаження. Але третя сторона, що маніпулює корисним навантаженням, звичайно, не має доступу до секрету, тому вони не можуть підписати JWT. Тож оригінальний підпис ніколи не буде відповідати маніпульованим даним. І тому перевірка завжди буде невдалою в цьому випадку. І це ключ до того, щоб ціла система працювала. Саме магія робить JWT таким простим, але також надзвичайно потужним.
md5('original messaged' + secret) != md5('changed message' + secret)
таким чином, якщо хтось змінить повідомлення, ви можете його виявити