node学习之cookie和session

c什么是cookiephp

Cookie设计的初衷是 维持浏览器和服务端的状态。http是无状态的,服务端不能跟踪客户端的状态。 浏览器第一次向服务器发送请求,服务器会返回一个cookie给客户端浏览器,浏览器下一次发送请求时,会携带cookie。
node

而node.js 的框架express 由于保持高性能, 没有封装太多的功能,而是按需加载的形式, 引入本身须要的中间件。而cookie 经常使用的插件是cookie-parserexpress

 

读取cookie: 须要借助cookie-parser。npm

//引入cookieparser 框架,读取客户端发送的cookie
const express = require('express'); const cookieParase = require('cookie-parser'); var app = express();
//这点很重要,若是没有,下面的req.cookies 会返回undefined app.use(cookieParase()); app.use(
'/', function (req,res) { res.cookie('user', 'lililiwen'); console.log(req.cookies); res.send('objkle') }) app.listen(8080)

 

发送cookie, 不须要借助中间件, 能够直接用 res.cookie();数组

删除cookie:   res.clearCookie(名字);浏览器

 cookie 签名安全

 1 const express = require('express');  2 const cookieParser = require('cookie-parser');  3 
 4 //随机生成的字符串
 5 var signStr = 'xadsafeowirw'
 6 
 7 var app = express();  8 
 9 //须要将密匙传给cookieParser, 在接收数据的时候,进行解析。
10 app.use(cookieParser(signStr)); 11 
12 app.use('/', function (req, res) { 13     //将密匙字符串赋值给req.secret,能够省略,在上面cookieparser()时会自动对secret赋值
14     req.secret=signStr; 15 
16     //返回给浏览器的cookie, 这就是传说中的种cookie了
17     //若是须要开启签名,第三个参数对象signed 设置为true.
18     //因为cookie的大小限制4k,而签名后的cookie体积会增长,因此重要的cookie才签名
19     res.cookie('cookiename', 'liwen', {signed: true, maxAge: 3600}) 20 
21     //有没有签名的cookie,获取方式不同。
22     console.log('无签名', req.cookies); 23     console.log('带签名',req.signedCookies); 24     res.send('ok') 25 }) 26 app.listen(8080);

打开浏览器的Application 能够看到签名后的cookie,签名后的cookie, 咱们能够直接在字符串上看到原文(liwen)。可用encodeComponent() 解码。  签名的做用是让服务端知道cookie有没有被修改。并不能作到加密。 而有中间件能够作到加密: cookie-encrypter   不过加密cookie,没有意义,破解只是时间问题,重要的东西仍是往session放比较好。服务器

 

sessioncookie

session和基于cookie的。 存在于服务器,相对cookie安全,但session也存在session劫持的风险, 因此须要一串很长不少的秘钥数组来增长破解的难度。同时设置manAge过时时间, 减小留给坏人破解时间。session

node中有的中间件 是cookie-session

 1 const express = require('express');  2 const cookieParser = require('cookie-parser');  3 const cookieSession = require('cookie-session');  4 
 5 var app = express();  6 
 7 
 8 app.use(cookieParser());  9 
10 //cookieSession 必须放在cookieParser后面
11 app.use(cookieSession({ 12     //session的秘钥,防止session劫持。 这个秘钥会被循环使用,秘钥越长,数量越多,破解难度越高。
13     keys: ['aaa', 'bbb', 'ccc'], 14     //session过时时间,不易太长。php默认20分钟
15     maxAge: 60*60, 16     //能够改变浏览器cookie的名字
17     name: 'session'
18 })); 19 
20 app.use('/', function (req, res) { 21 
22     //假设使用count记录用户访问的次数
23    if(req.session['count'] == null) { 24        req.session['count'] = 1; 25    }else{ 26        req.session['count']++; 27  } 28    console.log(req.session['count']) 29     res.send('ok') 30 }) 31 app.listen(8080) 32 
33 //删除 delete req.session

浏览器中能够看到,服务器经过respond的set-cookie返回cookie

session是返回的cookie ID, session.sig 是session签名,做用是知道session是否被修改过

相关文章
相关标签/搜索