Как работает JWT
JWT (JSON Web Token) — это стандарт для безопасной передачи информации между двумя сторонами в виде JSON-объекта. JWT обычно используется для аутентификации пользователей и авторизации доступа к защищенным ресурсам.
- Аутентификация пользователя: Пользователь вводит свои учетные данные (логин и пароль) на клиентской стороне приложения (например, веб-сайта или мобильного приложения).
- Проверка учетных данных: Клиентское приложение отправляет учетные данные на сервер, который проверяет их на соответствие данным, хранящимся в базе данных или другом хранилище.
- Создание JWT: Если учетные данные верны, сервер создает JSON Web Token, который содержит полезную информацию (payload), такую как идентификатор пользователя, время жизни токена и другие данные, специфичные для приложения. Затем сервер подписывает токен секретным ключом и отправляет его клиентскому приложению.
- Хранение и использование: Клиентское приложение сохраняет полученный JWT, например, в куки или в локальном хранилище. В дальнейшем, когда пользователь запрашивает доступ к защищенному ресурсу, клиентское приложение включает токен в заголовок авторизации HTTP-запроса.
- Проверка и авторизация доступа: Сервер получает JWT из заголовка авторизации и проверяет его подпись с помощью своего секретного ключа. Если подпись верна, сервер декодирует полезную информацию из JWT и использует ее для определения, имеет ли пользователь право доступа к запрашиваемому ресурсу. Если доступ разрешен, сервер предоставляет клиентскому приложению доступ к защищенному ресурсу.
- Обновление или аннулирование: JWT обычно имеет ограниченное время жизни (например, один час). После истечения срока действия токена клиентскому приложению может потребоваться запросить новый, выполнив повторную аутентификацию или используя обновление токена (refresh token), если сервер поддерживает такую функциональность. Если пользователь хочет выйти из системы или аннулировать свой JWT, клиентское приложение может просто удалить сохраненный токен.
Этот процесс позволяет обеспечить безопасность и контроль доступа к ресурсам приложения с минимальными накладными расходами и относительной простотой реализации.
JWT состоит из трех основных частей, разделенных точками:
- Заголовок (Header): Заголовок обычно состоит из двух частей: типа токена (обычно «JWT») и алгоритма подписи (например, «HS256» или «RS256»). Заголовок закодирован в формате Base64Url.
- Payload (Тело): Payload содержит набор заявлений (claims), которые предоставляют информацию о пользователе и другие данные. Claims бывают зарегистрированными (предопределенными), общедоступными (пользовательскими) и приватными (специфичными для приложения). Payload также закодирован в формате Base64Url.
- Подпись (Signature): Подпись создается путем объединения закодированных заголовка и payload, а также секретного ключа с использованием алгоритма, указанного в заголовке. Подпись обеспечивает целостность и неприкосновенность JWT, предотвращая его подделку или изменение.
Когда сервер проверяет полученный JWT, он выполняет следующие действия:
- Разделяет токен на заголовок, payload и подпись.
- Кодирует заголовок и payload в формате Base64Url и соединяет их.
- Использует тот же алгоритм подписи и свой секретный ключ, чтобы создать новую подпись на основе полученных заголовка и payload.
- Сравнивает созданную подпись с полученной подписью. Если они совпадают, это означает, что JWT является действительным и не был подделан или изменен.
Использование JWT позволяет приложениям легко и безопасно обмениваться информацией о пользователях, обеспечивая аутентификацию и авторизацию доступа к ресурсам без необходимости передачи учетных данных или хранения сеансов на сервере