Express sessions [для чего использовать хранилища для сессии по типу redis, session-mysql-store?]

Доброго времени суток. Подскажите пожалуйста, для чего использовать хранилища для сессии по типу redis, session-mysql-store и тд. Если сессия и так может хранить в себе значения ? Я написал небольшое приложение, при логине пользователя я создаю свйоство в сесии req.session.name == Вася и оно без проблем сохраняется даже после перезагрузки страницы, или я что-то не понял ? Спасибо огромное если кто нибудь объяснит.

Память (оперативная) используется как хранилище сессии по умолчанию. Это означает что если перезагрузить сервер то всем пользователям придется перезалогиниваться. Чтобы не нужно было перезалогиниваться после рестарта сервера нужно использовать persistent хранилище для данных сессии (файловую систему, базу данных).

Второй случай когда нужно использовать всякие редисы, когда у тебя приложение - это куча веб серверов как отдельные сервера, на которые load-balancer перераспределяет поток запросов от клиентов. Load balancer может два последовательных запроса одного пользователя перекинуть разным веб серверам, и каждый веб сервер должен знать про сессию чтобы пользователь был корректно авторизован. Получается что хранить информацию о сессии в памяти или на диске одного сервера не резонно, ибо другие сервера не имеют доступа к этой информации. Нужно хранить информацию в месте где она доступна другим серверам, например на сервера базы данных, к которому имеют доступ другие сервера.

1 лайк

Спасибо огромное за ответ. То-есть использовать хранилища не обязательно? Но если сервер упадет удалятся и все переменные сессий у людей? напрмиер (товары в корзине и тд) ?

Не обязательно. Но ты увидишь что даже при разработке муторно когда сессия слетает после перезапуска сервера. Очень советую использовать что-то что будет хранить сессии между рестартами (база, файлы).

Упадет, рестартанет (например после свежего делоя).

1 лайк

Спасибо большое за объяснение. Читал где-то, что другой пользователь может перезаписать существующую сессию. Типо сессия без использования хранилища одна для всех или что-то такое.
Это правда? Типо если я залогиню одного юзера и запишу в сессию его имя, следующий юзер который залогинится перезапишет это имя на своё, или это бред ? Все сессии хранятся индивидуально для каждого ?

Очень маловероятно.


я тут почитал что именно пишут про in-memory сессии:

Warning The default server-side session storage, MemoryStore , is purposely not designed for a production environment. It will leak memory under most conditions, does not scale past a single process, and is meant for debugging and developing.


Говорят что память будет течь (т.е. со временем вся оперативка забъется данными из сессий без высвобождения).

1 лайк

Ох, еще заметил такую вещь, как только мы устанавливаем сесиию у нас в браузере ставится кука, но если мы её просто скопируем и вставим в другом браузере то получим залогиненого пользователя на другом браузере, это нормально? Как защитится от этого ?

Тебе нужны http cookie (куки которые можно читать только на сервере) + https и аттрибут “Secure”. Смотри что написано в статье рядом со строкой Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly.

Там появляются другие нюансы когда ты начинаешь применять эти куки - например настройка ssl для хоста на котором ты разрабатываешь код, или флаг чтобы включить-отключить секьюрность во время разработки.

Тут еще хорошая инфа как подходить к секьюрности к кукам сессии https://expressjs.com/en/advanced/best-practice-security.html#use-cookies-securely

2 лайка