Код-ревью 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. Плюс правило минимальных данных в токене и короткий срок жизни.

Что должен найти ревьюер

  1. Безопасностьстрока 2
    Секрет короткий, словарный и захардкожен: токены HS256 подделываются после офлайн-перебора. Нужен длинный случайный секрет из хранилища секретов.
  2. Безопасностьстрока 6
    jwt.decode не проверяет подпись: любой может прислать токен с role: admin. Нужен jwt.verify(token, key, { algorithms: ['HS256'], audience, issuer }).
  3. Безопасностьстрока 6
    Не проверяются exp, aud, iss.
  4. Безопасностьстрока 13
    Токен без срока жизни (expiresIn): украденный токен действует вечно.
  5. Безопасностьстрока 13
    В payload паспортные данные: JWT не шифруется и читается любым, кто увидит токен.

Разбор

Частая путаница: decode только разбирает base64, проверку делает verify. Плюс правило минимальных данных в токене и короткий срок жизни.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.