Как обрабатывать параллельные запросы от одного и того же пользователя в NodeJS?
Например:
app.post('/login', (req, res) => {
// I want to check.
// If we are already authenticating this user from the given IP(or fingerprint).
// then res.send('Authentication already in progress');
});
Меня интересует, как правильно обработать запрос в такие моменты. Я читаю "Secure your NodeJS WEB application - Karl Duuna". Он приводит такой пример:
// Map our authentications
var inProgress = {};
app.post('/login', function (req, res, next) {
var key = req.ip + ':' + req.body.username;
// check if we are already authenticating this user from the given IP
if(inProgress[key]) {
req.session.error = 'Authentication already in progress';
res.redirect('/');
return;
}
inProgress[key] = true;
И т.д.
Но конечно не советует хранить inProgress в памяти приложения.
Тогда можно ли например сделать отдельную коллекцию в mongodb, которая будет хранить документы вида:
inProgress: true,
fingerprint: some_string_id
И в коде написать (псевдокод):
app.post('/login', async (req, res) => {
// Если запрос на аутентификацию уже был и еще не отработан, редиректим
// основываемся например на fingerprint-е
if(in_progress(fingerprint)){
res.redirect('/login', { errors: ['Authentication already in progress'] });
return;
}
// Если параллельно никто никаких запросов на аутентификацию не делал
// добавляем in_progress документ в mongodb
// после обработки запроса, обязательно удаляем из базы данных
in_progress[inProgress] = true;
in_progress[fingerprint] = some_string_id;
Или все это слишком намудрено и будет большая нагрузка на сервер и БД? Или может вообще в NodeJS такое не надо делать? Но если не надо делать, почему в довольно популярной книге (по secure теме и NodeJS), говорится о том, что мы должны обрабатывать такие параллельные запросы?
намудрено не слишком, вместо монго можете взять что-то более подходящее, например redis. нагрузка будет небольшая, не больше чем ходить в базу за данными для запроса в обычном сценарии.
Но основной вопрос который вы должны найти в книге - зачем вообще так делать, с какой проблемой это призвано справиться. Потом посмотреть актуально ли это для вас и стоит ли оно затраченных усилий.
Спасибо за ответ. В книге говорится, что такое надо делать, чтобы: "However, the delay mechanism won’t stop attackers from running parallel checks about a user’s account. We can fix that problem, though...This will stop brute-force"
nosok12, звучит разумно, если хотите защититься от такой атаки то никаких проблем делать то что вы описали нет. Разве что нужно будет нагрузочное тестирование провести, чтобы не сделать возможность dos