Borland & Factom
Привет, Боря, я тут новый модуль аутентификации изучала, нашла несколько небольших моментов, которые могут быть использованы, если не подойти к ним внимательно. У тебя есть минутка, чтобы вместе посмотреть, как там всё устроено, и поулучшить защиту?
Конечно, давай приступим. Как примерно устроено это всё? Покажи мне основные этапы: как принимаются данные для авторизации, как они проверяются, и как выдаются токены или сессионные данные. И скажи, есть ли у тебя какая-то логика или сообщения об ошибках, которые могут пропустить что-то важное. Тогда мы сможем увидеть, где есть потенциальные слабые места и как их подтянуть.
Конечно. Вот как это работает:
1. Клиент отправляет POST-запрос к `/login` с телом в формате JSON, содержащим `username` и `password`.
2. Сервер извлекает эти значения из тела запроса, хеширует предоставленный пароль тем же алгоритмом и солью, которые использовались при создании пользователя, и сравнивает хеш с тем, что хранится в базе данных.
3. Если хеши совпадают, сервер создает подписанный JWT, содержащий идентификатор пользователя и время истечения срока действия, и устанавливает его как HTTP-only, безопасное cookie под названием `auth_token`.
4. Сервер отправляет ответ 200 OK с минимальным телом в формате JSON, например `{ "status":"ok" }`, и без какой-либо информации о пользователе, кроме этого.
5. Если хеши не совпадают или пользователь не существует, сервер возвращает 401 Unauthorized с общим сообщением вроде "Неверные учетные данные".
По поводу логирования: мы записываем каждую попытку в аудит-журнал с указанием имени пользователя, IP-адреса и времени. Мы не логируем пароли или какие-либо хеши, и не раскрываем причину неудачи в ответе. Однако аудит-журнал доступен администраторам и может быть проиндексирован, что может непреднамеренно выявить закономерности неудачных входов, если не принять надлежащие меры защиты. Вот где мы можем подтянуть ситуацию: ограничить доступ к логам, возможно, добавить ограничение скорости для неудачных попыток и обеспечить шифрование логов в состоянии покоя.