Як сеанси працюють у Express.js з Node.js?


96

За допомогою Express.js сеанси просто прості. Мені цікаво, як вони насправді працюють.

Чи зберігає воно на файлі cookie клієнта? Якщо так, де я можу знайти це печиво? Якщо потрібно, як це розшифрувати?

Я в основному хочу мати можливість побачити, чи ввійшов користувач в систему, навіть коли користувач фактично не перебуває на сайті в той час (наприклад, як Facebook знає, що ви ввійшли в систему, коли ви перебуваєте на інших сайтах). Але я гадаю, щоб зрозуміти, що я повинен спочатку зрозуміти, як працюють сеанси.

Відповіді:


43

Я ніколи не використовував Express.js, хоча згідно з їх документацією на цю тему це звучить так:

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

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

  • З тут , це виглядає сеанс передачі даних на сервері за замовчуванням , утримуваний в пам'яті, хоча це може бути змінено в будь-якій формі зберігання інвентарю відповідний API.

Отже, якщо ви хочете перевірити речі без конкретного reqоб’єкта запиту, як ви вже сказали, вам потрібно просто отримати доступ до того самого сховища. У нижній частині першої сторінки документації, вона містить детальну інформацію про необхідні способи, які потрібно зберігати, тому якщо ви знайомі зі своїм API зберігання, можливо, ви можете виконати, .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], а потім відтворити [підпис] без знання використовуваного секретного ключа. 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.


1
при друку значення файлу cookie за допомогою console.log він видає закодований (підписаний) файл cookie. як мені отримати реальну інформацію?
vsync

Що ви маєте на увазі під словом - "Файл cookie сеансу все ще вразливий до крадіжок та повторного використання, якщо модифікація [sid] не потрібна."? оскільки SID генерується експресом, ми ніколи не можемо змінити його правильно?
Грушікеш

2
@WebHrushi Я думав про атаку "Людина в середині": en.wikipedia.org/wiki/Man-in-the-middle_attack
Вейлон Флінн

Може хто - то допомогти мені з цим питання: stackoverflow.com/questions/21982791 / ...
roundrobin

як я можу створити маркер для будь-якого конкретного session_id ??
aman verma

9

Мені цікаво, як вони насправді працюють.

Спробуйте поглянути на цю відповідь та на вікі- речі.

Чи зберігає воно на файлі cookie клієнта?

Так, зазвичай це печиво із призначеним ідентифікатором сеансу, яке слід підписати секретом, щоб запобігти підробці.

Якщо так, де я можу знайти це печиво? Якщо потрібно, як це розшифрувати?

Не слід возитися з файлом cookie сеансу на стороні клієнта. Якщо ви хочете працювати з сеансами на стороні сервера, вам слід перевірити відповідний express.js та підключити документи.


Сер, ми можемо поговорити, я маю певні сумніви щодо всього цього.
Сурадж Джейн

0

Окрім вже відмінних відповідей, ось дві діаграми, які я створив для пояснення експрес-сесій, їх зв’язку з файлами cookie та зберіганням:

  • шоколадне печиво: шоколад
  • полуничне печиво: полуниця
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.