JWT и токены

Тема дорожной карты · Backend разработчик

JWT-аутентификация (аутентификация с использованием JSON Web Token) — это stateless-механизм безопасной передачи данных об идентичности и правах доступа между клиентом и бэкенд-сервером в виде компактной, URL-safe строки, состоящей из трёх частей, закодированных в Base64URL: заголовка, полезной нагрузки и подписи. Бэкенд подписывает токен с использованием общего секрета через HMAC-SHA256 (HS256) или пары асимметричных ключей RSA/ECDSA (RS256, ES256), и любой сервис, владеющий публичным ключом, может проверить целостность токена без обращения к базе данных — что делает JWT-аутентификацию идеальной для stateless-микросервисов и API-шлюзов. Стандартные claims в полезной нагрузке: sub (субъект), exp (срок действия), iat (время выдачи) и пользовательские claims, такие как роли или скоупы OAuth 2.0; короткие значения exp (15–60 минут) в сочетании со стратегией ротации refresh-токенов минимизируют ущерб от кражи токена. В Node.js библиотека jsonwebtoken предоставляет методы jwt.sign() и jwt.verify(), тогда как Spring Security поддерживает JWT-аутентификацию через spring-security-oauth2-resource-server, настроенный с бином JwtDecoder, указывающим на JWKS-эндпоинт. Распространённые ошибки JWT-аутентификации: хранение токенов в localStorage (уязвимо для XSS) вместо HttpOnly-куки, принятие алгоритма none, и игнорирование проверки claim aud, когда несколько сервисов используют один и тот же ключ подписи.

Как это работает

JWT и токены включает аутентификацию (кто вы?) и авторизацию (что можете?). Современная auth: OAuth 2.0 + OpenID Connect для делегированной identity, session-куки для традиционных веб-приложений, JWT для stateless distributed-систем. Пароли всегда хешируйте через bcrypt или argon2id. CSRF-защита на state-changing endpoints; CORS осознанно (не * в production). Авторизация: RBAC (роли), ABAC (атрибуты), policy engines (OPA, Casbin). MFA/2FA для любой привилегированной операции.

Когда применять

Session-куки — для монолитных веб-приложений (HttpOnly + Secure + SameSite=Lax): проще, отзываемо, server-side state. JWT — только когда реально нужна stateless distributed-валидация; иначе session безопаснее. Identity отдавайте провайдеру (Yandex ID, Keycloak, Auth0, Authentik) — DIY identity = место утечек. Rate-limit на auth-endpoints с первого дня.

Типичные ошибки

Ловушки JWT и токены: пароли через MD5/SHA1/SHA256 (быстро, brute-force-friendly — используйте argon2id); JWT-секрет в клиентском коде или git-history; JWT без expiry или revocation list (потерянный девайс = пожизненный доступ к аккаунту); своя крипта (используйте библиотеки); admin-endpoints без auth "потому что internal" (внутренняя сеть не граница безопасности). Регулярные auth-аудиты.

Связанные понятия

Полезные ресурсы