Comment les sessions fonctionnent-elles dans Express.js avec Node.js?


96

En utilisant Express.js , les sessions sont extrêmement simples. Je suis curieux de savoir comment ils fonctionnent réellement.

Stocke-t-il des cookies sur le client? Si oui, où puis-je trouver ce cookie? Si nécessaire, comment le décoder?

Je veux essentiellement pouvoir voir si un utilisateur est connecté, même lorsque l'utilisateur n'est pas réellement sur le site à ce moment-là (par exemple, comment Facebook sait que vous êtes connecté lorsque vous êtes sur d'autres sites). Mais je suppose que pour comprendre que je dois d'abord comprendre le fonctionnement des sessions.

Réponses:


43

Je n'ai jamais utilisé Express.js, bien que selon leur documentation sur le sujet, cela ressemble à:

  • Les cookies sont stockés sur le client, avec une clé (que le serveur utilisera pour récupérer les données de session) et un hachage (que le serveur utilisera pour s'assurer que les données du cookie n'ont pas été falsifiées, donc si vous essayez de changer une valeur le cookie sera invalide)

  • Les données de session, contrairement à certains frameworks (par exemple Play Framework !), Sont conservées sur le serveur, donc le cookie ressemble plus à un espace réservé pour la session qu'à un support de données de session réelles.

  • À partir de , il semble que ces données de session sur le serveur soient par défaut conservées en mémoire, bien qu'elles puissent être modifiées pour n'importe quelle forme de stockage implémentant l'API appropriée.

Donc, si vous voulez vérifier des choses sans reqobjet de requête spécifique , comme vous l'avez dit, vous devez simplement accéder à ce même stockage. Au bas de la première page de documentation, il détaille les méthodes requises que le stockage doit implémenter, donc si vous êtes familier avec votre API de stockage, vous pourriez peut-être exécuter un .getAll()si quelque chose comme ça existe, et parcourir les données de session et lire ce que les valeurs que vous voulez.


166

Aperçu

Express.js utilise un cookie pour stocker un identifiant de session (avec une signature de cryptage) dans le navigateur de l'utilisateur, puis, lors de demandes ultérieures, utilise la valeur de ce cookie pour récupérer les informations de session stockées sur le serveur. Ce stockage côté serveur peut être un magasin de mémoire (par défaut) ou tout autre magasin qui implémente les méthodes requises (comme connect-redis ).

Détails

Express.js / Connect crée une chaîne Base64 de 24 caractères en utilisant utils.uid(24)et la stocke dans req.sessionID. Cette chaîne est ensuite utilisée comme valeur dans un cookie.

Côté client

Les cookies signés sont toujours utilisés pour les sessions, la valeur du cookie aura donc le format suivant.

[sid].[signature]

Où [sid] est l'identifiant de session et [signature] est généré en signant [sid] à l'aide de la clé secrète fournie lors de l'initialisation du middleware de session. L'étape de signature est effectuée pour empêcher la falsification. Il devrait être impossible de modifier [sid] puis de recréer [signature] sans connaître la clé secrète utilisée. Le cookie de session est toujours vulnérable au vol et à la réutilisation, si aucune modification de [sid] n'est requise.

Le nom de ce cookie est

connect.sid

Du côté serveur

Si un gestionnaire survient après le middleware cookieParseret, sessionil aura accès à la variable req.cookies. Il contient un objet JSON dont les clés sont les clés de cookie et les valeurs sont les valeurs de cookie. Celui-ci contiendra une clé nommée connect.sidet sa valeur sera l'identifiant de session signé.

Voici un exemple de la façon de configurer une route qui vérifiera l'existence du cookie de session à chaque demande et affichera sa valeur sur la console.

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

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

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

Vous devrez également vous assurer que le routeur ( app.use(app.router)) est inclus après cookieParseret sessiondans votre section de configuration.

Voici un exemple des données stockées en interne par Express.js / Connect.

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

Le userchamp est personnalisé. Tout le reste fait partie de la gestion de session.

L'exemple provient d'Express 2.5.


1
lors de l'impression de la valeur du cookie avec console.log, il donne le cookie encodé (signé). comment obtenir les vraies informations?
vsync

Que voulez-vous dire par - "Le cookie de session est toujours vulnérable au vol et à la réutilisation, si aucune modification de [sid] n'est requise."? puisque SID est généré par express, nous ne pouvons jamais le changer, non?
Hrushikesh

2
@WebHrushi Je pensais à une attaque Man-in-the-Middle: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

Quelqu'un peut-il m'aider avec ces questions: stackoverflow.com/questions/21982791/…
roundrobin

comment créer un jeton pour un identifiant de session particulier?
aman verma

9

Je suis curieux de savoir comment ils fonctionnent réellement.

Essayez de regarder cette réponse et les éléments du wiki .

Stocke-t-il des cookies sur le client?

Oui, il s'agit généralement d'un cookie avec un identifiant de session attribué, qui doit être signé avec un secret afin d'éviter toute falsification.

Si oui, où puis-je trouver ce cookie? Si nécessaire, comment le décoder?

Vous ne devez pas jouer avec un cookie de session côté client. Si vous souhaitez travailler avec des sessions côté serveur, vous devez consulter express.js et connecter les documents.


Monsieur, pouvons-nous parler? J'ai des doutes sur tout cela.
Suraj Jain

0

En plus des réponses déjà excellentes, voici 2 schémas que j'ai créés pour expliquer les sessions Express, leur lien avec les cookies et le stockage:

  • cookie au chocolat: Chocolat
  • biscuit aux fraises: fraise
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.