Maison > interface Web > js tutoriel > le corps du texte

Comment utiliser les méthodes de session et de cookies en express (tutoriel détaillé)

亚连
Libérer: 2018-06-08 17:50:41
original
1833 Les gens l'ont consulté

Cet article présente principalement comment Express utilise la session et le cookie. Maintenant, je le partage avec vous et le donne comme référence.

http apatride

Nous savons tous que les requêtes et réponses http sont indépendantes les unes des autres, et le serveur ne peut pas identifier si deux requêtes http sont envoyées par le même utilisateur. En d’autres termes, le serveur n’a pas la capacité d’enregistrer l’état des communications. Nous utilisons généralement des cookies et des sessions pour déterminer l'identité des deux parties participant à la session.

cookie

Le cookie est envoyé depuis le serveur. Le serveur envoie différents identifiants aux différents utilisateurs. Cet identifiant représente l'identité de l'utilisateur. Le serveur l'envoie via le client. Cet identifiant est utilisé pour identifier l'utilisateur, interrogeant ainsi les données pertinentes de l'utilisateur sur le serveur puis les envoyant à l'utilisateur.

Installez le middleware cookie-parser fourni par express :

npm i -S cookie-parser
Copier après la connexion

Introduisez le plug-in cookie-parser dans le module de page de projet que nous utilisons, puis instanciez-le comme suit :

var cookieParser = require('cookie-parser');
var cp = cookieParser(secret, options);
Copier après la connexion

Il a deux paramètres. Le premier paramètre est secret, qui peut être utilisé pour signer les cookies, ce que nous appelons souvent le cryptage des cookies. Il peut s'agir d'une chaîne ou d'un tableau. Les étudiants familiarisés avec les principes de chiffrement doivent savoir que cette chaîne est le texte chiffré appartenant au serveur. Le deuxième paramètre options contient les paramètres facultatifs suivants :

  1. <🎜. >path : Spécifiez le chemin affecté par le cookie

  2. expires : Spécifiez le format de l'heure

  3. maxAge : Spécifiez quand le cookie expirera

  4. secure : Lorsque la valeur secure est vraie, elle n'est valable qu'en HTTPS sinon, le cookie est valide en HTTP ;

  5. httpOnly : le navigateur n'autorise pas les scripts à utiliser document.cookie pour modifier les cookies. Le définir sur true peut éviter d'être attaqué par 🎜>cookie-parser peut également crypter les données des cookies, ce que nous appelons les cookies signés.

  6. signedCookies

Le code d'implémentation est le suivant :
var path = require(&#39;path&#39;);
var express = require(&#39;express&#39;);
var cookieParser = require(&#39;cookie-parser&#39;);
var app = express();

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

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

app.listen(3030, function() {
  console.log(&#39;express start on: &#39; + 3030)
});
Copier après la connexion

D'après le code ci-dessus, nous savons que le premier paramètre de cookie-parser peut spécifiez le serveur La clé de cryptage fournie par le client, puis nous utilisons l'élément de configuration signé dans les options pour implémenter le cryptage. Bien que cela soit relativement sûr, le cookie du client a des limites. Lorsque le client envoie une demande, il augmente la quantité de données dans l'en-tête de la demande, ce qui ralentit la vitesse de la demande et ne permet pas le partage de données.

session

express-session est un middleware d'expressjs utilisé pour créer des sessions. Le serveur génère un identifiant de session et le client utilise un cookie pour enregistrer les informations de demande cryptées de l'identifiant de session et enregistre les données demandées par l'utilisateur sur le serveur. Cependant, il peut également crypter les données de l'utilisateur et les enregistrer. du côté du client.
var path = require(&#39;path&#39;);
var express = require(&#39;express&#39;);
var cookieParser = require(&#39;cookie-parser&#39;);
var app = express();

// 使用 cookieParser 中间件;
app.use(cookieParser(&#39;my_cookie_secret&#39;));

// cookie
app.get(&#39;/&#39;, function(req, res) {
  if (req.signedCookies.isFirst) {
    res.send("欢迎再一次访问");
    console.log(req.signedCookies)
  } else {
    res.cookie(&#39;isFirst&#39;, 1, { maxAge: 60 * 1000, signed: true});
    res.send("欢迎第一次访问");
  }
});
Copier après la connexion

session enregistre l'état de la session entre le client et le serveur, qui est utilisé pour déterminer l'identité du client.

express-session prend en charge l'emplacement de stockage de session qui peut être stocké dans des cookies, en mémoire ou sur des serveurs tiers tels que redis et mongodb.

La session est stockée en mémoire par défaut. La sécurité de son stockage dans les cookies est trop faible et la vitesse de requête de son stockage dans une base de données non-redis est trop lente. Dans le développement général du projet, elle est stockée. en redis (base de données cache).

Installez la commande d'installation du middleware express-session fournie par express :

Introduisez le plug-in express-session dans le module de page de projet que nous utilisons, puis instanciez-le comme suit :

Les éléments de configuration des options de paramètres de session() incluent principalement :

npm i -S express-session
Copier après la connexion
name : définissez le cookie pour enregistrer le nom du champ de la session. connect.sid

var session = require(&#39;express-session&#39;);
var se = session(options);
Copier après la connexion

store : La méthode de stockage de la session, la valeur par défaut est de la stocker en mémoire, nous pouvons personnaliser redis, etc.

  1. genid : lors de la génération d'un nouveau session_id, la valeur par défaut est d'utiliser le package npm uid2

  2. rolling : réinitialiser un cookie pour chaque requête, la valeur par défaut est false

  3. resave : Même si la session n'est pas modifiée, la valeur de la session est également enregistrée, la valeur par défaut est true

  4. saveUninitialized : Force l'enregistrement de la session non initialisée dans le base de données

  5. secret : défini par une chaîne secrète pour calculer la valeur de hachage et la placer dans le cookie pour rendre le cookie signé généré inviolable

  6. cookie : définissez les options pertinentes pour le cookie qui stocke l'identifiant de session

  7. Alors, que pouvons-nous en faire ? Ci-dessous, nous les présenterons un par un.

  8. session de cookie

  9. La session de cookie est très simple à utiliser. Nous utilisons l'élément de configuration du cookie dans l'élément de configuration pour enregistrer les données de session dans le cookie. aux cookies signés. Les deux enregistrent les données sur le client et chiffrent les données, mais la structure des données obtenue par la requête chiffrée est différente.

La structure de la session cookie est la suivante :

La structure de signéCookie est la suivante :

Le code pour implémenter la session cookie est le suivant :

Session {
 cookie:
  { path: &#39;/&#39;,
   _expires: 2018-01-29T17:58:49.950Z,
   originalMaxAge: 60000,
   httpOnly: true },
 isFirst: 1 }
Copier après la connexion
signed-cookie vs cookie session

{ isFirst: &#39;1&#39; }
Copier après la connexion

les informations sur les cookies signés sont visibles mais ne peuvent pas être modifiées, la session de cookie est invisible et ne peut pas être modifié
var path = require(&#39;path&#39;);
var express = require(&#39;express&#39;);
var session = require(&#39;express-session&#39;);
var redisStore = require(&#39;connect-redis&#39;)(session);
var app = express();

// session
app.use(session({
  name: &#39;session-name&#39;, // 这里是cookie的name,默认是connect.sid
  secret: &#39;my_session_secret&#39;, // 建议使用 128 个字符的随机字符串
  resave: true,
  saveUninitialized: false,
  cookie: { maxAge: 60 * 1000, httpOnly: true }
}));

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

app.listen(3030, function() {
  console.log(&#39;express start on: &#39; + 3030)
});
Copier après la connexion

signedCookies Les informations sont enregistrées dans le client pendant une longue période, et ce dernier client est fermé et les informations disparaissent

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

数据库保存session

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

express-session 的实例代码如下:

var path = require(&#39;path&#39;);
var express = require(&#39;express&#39;);
var session = require(&#39;express-session&#39;);
var redisStore = require(&#39;connect-redis&#39;)(session);
var app = express();

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

// route
app.get(&#39;/&#39;, 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(&#39;express start on: &#39; + 3030)
});
Copier après la connexion

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

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

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

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

signedCookies(cookies) 和 session的结合

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

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

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

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

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

app.listen(3030, function() {
  console.log(&#39;express start on: &#39; + 3030)
});
Copier après la connexion

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

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

相关文章:

在ES6中详细解读let和闭包

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

详细解说vue编码风格

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal