Если вы устали от использования passport.js (или любой другой библиотеки) в своих проектах веб-приложений и хотите самостоятельно реализовать аутентификацию пользователей, вы, вероятно, уже встречали термин JWT. В этой статье объясняются основы структуры JWT и то, как она была искусно реализована, чтобы пользователь не мог изменить токен.

JWT или JSON Web Token — это способ заменить сеанс на веб-серверах. Он содержит идентификатор пользователя, необходимый для поиска пользователя в базе данных. Когда пользователь отправляет запрос на вход на сервер, сервер аутентифицирует его и отправляет пользователю строку JWT. Позже, если пользователь снова попытается получить доступ к тому же серверу, строка JWT будет автоматически отправлена ​​на сервер, и сервер аутентифицирует пользователя без необходимости повторного ввода пароля.

Структура JWT

JWT состоит из трех частей, разделенных точками.

Первая часть (красная) называется Заголовок и содержит метаданные о токене.

Вторая часть (фиолетовая) называется Полезная нагрузка. Это фактическое содержимое, и оно должно содержать информацию для поиска пользователя. Обычно sub обозначает тему и относится к идентификатору пользователя.

Третья часть (синяя) называется Проверка подписи. Это часть безопасности, которая позволяет вам убедиться, что пользователь не изменил JWT.

Целостность данных

Проверочная подпись токена JWT была по сути результатом хэша (Заголовок+ «.» +Полезная нагрузка) с секретным ключом.

В этом случае первыми входными данными хэш-функции являются “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ”+payload+payload.

И используемый ключ — «mykey» (обратите внимание, что хэш необратим, и поэтому секретный ключ не будет получен пользователями).

Результатом является Проверка подписи токена JWT.

Когда ваш сервер получает токен JWT от клиента, он повторяет процесс хэширования комбинации заголовка и полезной нагрузки токена с помощью тот самый ключ. Если результирующая строка хэша такая же, как Проверка подписи строки JWT, это означает, что строка JWT не была изменена пользователем. Это связано с тем, что одни и те же входные данные хеширования (заголовок + "," + полезная нагрузка и секретный ключ) приводят к одинаковым результатам хеширования. Наоборот, если JWT изменен, результирующая хэш-строка не будет равна Verify Signature строки JWT.

Надеюсь, эта статья поможет :).