nodejs cookie与session

cookie、session

cookie:在浏览器保存一些数据,每次请求都会带过来
*不安全、有限(4K)

session:保存数据,保存在服务端
*安全、无限

--------------------------------------------------------------------------------------------------------------

session:基于cookie实现的
*cookie中会有一个session的ID,服务器利用sessionid找到session文件、读取、写入

隐患:session劫持

cookie:

1.cookie空间非常小——省着用

2.安全性非常差——校验cookie是否被篡改过

用法:

a.发送cookie

res.secret='字符串';  //秘钥,对cookie加密
res.cookie(名字, 值, {path: '/', maxAge: 毫秒, signed: true});
// path:路径,maxAge:过期时间,signed:是否加密

b.读取cookie

cookie-parser中间件
server.use(cookieParser('秘钥'));
server.use(function (){
  req.cookies    未签名版
  req.signedCookies    签名版
});

c.删除cookie

res.clearCookie(名字);

举例:

const express=require('express');
const cookieParser=require('cookie-parser');

var server=express();

//cookie
server.use(cookieParser('wesdfw4r34tf'));

server.use('/', function (req, res){
  req.secret='wesdfw4r34tf';
  res.cookie('user', 'blue', {signed: true});

  console.log('签名cookie:', req.signedCookies)
  console.log('无签名cookie:', req.cookies);
 //res.clearCookie('user');
res.send('ok'); }); server.listen(8080);

session:

cookie-session中间件

cookieSession(options)

name

要设置的Cookie的名称,默认为session

keys

用于签署和验证Cookie值的键列表。

secret

如果keys没有提供,将用该字符串做标记

Cookie Options

其他选项传递给 cookies.get() 和 cookies.set() ,允许你控制secure、path、domain,并签署其他设置。

这些选项还可以包含以下任何内容(有关完整列表,请参阅 cookies模块文档

  • maxAge:表示Date.now()到期的毫秒数
  • expiresDate指示Cookie过期日期对象(默认情况下在会话结束时过期)。
  • path:指示cookie路径的字符串(/默认情况下)。
  • domain:表示cookie的域的字符串(无默认)。
  • sameSite:一个布尔值或字符串,指示cookie是否为“相同站点”cookie(false默认情况下)。这可以设置为'strict',,'lax'true(映射到'strict')。
  • secure:一个布尔值,指示cookie是否仅通过HTTPS发送(false默认为HTTP true默认情况下为HTTPS)。如果这样设置,true并且Node.js不是直接通过TLS连接,请务必阅读如何在代理之后设置Express,否则Cookie可能无法正确设置。
  • httpOnly:一个布尔值,表示cookie是否仅通过HTTP(S)发送,并且不提供给客户端JavaScript(true默认情况下)。
  • signed:一个布尔值,表示cookie是否要被签名(true默认情况下)。如果是这样的话,.sig还会发送一个带附加后缀的同名的另一个cookie ,一个27字节的url-safe base64 SHA1值代表第一个Keygripcookie-name = cookie-value的哈希此签名密钥用于在下次接收到Cookie时检测篡改。
  • overwrite:一个布尔值,表示是否覆盖以前设置的相同名称的cookie(true默认情况下)。如果这是真的,在设置此Cookie时,将在同一请求中设置相同名称的所有Cookie(不管路径或域)是否从Set-Cookie头部中过滤掉
 

1.写入

server.use(cookieParser());
server.use(cookieSession({
  keys: [.., .., .., ..]
}));

2.读取

server.use('/', function (){
  req.session
});

2.删除

delete req.session
req.session = null

举例:

const express=require('express');
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');

var server=express();

//cookie
server.use(cookieParser());
server.use(cookieSession({
  name: 'sess',
  keys: ['aaa', 'bbb', 'ccc'],
  maxAge: 2*3600*1000
}));

server.use('/', function (req, res){
  if(req.session['count']==null){
    req.session['count']=1;
  }else{
    req.session['count']++;
  }

  console.log(req.session);

  res.send('ok');
});

server.listen(8080);

 

--------------------------------------------------------------------------------------------------------------

 

posted @ 2017-07-25 20:11  Jade_g  阅读(606)  评论(0编辑  收藏  举报