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

96

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

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

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

foobar
источник

Ответы:

43

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

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

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

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

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

Дэвин
источник
166

Обзор

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

подробности

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

Сторона клиента

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

[sid].[signature]

Где [sid] - это идентификатор сеанса, а [подпись] создается путем подписания [sid] с использованием секретного ключа, предоставленного при инициализации промежуточного программного обеспечения сеанса. Шаг подписи выполняется для предотвращения взлома. Изменение [sid] и повторное создание [подписи] без знания используемого секретного ключа должно быть вычислительно недопустимым. Сеансовые куки по-прежнему уязвимы для кражи и повторного использования, если не требуется изменение [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
});

Вам также необходимо убедиться, что router ( 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.

Вэйлон Флинн
источник
1
при печати значения cookie с помощью console.log выдает закодированный (подписанный) cookie. как мне получить реальную информацию?
vsync
Что вы имеете в виду, говоря: «Сеансовые куки по-прежнему уязвимы для кражи и повторного использования, если не требуется изменение [sid]»? поскольку SID генерируется экспрессом, мы никогда не сможем его изменить, верно?
Хрушикеш 05
2
@WebHrushi Я думал об атаке «Человек посередине»: en.wikipedia.org/wiki/Man-in-the-middle_attack
Уэйлон Флинн
Может ли кто-нибудь помочь мне с этими вопросами: stackoverflow.com/questions/21982791/…
roundrobin
как мне создать токен для любого конкретного session_id ??
Аман Верма
9

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

Попробуйте взглянуть на этот ответ и другие материалы вики .

Хранит ли он cookie на клиенте?

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

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

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

yojimbo87
источник
Сэр, мы можем поговорить, у меня есть некоторые сомнения по поводу всего этого.
Сурадж Джайн
0

В дополнение к уже отличным ответам, вот 2 диаграммы, которые я создал, чтобы объяснить сеансы Express, их связь с файлами cookie и хранилище:

  • шоколадное печенье: шоколад
  • клубничное печенье: клубника
абернье
источник