JWT¶
JSON Web Token, или просто JWT, представляет собой строку, полученную на основе формата JSON, и используется в качестве более безопасной и простой альтернативы сессиям и файлам cookie для авторизации.
JWT позволяет уйти от хранения данных авторизованного пользователя на сервере и возлагает на сервер только задачу по верификации подписи.
JWT формируют три части:
- заголовок (
header
); - данные (
payload
); - подпись (
signature
).
Заголовок представляет собой объект JSON и описывает сам токен с помощью следующих свойств:
alg
- алгоритм шифрования, используемый для подписи JWT, если токен не подписывается, то значением должно бытьnone
(обязательный параметр);typ
- тип токена, необходимо указывать со значением "JWT", если могут использоваться токены другого типа (необязательный параметр);ctp
- тип данных, необходимо указывать со значением "JWT", если в payload присутствуют пользовательские ключи.
В данных, которые также передаются объектом JSON, указывается необходимая информация о пользователе. Также возможно задание значений предопределенных ключей (все они не обязательны) для описания конфигурации токена:
iss
- приложение, создавшее токен;sub
- назначение JWT;aud
- массив получателей токена;exp
- дата и время, указанное в миллисекундах, прошедших с 01.01.1970, до наступления которого JWT будет валиден;nbf
- дата и время, указанное в миллисекундах, прошедших с 01.01.1970, до наступления которого JWT будет не валиден;iat
- дата и время создания JWT, указанное в миллисекундах, прошедших с 01.01.1970;jti
- уникальный идентификатор токена.
Заголовок и данные используются для вычисления значения подписи по указанному в заголовке в свойстве alg
алгоритму шифрования.
Далее формируется сам JWT.
1 |
|
Сгенерированный JWT отправляется клиенту, где он сохраняется в localStorage
или sessionStorage
, и будет отправляться клиентом серверу при каждом HTTP запросе в заголовке Authorization
.
1 |
|
Сервер в свою очередь при обращении к маршрутам, требующих авторизации, извлекает данные из токена и проверяет валидность токена и наличие указанного в JWT пользователя.
Рассмотрим пример использования в Node.js JWT.
users.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
|
В приведенном примере при вводе логина и пароля пользователя отправляется запрос на авторизацию. Если логин и пароль верны, создается JWT и отправляется клиентской стороне. При любом следующем запросе на маршруты, требующие авторизации, будет выполняться проверка в функции промежуточной обработки на валидность токена.
Для экономии времени и избежания реализации собственного алгоритма формирования в Node.js JWT можно использовать npm модуль jsonwebtoken
.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|