Heim  >  Artikel  >  Web-Frontend  >  So verwenden Sie Sitzungs- und Cookie-Methoden in Express (ausführliches Tutorial)

So verwenden Sie Sitzungs- und Cookie-Methoden in Express (ausführliches Tutorial)

亚连
亚连Original
2018-06-08 17:50:411814Durchsuche

Dieser Artikel stellt hauptsächlich vor, wie Express Sitzungen und Cookies verwendet. Jetzt teile ich ihn mit Ihnen und gebe ihn als Referenz.

Zustandsloses http

Wir alle wissen, dass http-Anfragen und -Antworten unabhängig voneinander sind und der Server nicht erkennen kann, ob zwei http-Anfragen vom selben Benutzer gesendet werden. Mit anderen Worten: Der Server ist nicht in der Lage, den Kommunikationsstatus aufzuzeichnen. Normalerweise verwenden wir Cookies und Sitzungen, um die Identität beider Parteien in der Sitzung zu ermitteln.

Cookie

Cookie wird vom Server an verschiedene Benutzer gesendet. Diese Kennung stellt die Identität des Benutzers dar. Mithilfe dieser Kennung wird der Benutzer identifiziert, dabei werden die relevanten Daten des Benutzers auf dem Server abgefragt und anschließend an den Benutzer gesendet.

Installieren Sie die von Express bereitgestellte Cookie-Parser-Middleware:

npm i -S cookie-parser

Führen Sie das Cookie-Parser-Plug-in in das von uns verwendete Projektseitenmodul ein und instanziieren Sie es dann wie folgt:

var cookieParser = require('cookie-parser');
var cp = cookieParser(secret, options);

Der erste Parameter ist „geheim“, der zum Signieren von Cookies verwendet werden kann, was wir oft als Cookie-Verschlüsselung bezeichnen. Es kann sich um eine Zeichenfolge oder ein Array handeln. Schüler, die mit den Verschlüsselungsprinzipien vertraut sind, sollten wissen, dass es sich bei dieser Zeichenfolge um den Chiffretext handelt, der dem Server gehört. Die zweiten Parameteroptionen enthalten die folgenden optionalen Parameter:

  1. Pfad: Geben Sie den vom Cookie betroffenen Pfad an

  2. expires: Geben Sie das Zeitformat an

  3. maxAge: Geben Sie an, wann das Cookie ablaufen soll

  4. sicher: Wenn der sichere Wert wahr ist, ist er nur in HTTPS gültig; andernfalls ist das Cookie in HTTP gültig.

  5. httpOnly: Der Browser lässt nicht zu, dass Skripte document.cookie ausführen, um Cookies zu ändern. Wenn Sie es auf „true“ setzen, können Sie Angriffe durch Cookie-Parser vermeiden und auch Cookie-Daten verschlüsseln, die wir „signedCookies“ nennen.

signedCookies

Der Implementierungscode lautet wie folgt:

var path = require('path');
var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();

// 使用 cookieParser 中间件;
app.use(cookieParser());

// 如果请求中的 cookie 存在 isFirst
// 否则,设置 cookie 字段 isFirst, 并设置过期时间为10秒
app.get('/', function(req, res) {
  if (req.cookies.isFirst) {
    res.send("再次欢迎访问");
    console.log(req.cookies)
  } else {
    res.cookie('isFirst', 1, { maxAge: 60 * 1000});
    res.send("欢迎第一次访问");
  }
});

app.listen(3030, function() {
  console.log('express start on: ' + 3030)
});

Aus dem obigen Code wissen wir, dass der erste Parameter von Cooke-Parser die angeben kann Serverseitiger Anbieter-Verschlüsselungsschlüssel, und dann verwenden wir das signierte Konfigurationselement in den Optionen, um die Verschlüsselung zu implementieren. Obwohl dies relativ sicher ist, weist das Cookie des Clients Einschränkungen auf. Wenn der Client eine Anforderung sendet, erhöht sich die Datenmenge im Anforderungsheader, wodurch sich die Anforderungsgeschwindigkeit verlangsamt und keine Datenfreigabe möglich ist.

session

Express-Session ist eine Middleware von ExpressJS, die zum Erstellen von Sitzungen verwendet wird. Der Server generiert eine Sitzungs-ID, und der Client verwendet ein Cookie, um die verschlüsselten Anforderungsinformationen der Sitzungs-ID zu speichern und die vom Benutzer angeforderten Daten auf dem Server zu speichern. Er kann jedoch auch die Daten des Benutzers verschlüsseln und speichern auf der Kundenseite.

session zeichnet den Sitzungsstatus zwischen dem Client und dem Server auf, der zur Bestimmung der Identität des Clients verwendet wird. Express-Session unterstützt den Sitzungsspeicherort

, der in Cookies, im Speicher oder auf Servern von Drittanbietern wie Redis und Mongodb gespeichert werden kann.

Sitzungen werden standardmäßig im Speicher gespeichert, und die Abfragegeschwindigkeit beim Speichern in Nicht-Redis-Datenbanken ist zu langsam in Redis (Cache-Datenbank).

Installieren Sie den von Express bereitgestellten Express-Session-Middleware-Installationsbefehl:

var path = require('path');
var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();

// 使用 cookieParser 中间件;
app.use(cookieParser('my_cookie_secret'));

// cookie
app.get('/', function(req, res) {
  if (req.signedCookies.isFirst) {
    res.send("欢迎再一次访问");
    console.log(req.signedCookies)
  } else {
    res.cookie('isFirst', 1, { maxAge: 60 * 1000, signed: true});
    res.send("欢迎第一次访问");
  }
});

Führen Sie das Express-Session-Plug-In in das von uns verwendete Projektseitenmodul ein und instanziieren Sie es dann wie folgt:

npm i -S express-session
Die Parameteroptionen-Konfigurationselemente von

session() umfassen hauptsächlich:

name: Setzen Sie das Cookie, um den Feldnamen der Sitzung zu speichern. Der Standardwert ist connect.sid

    store: Die Speichermethode der Sitzung, standardmäßig wird sie im Speicher gespeichert, wir können Redis usw. anpassen.
  1. genid: Beim Generieren eine neue session_id, standardmäßig wird uid2 verwendet. Dieses NPM-Paket
  2. rolling: Setzt ein Cookie für jede Anfrage zurück, der Standardwert ist false
  3. resave : Auch wenn die Sitzung nicht geändert wurde, speichern Sie den Sitzungswert, der Standardwert ist wahr
  4. saveUninitialized: Erzwingen Sie das Speichern der nicht initialisierten Sitzung in der Datenbank
  5. geheim: Übergeben Sie die festgelegte geheime Zeichenfolge, um den Hash-Wert zu berechnen und in das Cookie einzufügen, um das generierte signierteCookie manipulationssicher zu machen
  6. Cookie: Legen Sie die relevanten Optionen fest für das Cookie, das die Sitzungs-ID speichert
  7. Was können wir also damit machen? Im Folgenden stellen wir sie einzeln vor.
  8. Cookie-Sitzung

Cookie-Sitzung ist sehr einfach zu verwenden. Wir verwenden das Cookie-Konfigurationselement, um die Sitzungsdaten im Cookie zu speichern zu signiertenCookies Beide speichern die Daten auf dem Client und verschlüsseln die Daten, aber die durch die verschlüsselte Anfrage erhaltene Datenstruktur ist unterschiedlich.

Die Struktur der Cooke-Sitzung ist wie folgt:

var session = require('express-session');
var se = session(options);
Die Struktur von signiertemCookie ist wie folgt:

Session {
 cookie:
  { path: '/',
   _expires: 2018-01-29T17:58:49.950Z,
   originalMaxAge: 60000,
   httpOnly: true },
 isFirst: 1 }

Der Code zum Implementieren der Cookie-Sitzung ist wie folgt:

{ isFirst: '1' }

Signed-Cookie vs. Cookie-Sitzung

SignedCookies-Informationen sind sichtbar, können aber nicht geändert werden, Cookie-Sitzung ist unsichtbar und kann nicht geändert werden

    SignedCookies-Informationen werden lange Zeit auf dem Client gespeichert. Der letztere Client wird geschlossen und die Informationen verschwinden

针对Cooke session增加了客户端请求的数据规模,我们一般这样使用,数据库存储session。

数据库保存session

用数据库保存session,我们一般使用redis,因为它是缓存数据库,查询速度相较于非缓存的速度更快。

express-session 的实例代码如下:

var path = require('path');
var express = require('express');
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var app = express();

// session
app.use(session({
  name: 'session-name', // 这里是cookie的name,默认是connect.sid
  secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串
  resave: true,
  saveUninitialized: false,
  store: new redisStore({
    host: '127.0.0.1',
    port: '6379',
    db: 0,
    pass: '',
  })
}));

// route
app.get('/', function(req, res) {
  if (req.session.isFirst) {
    res.send("欢迎再一次访问。");
    console.log(req.session)
  } else {
    req.session.isFirst = 1;
    res.send("欢迎第一次访问。");
  }
});

app.listen(3030, function() {
  console.log('express start on: ' + 3030)
});

但有时我们也使用非redis数据库保存session,这时我们就需要对项目结构有深刻的认识和理解;否则,使用后反而会适得其反。

另外,我们要注意使用数据库保存session数据,在浏览器端的session-id会随着浏览器的关闭而消失,下次打开浏览器发送请求时,服务器依然不能识别请求者的身份。

cookie session 虽然能解决这个问题,但是它本身存在着安全风险,其实cookie session 和 signedCookies都面临xss攻击。

其实,使用signedCookies和session的结合会在一定程度上降低这样的风险。

signedCookies(cookies) 和 session的结合

在开发中,我们往往需要signedCookies的长期保存特性,又需要session的不可见不可修改的特性。

var path = require('path');
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var app = express();

// 使用 cookieParser 中间件;
app.use(cookieParser());

// session
app.use(session({
  name: 'session-name', // 这里是cookie的name,默认是connect.sid
  secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串
  resave: true,
  saveUninitialized: false,
  // cookie: { maxAge: 60 * 1000, httpOnly: true },
  store: new redisStore({
    host: '127.0.0.1',
    port: '6379',
    db: 0,
    pass: '',
  })
}));

app.get('/', function(req, res, next) {
  if(req.session.isFirst || req.cookies.isFirst) {
    res.send("欢迎再一次访问");
  } else {
    req.session.isFirst = 1;
    res.cookie('isFirst', 1, { maxAge: 60 * 1000, singed: true});
    res.send("欢迎第一次访问。");
  }
});

app.listen(3030, function() {
  console.log('express start on: ' + 3030)
});

这样我们将session保存在redis中的信息,保存在了session_id所标示的客户端cooke中一份,这样我们就不用担心,浏览器关闭,cookie中的session_id字段就会消失的情况,因为浏览器中还有它的备份cookie,如果没有备份的cookie信息,下次客户端再次发出请求浏览就无法确定用户的身份。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在ES6中详细解读let和闭包

在vue+iview+less+echarts中实战项目(详细教程)

详细解说vue编码风格

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Sitzungs- und Cookie-Methoden in Express (ausführliches Tutorial). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn