Гид по технологиям

Сессии в Express: как настроить на Node.js

7 min read Node.js Обновлено 09 Jan 2026
Сессии в Express на Node.js — руководство
Сессии в Express на Node.js — руководство

13-дюймовый MacBook Pro в домашнем офисе

Что вам потребуется

Чтобы пройти этот пример, у вас должны быть установлены Node.js и npm. Любая современная версия Node.js содержит npm — менеджер пакетов для установки зависимостей.

Мы будем использовать npm для установки Express и express-session — библиотек для создания веб-сервера и работы с сессиями.

Что такое сессия в Node.js?

Коротко: кука — это маленький файл в браузере для хранения не чувствительных данных (например, настроек интерфейса). Сессия — это механизм хранения пользовательских данных на сервере. Сессии позволяют серверу «помнить» состояние между запросами.

Определение: сессия — хранилище состояния на сервере, связанное с уникальным идентификатором, который клиент хранит в куке.

Почему не хранить всё в куках:

  • Куки отправляются по сети и могут быть перехвачены при некорректной конфигурации.
  • Куки хранятся в явном виде на устройстве клиента.
  • Куки подходят для небольших, не чувствительных данных.

Сессии лучше использовать для чувствительной информации (идентификатор пользователя, токены доступа, корзина покупок и т. д.), потому что данные физически остаются на сервере.

Создание сессии в Express

Express — популярный фреймворк для Node.js. Он упрощает создание API, маршрутов и подключение middleware. Ниже приведён пошаговый пример настройки простого приложения со сессиями.

1. Создание проекта Node.js

Создайте новую папку проекта, затем в командной строке перейдите в неё и выполните:

npm init -y

Это создаст package.json с настройками по умолчанию.

2. Установка Express и express-session

Установите зависимости:

npm i express express-session

3. Простой пример приложения с сессиями

Создайте файл App.js в корне проекта и импортируйте зависимости. Обратите внимание: важно подключить парсер тела запроса express.json(), иначе req.body будет undefined.

const express = require('express')
const session = require('express-session')
const app = express()

// Парсер JSON в теле запроса
app.use(express.json())

// Простая регистрация session middleware
app.use(
  session({
    secret: "some secret",
    cookie: { maxAge: 30000 },
    saveUninitialized: false,
    resave: false
  })
)

Пояснения:

  • secret — строка для подписи идентификатора сессии.
  • cookie.maxAge — время жизни куки в миллисекундах (в примере 30000 = 30 секунд).
  • saveUninitialized: false предотвращает создание сессии до момента, пока вы явно её не измените. Это важно для логина.
  • resave: false предотвращает перезапись сессии, если она не изменялась.

Далее добавим маршрут входа:

app.post("/login", (req, res) => {
  const { username, password } = req.body;

  if (username && password) {
    if (req.session.authenticated) {
      res.json(req.session);
    } else {
      if (password === "123") {
        req.session.authenticated = true;
        req.session.user = { username };
        res.json(req.session);
      } else {
        res.status(403).json({ msg: "Bad credentials" });
      }
    }
  } else {
    res.status(403).json({ msg: "Bad credentials" });
  }
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

Примечание: в примере проверка пароля — демонстрационная. В реальном приложении используйте хеширование и безопасную аутентификацию.

Как тестировать

Пример запроса через любой HTTP-клиент (Rest Client, curl, Postman):

POST http://localhost:3000/login HTTP/1.1
Content-Type: application/json

{ "username": "Kingsley", "password": "123" }

Ожидаемый ответ (сервер вернёт объект с данными сессии):

{
  "cookie": {
    "originalMaxAge": 30000,
    "httpOnly": true,
    "path": "/"
  },
  "authenticated": true,
  "user": {
    "username": "Kingsley"
  }
}

Важно: пример выше хранит минимально необходимые данные. Никогда не храните необработанные пароли в сессии.

Когда сессии подходят, а когда нет

Когда использовать сессии:

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

Когда сессии не подходят:

  • Приложение полностью статeless (REST API для публичного использования).
  • Масштабируемая архитектура без общего хранилища сессий (требуются внешние store или токены).
  • Если вы хотите чтобы сервер был полностью без состояния — используйте JWT или токены.

Альтернативы и сочетания

  • JWT (JSON Web Tokens): хорошо для stateless-аутентификации и микросервисной архитектуры. Токен хранит данные в зашифрованном/подписанном виде.
  • Token-based (краткоживущие токены доступа + refresh tokens).
  • Sticky sessions на балансировщике: быстрый способ сохранить сессии без внешнего хранилища, но усложняет устойчивость и масштабирование.
  • Внешние stores (Redis, Memcached, базы данных): рекомендуемый вариант для продакшена.

Хранилища сессий и масштабирование

express-session по умолчанию хранит сессии в памяти процесса. Это нормально для разработки, но неприемлемо в продакшне по нескольким причинам:

  • Память ограничена.
  • При релоде сервера все сессии пропадают.
  • Нельзя горизонтально масштабировать (несколько инстансов не разделяют память).

Рекомендации для продакшена:

  • Используйте совместимый store, например connect-redis для Redis.
  • Настройте время жизни (TTL) и очистку устаревших сессий.
  • Следите за нагрузкой и латентностью хранилища.

Пример конфигурации с Redis (фрагмент):

const RedisStore = require('connect-redis')(session)
const redisClient = require('redis').createClient()

app.use(
  session({
    store: new RedisStore({ client: redisClient }),
    secret: 'prod secret',
    resave: false,
    saveUninitialized: false,
    cookie: { secure: true, httpOnly: true, sameSite: 'lax', maxAge: 24 * 60 * 60 * 1000 }
  })
)

Безопасность и харднинг сессий

Важно защитить сессии. Ключевые меры:

  • Всегда используйте HTTPS в продакшене (cookie.secure = true).
  • Устанавливайте httpOnly для куки, чтобы скрипты в браузере не могли читать идентификатор сессии.
  • Используйте sameSite (Lax или Strict) для защиты от CSRF.
  • Храните секреты вне репозитория (переменные окружения).
  • Ограничьте время жизни сессии и реализуйте тайм-аут неактивности.
  • Для критичных приложений используйте привязку сессии к IP или user-agent с осторожностью (может ухудшить UX).

Критерии приёмки

  • Сервер создаёт и возвращает sessionID в куке после успешного логина.
  • При повторном запросе в течение таймаута сессия восстанавливается и сервер идентифицирует пользователя.
  • Сессии хранятся во внешнем store при деплое на несколько инстансов.
  • Куки имеют флаги secure, httpOnly и sameSite в продакшен-конфигурации.

Ролевые чеклисты

Разработчик:

  • Подключил express.json() и session middleware.
  • Не сохраняет пароли в явном виде в сессии.
  • Добавил тесты на создание/удаление сессий.

Оперейшнс (DevOps):

  • Настроил Redis/Memcached как store для сессий.
  • Обеспечил резервирование и мониторинг latency/throughput.
  • Убедился, что HTTPS включён и секреты в окружении.

Команда безопасности:

  • Проверила cookie-флаги и политику истечения.
  • Провела аудит доступа к хранилищу сессий.

Инцидентный план и откат

Если store сессий недоступен:

  1. Переключите трафик на режим read-only или включите уведомление для пользователей о временном выходе из системы.
  2. Перезапустите клиент Redis/кластер по процедурам отказоустойчивости.
  3. Если проблема долгая, активируйте fallback: краткосрочные токены доступа с ограниченными правами.
  4. После восстановления сравните логи и при необходимости инвалидацию сессий.

Откат: если новая конфигурация store даёт ошибку, откатитесь к предыдущему релизу и восстановите доступ к старому store.

Тесты и критерии приёмки

Тесты, которые стоит иметь:

  • Создание сессии после /login: возвращается cookie и объект сессии.
  • Обновление сессии: после изменения данных сессии они доступны в следующем запросе.
  • Истечение сессии: после истечения maxAge доступ закрыт.
  • Поведение при отсутствии session store: приложение корректно обрабатывает ошибки.

Короткая методология внедрения (mini-playbook)

  1. Настройте express.json() и базовый express-session с saveUninitialized: false и resave: false.
  2. Тестируйте локально (memory store).
  3. Добавьте автоматические тесты на авторизацию и восстановление сессии.
  4. Внедрите внешнее хранилище (Redis) и протестируйте при нагрузке.
  5. Настройте HTTPS и cookie-флаги.
  6. Мониторьте latency и частоту ошибок доступа к store.

Примеры ошибок и как их исправлять

Проблема: req.body === undefined
Решение: добавить app.use(express.json()) перед использованием req.body.

Проблема: сессии теряются при перезапуске сервера
Решение: используйте внешний store вместо in-memory.

Проблема: кука не устанавливается в браузере на HTTPS
Решение: убедитесь, что cookie.secure = true и вы используете HTTPS; в локальной разработке можно временно отключить secure.

Примечания по GDPR и приватности

  • Храните только необходимые персональные данные в сессии.
  • Реализуйте политику удаления устаревших сессий.
  • Документируйте, какие поля сохраняются и зачем.
  • Предоставьте пользователям механизм выхода и удаления сессии.

Краткая галерея альтернатив и когда выбирать

  • Простой сайт с минимальной логикой: сессии в памяти допустимы для разработки.
  • API для мобильных клиентов: токены доступа / refresh-токены.
  • Высоконагруженный сайт с множеством инстансов: Redis + экспирация + мониторинг.

Однострочный глоссарий

  • Сессия: серверное хранилище состояния, связанное с sessionID в куке.
  • Кука: маленькое значение, которое браузер отправляет на сервер.
  • Store: внешний механизм хранения сессий (Redis, Memcached, БД).

Социальный превью и краткое объявление

OG Title: Как настроить сессии в Express (Node.js)

OG Description: Пошаговое руководство: express-session, безопасные настройки куки, масштабирование через Redis и практические чеклисты.

Краткое объявление (100–200 слов): Используйте сессии, чтобы хранить состояние пользователей на сервере и улучшить взаимодействие в вашем Node.js-приложении. В статье описаны базовая настройка express-session, важные флаги cookie, тестирование маршрутов входа, а также рекомендации для продакшена: подключение Redis, меры безопасности и план действий при отказах. Примеры кода и чек-листы помогут быстро внедрить устойчивую и безопасную систему сессий.

Итог

Сессии — удобный и безопасный способ хранить пользовательские данные на сервере, если правильно настроить cookie и выбрать подходящий store. Для разработки можно стартовать с встроенного поведения express-session, но для продакшена следует выбирать внешнее хранилище, HTTPS и строгие cookie-флаги.

Важно: всегда тестируйте поведение при истечении сессий и сценарии отказа хранилища.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Градиенты в Canva: добавить и настроить
Дизайн

Градиенты в Canva: добавить и настроить

Ошибка Disabled accounts can't be contacted в Instagram
Социальные сети

Ошибка Disabled accounts can't be contacted в Instagram

Генерация случайных чисел в Google Sheets
Google Таблицы

Генерация случайных чисел в Google Sheets

Прокручиваемые скриншоты в Windows 11
Windows

Прокручиваемые скриншоты в Windows 11

Как установить корпусной вентилятор в ПК
Железо

Как установить корпусной вентилятор в ПК

Check In в iOS 17: настройка и безопасность
How-to

Check In в iOS 17: настройка и безопасность