Что такое JWT и как он работает
Что проверяют
Понимаете ли вы, что токен подписан, а не зашифрован, и знаете ли главную проблему: его нельзя отозвать.
Как отвечать
JWT это строка из трёх частей через точку: заголовок, полезная нагрузка и подпись, каждая в base64url.
- заголовок: алгоритм подписи и тип;
- нагрузка: утверждения о пользователе. Стандартные поля
sub,exp,iat,iss,audплюс свои; - подпись: HMAC от первых двух частей секретом (HS256) или подпись приватным ключом (RS256).
Как проверяется: сервер пересчитывает подпись и сравнивает. Совпала, значит содержимое не меняли, и в базу за пользователем ходить не надо. Это и есть смысл: сервер не хранит состояние сессии, поэтому масштабируется горизонтально.
Ключевое, что обязательно назвать: нагрузка не зашифрована. Любой может декодировать base64 и прочитать её. Класть туда пароли или персональные данные нельзя.
Вторая проблема: токен нельзя отозвать, он действителен до истечения срока. Отсюда стандартная схема: короткоживущий токен доступа (минуты) плюс долгоживущий refresh-токен, который хранится на сервере и потому отзывается. Для мгновенного отзыва заводят чёрный список, но это возвращает состояние, ради отсутствия которого JWT и брали.
Про хранение на клиенте: localStorage уязвим при межсайтовом скриптинге, cookie с HttpOnly безопаснее, но требует защиты от подделки межсайтового запроса.
Где спотыкаются
Считают JWT зашифрованным.
Не проверяют алгоритм и уязвимы к подмене на none или к подстановке HS256 вместо RS256.
Делают токен доступа на месяц и не могут разлогинить пользователя.
Хранят в токене изменяемые права, которые устаревают до истечения срока.