JWT (JSON Web Token) - це відкритий стандарт (RFC 7519), який визначає компактний та самодостатній спосіб безпечної передачі інформації між сторонами. Ця інформація може бути перевірена та довірятися, оскільки вона цифрово підписана.
JWT складається з трьох частин, розділених крапками (.) : заголовок (Header), навантаження (Payload) та підпис (Signature). Заголовок визначає алгоритм підпису, навантаження містить заяви, а підпис використовується для перевірки того, що повідомлення не було змінено.
Поширені сценарії використання JWT
Аутентифікація (найпоширеніший сценарій), обмін інформацією (JWT можуть безпечно передавати інформацію, оскільки вони можуть бути підписані), авторизація (містить інформацію про права користувача) та реалізація єдиного входу.
JWT підтримує різні алгоритми підпису, які в основному поділяються на дві категорії: симетричні алгоритми на основі HMAC (наприклад, HS256) та асиметричні алгоритми на основі RSA/ECDSA (наприклад, RS256, ES256). Симетричні алгоритми використовують той самий ключ для підпису та перевірки, асиметричні алгоритми використовують приватний ключ для підпису та публічний ключ для перевірки.
Не зберігайте конфіденційну інформацію (наприклад, паролі) у JWT, оскільки навантаження JWT лише кодується в Base64, а не шифрується. Для додатків, що вимагають високого рівня безпеки, рекомендується використовувати короткий термін дії та впроваджувати стратегію ротації токенів.
Що робити, коли JWT закінчується?
Коли JWT закінчується, сервер відхилить цей токен. Рекомендований спосіб обробки - це реалізація механізму оновлення токена (Refresh Token), коли клієнт використовує токен оновлення для отримання нового токена доступу, не вимагаючи від користувача повторного входу. Токени оновлення зазвичай мають більший термін дії, але їх слід зберігати обережно.
Строго кажучи, JWT розроблені як токени без стану, і їх неможливо справді скасувати. Однак існує кілька поширених рішень: підтримка чорного списку скасованих токенів (що може звести нанівець переваги JWT без стану), використання короткого терміну дії разом із токенами оновлення або вбудовування ідентифікатора версії в токен, щоб сервер міг відхиляти старі версії.
Відмінності між JWT та сесією?
JWT - це самодостатні токени, які містять усю необхідну інформацію, підходять для розподілених систем і не потребують зберігання стану сесії на сервері. Сесії базуються на зберіганні на стороні сервера, потребують підтримки стану сесії і більше підходять для однопотокових архітектур. JWT більш дружні до масштабування, але скасування складніше; сесії легко скасувати, але вони менш масштабовані.