Зміст
Коротко
JWT у Node.js часто роблять «за туторіалом»: дані в payload, довгий TTL і Base64 як «шифрування». На Dev.to — типові помилки від PII в payload до refresh без ротації та схема access + refresh.
Що сталося
Реальний кейс: розробник поклав CPF і хеш пароля в JWT. JWT — підпис, не шифрування; payload читає кожен, хто має токен.
П'ять провалів: секрети в payload, alg: none, слабкий secret, без exp, без aud/iss у мультисервісі. Refresh — у БД, з ротацією та family ID для відкликання.
Чому це важливо
Помилки JWT рідко видно в unit-тестах; їх знаходять pentest або витік логів. Refresh без ротації = довгоживучий ключ до акаунта.
На практиці
- Access 5–15 хв; refresh у httpOnly cookie.
- Явний allowlist алгоритмів у verify.
- Payload без паролів і PII.
- Одноразовий refresh + revoke family при повторному use.
Підсумок
JWT працює як stateless bearer лише з дисципліною: короткий access, ротація refresh, жодних секретів у payload.

