Как сеансы работают в Express.js с Node.js?

Используя Express.js, сеансы просты. Мне любопытно, как они на самом деле работают.

Сохраняет ли файл cookie на клиенте? Если да, где я могу найти этот файл cookie? Если необходимо, как его декодировать?

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

Ответ 1

Я никогда не использовал Express.js, хотя, согласно их документации по теме, это звучит так:

  • Файлы cookie хранятся на клиенте с ключом (который будет использоваться сервером для извлечения данных сеанса) и хешем (который сервер будет использовать, чтобы убедиться, что данные cookie не были подделаны, поэтому, если вы попытаетесь изменить значение, cookie будет недействительным)

  • Данные сеанса, в отличие от некоторых фреймворков (например, Play Framework!), хранятся на сервере, поэтому файл cookie больше похоже на местозаполнитель сессии, чем владелец фактических данных сеанса.

  • Из здесь, похоже, что данные сеанса на сервере по умолчанию хранятся в памяти, хотя это может быть изменено на любая форма хранения реализует соответствующий API.

Итак, если вы хотите проверять вещи без определенного объекта запроса req, как вы сказали, вам нужно просто получить доступ к тому же хранилищу. В нижней части первой страницы документации содержатся подробные сведения о необходимых методах, которые необходимо реализовать хранилищу, поэтому, если вы знакомы с вашим API-интерфейсом хранения, возможно, вы можете выполнить .getAll(), если что-то подобное существует, и просмотреть данные сеанса и читать любые значения, которые вы хотите.

Ответ 2

Обзор

Express.js использует файл cookie для хранения идентификатора сеанса (с сигнатурой шифрования) в пользовательском браузере, а затем в последующих запросах использует значение этого файла cookie для получения информации о сеансе, хранящейся на сервере. Это хранилище на стороне сервера может быть хранилищем памяти (по умолчанию) или любым другим хранилищем, которое реализует необходимые методы (например, connect-redis).

Подробнее

Express.js/Connect создает 24-символьную строку Base64 с помощью utils.uid(24) и сохраняет ее в req.sessionID. Эта строка затем используется как значение в файле cookie.

Клиентская сторона

Подписанные файлы cookie всегда используются для сеансов, поэтому значение cookie будет иметь следующий формат.

[sid].[signature]

Где [sid] is sessionID и [подпись] генерируется путем подписания [sid] с использованием секретного ключа, предоставленного при инициализации промежуточного программного обеспечения сеанса. Шаг подписания делается для предотвращения несанкционированного доступа. Это должно быть сложно вычислить, чтобы изменить [sid], а затем воссоздать [подпись] без знания секретного ключа. Файл cookie сеанса по-прежнему уязвим для краж и повторного использования, если не требуется модификация [sid].

Имя этого файла cookie

connect.sid

Сторона сервера

Если обработчик происходит после промежуточного программного обеспечения cookieParser и session, он будет иметь доступ к переменной req.cookies. Это содержит объект JSON, ключи которого являются ключами cookie, а значениями являются значения cookie. Он будет содержать ключ с именем connect.sid, и его значение будет подписанным идентификатором сеанса.

Вот пример того, как настроить маршрут, который будет проверять наличие cookie сеанса на каждом запросе и печатать его значение на консоли.

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

Вам также необходимо убедиться, что маршрутизатор (app.use(app.router)) включен после cookieParser и session в разделе конфигурации.

Ниже приведен пример данных, хранящихся внутри Express.js/Connect.

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

Поле user является обычным. Все остальное является частью управления сеансом.

Пример из Express 2.5.

Ответ 3

Мне любопытно, как они на самом деле работают.

Попробуйте найти этот ответ и wiki.

Сохраняет ли файл cookie на клиенте?

Да, это обычно файл cookie с назначенным идентификатором сеанса, который должен быть подписан с тайной, чтобы предотвратить подделку.

Если да, где я могу найти этот файл cookie? Если необходимо, как его декодировать?

Вам не следует связываться с файлом cookie сеанса на стороне клиента. Если вы хотите работать с сеансами на стороне сервера, вы должны проверить связанные express.js и connect docs.