JWT
Тема дорожной карты · Node.js
JSON Web Tokens (JWT) — это компактный, URL-безопасный способ представления утверждений между двумя сторонами в виде подписанной JSON-полезной нагрузки, широко используемый в серверных приложениях Node.js для stateless-аутентификации и авторизации. JWT состоит из трёх частей, закодированных в Base64URL — заголовок, полезная нагрузка и подпись — разделённых точками; сервер Node.js подписывает токен с помощью секрета (HMAC-SHA256) или приватного ключа (RSA/ECDSA), используя npm-пакет jsonwebtoken через jwt.sign(payload, secret, { expiresIn: '1h' }), и верифицирует входящие токены через jwt.verify(token, secret). В Express.js API аутентификация на основе JWT обычно реализуется в виде middleware, которое извлекает токен из заголовка Authorization: Bearer <token>, верифицирует его подпись и срок действия, и прикрепляет декодированные утверждения к req.user для последующих обработчиков маршрутов. JWT являются stateless — серверное приложение Node.js не нуждается в хранении данных сессии в базе данных или кэше — однако это означает, что отзыв токенов требует дополнительных механизмов, например короткого expiresIn в сочетании со стратегией ротации refresh-токенов. Безопасное хранение JWT на стороне клиента (в куках HttpOnly, а не в localStorage) и обязательная проверка заголовка alg для предотвращения атак подмены алгоритма — критически важные практики безопасности JWT для серверных разработчиков Node.js.
Как это работает
JWT имеет слои: валидация input (zod, ajv) на границе, параметризованные SQL-запросы, эскейп пользовательского контента в HTML (или templating engine с авто-эскейпом), HTTPS везде (терминируется на reverse proxy), секреты в env (не в репо), правильные флаги JWT/cookie (HttpOnly, Secure, SameSite). Middleware helmet добавляет разумные HTTP-заголовки (HSTS, X-Frame-Options, CSP).
Когда применять
Security-baseline с первого дня: rate-limit на auth-эндпойнтах, лимит размера body, хеш паролей через bcrypt/argon2, подпись JWT сильным секретом + короткий TTL, валидация каждого input. npm audit в CI с гейтом на high/critical. OWASP ASVS — как чек-лист при планировании. Penetration test перед публичным запуском — bug bounty дешевле инцидентов.
Типичные ошибки
Ловушки JWT: игнор CVE в зависимостях (каждый — потенциальный инцидент); JWT-секрет утёк в клиентский код или git-history; SQL-инъекция, потому что кто-то забыл параметр (SELECT * FROM u WHERE id = ${req.query.id} — никогда); eval или Function() на user-input; пароли в MD5/SHA1 (используйте argon2id с правильными параметрами). Security — это процесс, не разовый аудит.