Wie funktionieren Sitzungen in Express.js mit Node.js?


96

Mit Express.js sind Sitzungen kinderleicht . Ich bin gespannt, wie sie tatsächlich funktionieren.

Speichert es ein Cookie auf dem Client? Wenn ja, wo finde ich diesen Cookie? Wie dekodiere ich es bei Bedarf?

Grundsätzlich möchte ich sehen können, ob ein Benutzer angemeldet ist, auch wenn der Benutzer gerade nicht auf der Website ist (z. B. wie Facebook weiß, dass Sie angemeldet sind, wenn Sie auf anderen Websites sind). Aber ich nehme an zu verstehen, dass ich zuerst verstehen sollte, wie Sitzungen funktionieren.

Antworten:


43

Ich habe Express.js noch nie verwendet, obwohl es laut Dokumentation zu diesem Thema so klingt:

  • Auf dem Client werden Cookies mit einem Schlüssel (mit dem der Server die Sitzungsdaten abruft) und einem Hash (mit dem der Server sicherstellt, dass die Cookie-Daten nicht manipuliert wurden) gespeichert. Wenn Sie also versuchen, Änderungen vorzunehmen ein Wert, für den das Cookie ungültig ist)

  • Die Sitzungsdaten werden im Gegensatz zu einigen Frameworks (z. B. Play Framework !) Auf dem Server gespeichert, sodass das Cookie eher einem Platzhalter für die Sitzung als einem Inhaber der tatsächlichen Sitzungsdaten ähnelt.

  • Von hier aus sieht es so aus, als würden diese Sitzungsdaten auf dem Server standardmäßig im Speicher gespeichert, obwohl dies in das Speicherformular geändert werden könnte, in dem die entsprechende API implementiert ist.

Wenn Sie also Dinge ohne ein bestimmtes reqAnforderungsobjekt überprüfen möchten , wie Sie gesagt haben, müssen Sie nur auf denselben Speicher zugreifen. Am Ende der ersten Dokumentationsseite werden die erforderlichen Methoden aufgeführt, die der Speicher implementieren muss. Wenn Sie also mit Ihrer Speicher-API vertraut sind, können Sie möglicherweise eine solche ausführen .getAll(), die Sitzungsdaten durchlaufen und alles lesen Werte, die Sie wollen.


166

Überblick

Express.js verwendet ein Cookie, um eine Sitzungs-ID (mit einer Verschlüsselungssignatur) im Browser des Benutzers zu speichern, und verwendet dann bei nachfolgenden Anforderungen den Wert dieses Cookies, um auf dem Server gespeicherte Sitzungsinformationen abzurufen. Dieser serverseitige Speicher kann ein Speicher (Standard) oder ein anderer Speicher sein, der die erforderlichen Methoden implementiert (z. B. connect-redis ).

Einzelheiten

Express.js / Connect erstellt eine 24- stellige Base64- Zeichenfolge utils.uid(24)und speichert sie in req.sessionID. Diese Zeichenfolge wird dann als Wert in einem Cookie verwendet.

Client-Seite

Signierte Cookies werden immer für Sitzungen verwendet, sodass der Cookie-Wert das folgende Format hat.

[sid].[signature]

Wobei [sid] die Sitzungs-ID ist und [Signatur] durch Signieren von [sid] mit dem geheimen Schlüssel generiert wird, der beim Initialisieren der Sitzungs-Middleware angegeben wurde. Der Signaturschritt wird ausgeführt, um Manipulationen zu verhindern. Es sollte rechnerisch nicht möglich sein, [sid] zu ändern und dann [Signatur] ohne Kenntnis des verwendeten geheimen Schlüssels neu zu erstellen. Das Sitzungscookie ist weiterhin anfällig für Diebstahl und Wiederverwendung, wenn keine Änderung von [sid] erforderlich ist.

Der Name für dieses Cookie lautet

connect.sid

Serverseite

Wenn ein Handler nach der Middleware cookieParserund auftritt, sessionhat er Zugriff auf die Variable req.cookies. Dieses enthält ein JSON-Objekt, dessen Schlüssel die Cookie-Schlüssel und deren Werte die Cookie-Werte sind. Dieser enthält einen benannten Schlüssel connect.sidund sein Wert ist die signierte Sitzungskennung.

Hier ist ein Beispiel für das Einrichten einer Route, die bei jeder Anforderung das Vorhandensein des Sitzungscookies überprüft und dessen Wert auf der Konsole druckt.

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

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

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

Sie müssen auch sicherstellen, dass der Router ( app.use(app.router)) nach cookieParserund sessionin Ihrem Konfigurationsabschnitt enthalten ist.

Das Folgende ist ein Beispiel für die Daten, die intern von Express.js / Connect gespeichert werden.

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

Das userFeld ist benutzerdefiniert. Alles andere ist Teil des Sitzungsmanagements.

Das Beispiel stammt aus Express 2.5.


1
Beim Drucken des Cookie-Werts mit der Datei console.log wird das codierte (signierte) Cookie ausgegeben. Wie bekomme ich die wirklichen Informationen?
vsync

Was meinst du mit - "Das Sitzungscookie ist immer noch anfällig für Diebstahl und Wiederverwendung, wenn keine Änderung von [sid] erforderlich ist."? Da die SID per Express generiert wird, können wir sie niemals richtig ändern.
Hrushikesh

2
@WebHrushi Ich dachte an einen Man-in-the-Middle-Angriff: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

Kann mir jemand bei diesen Fragen helfen: stackoverflow.com/questions/21982791/…
Roundrobin

Wie erstelle ich ein Token für eine bestimmte session_id?
Aman Verma

9

Ich bin gespannt, wie sie tatsächlich funktionieren.

Versuchen Sie, sich diese Antwort und das Wiki- Zeug anzusehen .

Speichert es ein Cookie auf dem Client?

Ja, es ist normalerweise ein Cookie mit zugewiesener Sitzungs-ID, das mit einem Geheimnis signiert werden sollte, um Fälschungen zu verhindern.

Wenn ja, wo finde ich diesen Cookie? Wie dekodiere ich es bei Bedarf?

Sie sollten sich nicht mit einem Sitzungscookie auf der Clientseite anlegen. Wenn Sie mit Sitzungen auf der Serverseite arbeiten möchten, sollten Sie die zugehörigen express.js auschecken und Dokumente verbinden .


Sir, können wir reden? Ich habe einige Zweifel in Bezug auf all das.
Suraj Jain

0

Zusätzlich zu den bereits hervorragenden Antworten habe ich zwei Diagramme erstellt, um Express-Sitzungen, deren Verknüpfung mit Cookies und Speicher zu erläutern:

  • Schokoladenkeks: Schokolade
  • Erdbeerplätzchen: Erdbeere
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.