Код-ревью Middle Криптография на практике и JWT обновлено
Ревью: проверка JWT в Node.js
Вопрос
Найдите проблемы в middleware аутентификации.
const jwt = require('jsonwebtoken');
const SECRET = 'secret';
function auth(req, res, next) {
const token = req.headers.authorization?.split(' ')[1];
const payload = jwt.decode(token);
if (!payload) return res.sendStatus(401);
req.user = { id: payload.sub, role: payload.role };
next();
}
function issue(user) {
return jwt.sign({ sub: user.id, role: user.role, email: user.email, passport: user.passport }, SECRET);
}
Коротко
Частая путаница: decode только разбирает base64, проверку делает verify. Плюс правило минимальных данных в токене и короткий срок жизни.
Что должен найти ревьюер
- Безопасностьстрока 2Секрет короткий, словарный и захардкожен: токены HS256 подделываются после офлайн-перебора. Нужен длинный случайный секрет из хранилища секретов.
- Безопасностьстрока 6
jwt.decodeне проверяет подпись: любой может прислать токен сrole: admin. Нуженjwt.verify(token, key, { algorithms: ['HS256'], audience, issuer }). - Безопасностьстрока 6Не проверяются
exp,aud,iss. - Безопасностьстрока 13Токен без срока жизни (
expiresIn): украденный токен действует вечно. - Безопасностьстрока 13В payload паспортные данные: JWT не шифруется и читается любым, кто увидит токен.
Разбор
Частая путаница: decode только разбирает base64, проверку делает verify. Плюс правило минимальных данных в токене и короткий срок жизни.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.