🪪 JWT: Маленький токен, который разбудил безопасников

Кратко: JWT (JSON Web Token) — это строковый «пропуск», который доказывает, что вы — это вы. Сервер выдаёт вам токен при входе. Вы показываете этот токен при каждом запросе. Сервер проверяет подпись и пускает внутрь. Токен нельзя подделать, но можно украсть. В JWT нет ничего плохого. Плохо то, как их иногда используют.

▫️ Как это работает JWT состоит из трёх частей, разделённых точками: · Header — алгоритм подписи (HS256, RS256) и тип токена · Payload — полезная нагрузка: user_id, role, время жизни токена (exp) · Signature — подпись, которая скрепляет первые две части Без подписи токен — это просто base64-строчка, которую можно изменить. С подписью любое изменение делает токен недействительным.

▫️ Почему разработчики любят JWT · Stateless (без сессий): Серверу не нужно хранить сессии в БД или Redis. Достаточно иметь ключ для проверки подписи. Микросервисы: Сервис авторизации подписал токен, а десять других сервисов проверяют подпись — без лишних сетевых вызовов. Кроссплатформенность: Работает везде, где есть JSON и base64.

▫️ Уязвимости (то, за что их ругают) Хранение в localStorage: Разработчик кладёт токен туда — XSS (внедрение чужого скрипта) крадёт токен. Хакер забирает ваш пропуск и заходит под вами. Алгоритм None: Злоумышленник меняет в заголовке алгоритм на none, удаляет подпись, оставляя пустую строку. Сервер, если не проверяет, принимает подделку. HS256 vs RS256: HS256 — один секрет shared между всеми сервисами. Утечёт секрет из одного — упала вся система. RS256 — пара ключей (приватный подписывает, публичный проверяет).

▫️ CSRF (миф о защите) JWT не защищает от CSRF автоматически. Если токен хранится в куках без флага SameSite — злоумышленник подставит форму на своём сайте и отправит запрос от вашего имени. Храните токен в памяти JavaScript или в куках с SameSite=Strict.

▫️ Как хранить JWT безопасно · Память JavaScript (переменная): Устойчив к CSRF, но не переживает перезагрузку страницы. · Куки с флагом HttpOnly: Не доступны для кражи через XSS. Требуют защиты от CSRF — SameSite=Strict и анти-токены. · Куки с SameSite=Strict: Защита от CSRF из коробки.

▫️ Современное положение (2026) JWT не умер, но уже не моден. Тренды 2026: · Короткое время жизни (15 минут) + refresh-токен: Долгоиграющий токен живёт в базе данных, а короткий живёт в памяти. · Клеймор с сессиями: Крупные компании возвращаются к сессиям в Redis, потому что проще принудительно отозвать доступ пользователя. · mTLS: В микросервисах взаимный TLS (mTLS) заменяет JWT — ещё безопаснее, но сложнее.

▫️ Пример JWT глазами eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJ1c2VyX2lkIjoxMjMsInJvbGUiOiJhZG1pbiIsImV4cCI6MTczNTY4OTAwMH0. sF9kLq3gN2L5n7V9pQ1rT3wY5uI7oP0qR2sT4vW6xY8

Точки разделяют три части. Второй блок — base64 полезной нагрузки. Декодируйте в консоли:

echo “eyJ1c2VyX2lkIjoxMjMsInJvbGUiOiJhZG1pbiIsImV4cCI6MTczNTY4OTAwMH0=” | base64 -d

Получите JSON: {“user_id”:123,“role”:“admin”,“exp”:1735689000}. Не доверяйте токенам, которые не проверили подпись. Не храните секреты в localStorage, если не уверены в защите от XSS. Если не понимаете, как работает JWT, лучше используйте обычные сессии.

#jwt #jsonwebtoken #веббезопасность #инфобез #аутентификация #токены #owasp

🪪 JWT: Маленький токен, который разбудил безопасников | Сетка — социальная сеть от hh.ru