Назад к вопросам
Middle+
2
Оцените следующую реализацию авторизации: форма логин/пароль, бэкенд ищет пользователя в БД (таблица: id, username, password), берёт целочисленный ID и записывает его в куку с флагом HttpOnly. Что плохого в такой реализации и как её исправить?
Компании, где спрашивали
Альфа СОФТ
Ответ от нейросети
sobes.tech AI
В описанной реализации есть несколько проблем:
-
Хранение ID пользователя в куке напрямую — это небезопасно, так как куки можно подделать или украсть, и злоумышленник сможет получить доступ к чужому аккаунту, подставив чужой ID.
-
Отсутствие механизма проверки подлинности куки — нет подписи или шифрования, чтобы убедиться, что кука не была изменена.
-
Отсутствие срока жизни и защиты от повторного использования (replay attack).
-
Только HttpOnly — хорошо, но не достаточно. Нужно использовать Secure (только по HTTPS) и SameSite, чтобы ограничить доступ к куке.
Как исправить:
- Вместо хранения ID пользователя в куке, использовать сессионный идентификатор или JWT с подписью.
- Если сессии на сервере, то в куке хранить только уникальный сессионный ключ, а данные пользователя хранить на сервере.
- Если JWT, то подписывать токен секретом, чтобы нельзя было подделать.
- Обязательно использовать флаги Secure, HttpOnly и SameSite для куки.
- Добавить срок жизни сессии и механизм её обновления.
Пример с JWT:
// При успешной авторизации создаём JWT с ID пользователя
// и подписываем секретом
// На клиенте в куке хранится только JWT
// Сервер проверяет подпись и извлекает ID из токена
Таким образом, безопасность повышается, и риск подделки куки снижается.