JSON Web Token (JWT) — это компактный, безопасный для URL-адресов способ передачи данных между сторонами в формате JSON.
Принципы работы:
-
Токен состоит из трех частей, разделенных точками (.): header.payload.signature.
-
Header (Заголовок): Содержит метаинформацию о токене, такую как тип токена (JWT) и используемый алгоритм подписи (например, HS256, RS256).
json
-
Payload (Нагрузка): Содержит "claims" - утверждения или информацию, которую мы хотим передать. Бывает нескольких типов:
- Registered claims: Зарезервированные, но опциональные Claims, такие как
iss (издатель), exp (срок действия), sub (тема).
- Public claims: Определяются для публичного использования, должны быть зарегистрированы в IANA JSON Web Token Registry или быть URI, содержащим пространство имен, защищенное от коллизий.
- Private claims: Произвольные утверждения, согласованные между сторонами.
json
-
Signature (Подпись): Создается путем комбинирования кодированных заголовка и нагрузки с использованием секрета и алгоритма, указанного в заголовке. Это обеспечивает целостность токена - если кто-то изменит заголовок или нагрузку, подпись будет недействительной.
python
Применение:
- Авторизация: Сервер выдает токен пользователю после успешной аутентификации. Пользователь отправляет этот токен с каждым запросом. Сервер проверяет валидность токена и разрешает доступ к ресурсам.
- Обмен информацией: Безопасная передача небольших объемов данных между различными сервисами.
Преимущества:
- Компактность: Меньше данных для передачи по сравнению с XML.
- Самодостаточность: В токене уже содержится необходимая информация о пользователе, что уменьшает необходимость обращаться к базе данных при каждом запросе.
- Stateless: Серверу не нужно хранить информацию о сессии на своей стороне.
- Криптографическая подпись: Обеспечивает целостность данных.
Недостатки:
- Невозможно отозвать токен: После выдачи токен действует до истечения срока его действия, если не реализован механизм черных списков.
- Хранение секрета: Секретный ключ должен храниться безопасно.
- Размер: С ростом объема данных в
payload увеличивается размер токена.