Что мешает злоумышленнику менять JWT токен
Что проверяют
Понимаете ли вы, что именно защищает JWT, а что нет. Подпись даёт целостность, но не скрывает содержимое и не отменяет кражу токена. Заодно смотрят, знаете ли вы типовые атаки на проверку и не полагаетесь ли на то, что библиотека всё сделает сама.
Как отвечать
Токен это три части через точку: заголовок, полезная нагрузка и подпись, первые две закодированы base64url. Менять содержимое злоумышленнику ничто не мешает, ему мешает получить сходящуюся подпись:
- при
HS256подпись это HMAC от первых двух частей на общем секрете, и без секрета её не пересчитать; - при
RS256иES256подписывает приватный ключ, а сервис проверяет публичным, так что даже проверяющая сторона подделать токен не может.
Сервер на каждом запросе пересчитывает подпись и сверяет, а вместе с ней проверяет exp, iss и aud. Ключевой момент: алгоритм и ключ берутся из конфигурации сервиса, а не из заголовка токена. Иначе работают две классические атаки: alg: none, когда подпись объявлена ненужной, и подмена RS256 на HS256, когда сервер честно считает HMAC на публичном ключе, известном всем. В Spring Security это значит явно настроенный декодер с заданным алгоритмом и валидаторами, а не ручной разбор строки.
Подпись не защищает от украденного токена: он валиден до exp. Отсюда короткое время жизни доступа, refresh, хранение вне localStorage и список отзыва на разлогин.
Где спотыкаются
Говорят, что полезная нагрузка зашифрована. base64url это кодирование, а не шифрование, и любой владелец токена прочитает содержимое. Персональные данные и внутренние идентификаторы туда класть не стоит, конфиденциальность даёт только отдельный слой шифрования.
Проверяют подпись, но доверяют полю alg из заголовка. Так же опасны заголовки jku и x5u: если сервис пойдёт за ключом по ссылке из токена, ключ ему подсунут. Набор алгоритмов и источник ключей фиксируются заранее.
Забывают про секрет и про сроки. Короткая строка для HS256 перебирается офлайн по одному перехваченному токену, поэтому ключ не живёт строковым литералом в репозитории. И отдельно проваливают вопрос про отзыв: у токена уволенного сотрудника подпись сходится ровно так же, пока не истечёт срок.