Node.js Session Cookies
Willemers Informatik-Ecke
Datei-Upload Express.js

Das Protokoll HTTP an sich ist zustandslos. In vielen Fällen ist es aber dringend notwendig, den Besuch einer Website über mehrere HTML-Seiten hinweg verfolgen zu können, beispielsweise, wenn der Kunde eines Online-Shops nicht bei jedem Seitenwechsel seinen Warenkorb verlieren möchte.

Cookies

Um dies zu erreichen, können Cookies eingesetzt werden. Cookies sind kleine Dateischnipsel, die eine Zuweisung erhalten (name=wert). Hier kann beispielsweise eine Sitzung mit einer ID versehen werden.

session=123456789
Hinzu kommt die Information, welche URL sie erzeugt hat. Nur wenn ein Unterpfad dieser URL aufgerufen wird, wird der Cookie an den Server gesendet.

Der Cookie kann mit einem Verfallsdatum versehen werden. Jenseits dieses Zeitpunkts wird der Browser den Cookie löschen.

Ablauf

Der Server prüft bei einer GET-Anfrage, ob ein Cookie mitgesendet wurde. Falls das nicht der Fall ist, wird der Server eines erstellen und mit den angeforderten Daten zurücksenden.

Beispiel das Senden des Servers von einem Cookie

const http = require("http");
const host = 'localhost';
const port = 8080;

const server = http.createServer(function (request, response) {
    response.statusCode = 200;
    response.setHeader('Content-Type', 'text/html');
    response.setHeader('Set-Cookie', 'session_id=99999;');
    const message="Da kam gerade ein Cookie";
    response.end(message);
});
server.listen(port, host, function() {
    console.log("Server is running on http://"+host+":"+port);
});

Aufruf durch einen Client

Wird diese Seite aufgerufen, erhält der Aufrufer einen Cookie. Hier sichtbar gemacht mit dem Aufruf des Befehls curl.

curl -v localhost:8080
* Rebuilt URL to: localhost:8080/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html
< Set-Cookie: session_id=99999;
< Date: Fri, 03 Dec 2021 20:29:33 GMT
< Connection: keep-alive
< Content-Length: 24
< 
* Connection #0 to host localhost left intact
Da kam gerade ein Cookie

Cookies des Browsers auslesen

Ein Browser hätte den Cookie nun in seinem Cache gespeichert. Bei einem erneuten Aufruf der URL würde er in dem Header "Cookie" diesen Cookie an den Server senden.

Die Cookies werden in den Headern des Requests gespeichert. Sie werden in einer Zeichenkette übermittelt. Die Einträge werden durch ein Semikolon, gefolgt von einem Leerzeichen getrennt. Jeder Eintrag besteht aus einem Variablennamen, gefolgt von einem Gleichheitszeichen, gefolgt vom Wert.

const http = require("http");
const host = 'localhost';
const port = 8080;

// Siehe Link unten
function getCookieValue(cookie, name) {
   const b = cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)');
   return b ? b.pop() : '';
}

const server = http.createServer(function (request, response) {
    session = getCookieValue(request.headers.cookie, "session_id");
    console.log("Session-ID: " + session);
    response.statusCode = 200;
    response.setHeader('Content-Type', 'text/html');
    response.setHeader('Set-Cookie', 'session_id=99999;');
    const message="Da kam gerade ein Cookie";
    response.end(message);
});
server.listen(port, host, function() {
    console.log("Server is running on http://"+host+":"+port);
});

Die Session wird im Beispiel durch den Cookie session_id gespeichert. Das Auslesen des Wertes übernimmt die Funktion getCookieValue. Als Parameter erhält sie den Cookie-String und den gesuchten Namen. Den Wert ermittelt sie über einen regulären Ausdruck.

Der reguläre Ausdruck besagt, dass nach dem übergebenen String in dem Ausdruck gesucht wird. Dem vorangehen muss der Anfang des Strings oder ein Semikolon. Hinter dem Gleichheitszeichen wird durch die runden Klammern alles bis zum nachfolgenden Semikolon ausgeschnitten und zurückgegeben.

URL-Einträge und Hidden Input

Wenn Cookies nicht zur Debatte stehen, kann die Session auch über die URL trasportiert werden, indem man die Session-Id hinten an die URL der nächsten Seite anhängt.

Eine einfache Möglichkeit, die Informationen in die URL zu zaubern, ist die Verwendung eines unsichtbaren Input-Felds im Formular.

<input type="hidden" id="session" name="session" value="123456789" />

Der Name und der Wert dieses Inputs wird bei Auswertung des Forms übertragen. Um den Inhalt (value) vor dem Übertragen zu ändern, kann das Input über seine id beispielsweise per JavaScript verändert werden.