cookie$session简介
cookie
不安全、有限(4K)
在浏览器保存一些数据,每次请求都会带过来。用户可以通过浏览器直接修改数据。
session
安全、无限
在服务端保存数据,session是基于cookie实现的。
cookie中会有一个session的ID,服务器利用sessionid找到session文件,进行数据的读取、写入。
隐患:session劫持
cookie和session的关系
cookie发送
cookie的发送可以通过res.cookie()函数实现
const express=require('express');
var server=express();
//cookie
server.use('/aaa/a.html', function (req, res){
res.cookie('user', 'blue', {path: '/aaa', maxAge: 30*24*3600*1000});
res.send('ok');
});
server.listen(8080);
res.cookie(‘user’, ‘blue’, {path: ‘/aaa’, maxAge: 30*24*3600*1000});
res.cookie有4个参数:
'user':键
'blue':值
path: '/aaa',表示cookie在/aaa路径下
maxAge: 30*24*3600*1000,maxAge表示cookie生存周期,单位为毫秒。这里是一个月。
cookie读取
这里需要借助中间件cookie-parser
cookie-parser
它的作用是捕获cookie并赋值给req.cookies
只能读取当前路径或下级路径的路径。例如在path“/aaa”有cookie xxx,那么“/aaa”和“/”是可以读取xxx的,但是“/bbb”是不可读取xxx的
const express=require('express');
const cookieParser=require('cookie-parser');
var server=express();
//cookie
server.use(cookieParser());
server.use('/', function (req, res){
console.log(req.cookies);
res.send('ok');
});
server.listen(8080);
cookie签名
cookie签名使得具有不可抵赖性。
cookie进行签名后,原来的数据还是可见的(签名不是加密)。签名的作用是杜绝了修改。
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.send('ok');
});
server.listen(8080);
req.secret='wesdfw4r34tf'; 设置签名密钥
res.cookie('user', 'blue', {signed: true}); 发送具有签名密钥的cookie
req.signedCookies; 获得所有已签名的密钥
res.clearCookie('user'); 清除浏览器的cookie user
cookie加密
cookie是存在于浏览器的,cookie加密本身就不具有安全性。这里不加讨论
session中间件
session是基于cookie的,需要使用两个中间件:cookie-parser和cookie-session
cookie-session是强制要求设置密钥的
session密钥
为了安全起见,session的密钥我们一般不会只指定一个,而是会设置一个数组key,里面存放上万个密钥。
而且密钥可以是随机生成且定时修改的,这无疑大大提高了破解难度。
const express=require('express');
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');
var server=express();
//cookie
server.use(cookieParser());
server.use(cookieSession({
keys: ['aaa', 'bbb', 'ccc']//以三个密钥为例
}));
server.use('/', function (req, res){
console.log(req.session);
res.send('ok');
});
server.listen(8080);
使用session
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['count']);
res.send('ok');
});
server.listen(8080);
server.use(cookieSession({name: ,keys:[],maxAge:,}));
cookieSession有三个参数:
name: session名,存在cookie中
keys:密码组合
maxAge:生存周期,单位为毫秒