cookie的使用场景:
前端跟服务器请求是一般都是通过http请求,但是http是无状态请求,无法知道用户是否已经访问后,这时候需要用到cookie,当我们访问过服务器之后,服务器会在客户端种植一个cookie,当再次访问的时候,根据cookie就知道用户是否访问过了。
cookie的问题:
cookie有安全性问题。因为cookie是存在客户端,只要是存在客户端的都是存在安全性问题的。
cookie大小有限制(4k)
cookie的写操作
const express = require('express');
const server = express();
server.use('/', (req, res) => {
res.cookie('user', 'aaa', {
maxAge: 1*24*3600*1000 // 一个月转换成毫秒
});
res.send('ok').end();
})
server.listen(8080);
cookie的读操作
读操作的时候需要cookie-parser
第一步:cnpm install cookie-parser
第二步:
const express = require('express');
const cookieParser = require('cookie-parser');
const server = express();
server.use(cookieParser());
server.use('/', (req, res) => {
console.log(req.cookies);
res.send('ok').end();
})
server.listen(8080);
server.use('/', (req, res) => {
res.clearCookie('user');
res.send('ok').end();
})
cookie的加密操作
const express = require('express');
const cookieParser = require('cookie-parser');
const server = express();
server.use(cookieParser('afeagdwf')); // 随便写的签名密钥,防止篡改value值
// 写操作
server.use('/', (req, res) => {
res.cookie('user', 'poppy', {
signed: true, // 是否加密
maxAge: 30*24*3600*1000 // 一个月转换成毫秒
});
res.cookie('pass', '1234', {
maxAge: 30*24*3600*1000 // 不加密
});
res.send('ok').end();
})
// 读操作
// 因为cookie有大小限制,加密后的value很长占内存,所以能不加密就不加密
server.use('/', (req, res) => {
console.log(req.cookies); // 获取为加密的cookie
console.log(req.signedCookies); // 获取加密的cookie
res.send('ok').end();
})
server.listen(8080);
效果:user加密 pass加密
注意:读取时把写操作给注释掉
session的应用场景
session是保存在服务端,与cookie作用是一样的,相对cookie来讲session比较安全。
且大小也没有限制,。
那么cookie既然不好用,为什么不删除cookie,我们直接用session就好了嘛?其实不然,session不能独立存在,他是基于cookie的。cookie中会生成一个session的ID,服务器利用session文件中的ID找到session文件,进行读取、写入。
session的读写操作
第一步:cnpm install cookie-session
第二步:
const express = require('express');
const server = express();
const cookieParser = require('cookie-parser');
const sessionParser = require('cookie-session'); // 不能独立存在,依赖cookie
// session必须设置key值
let key = [];
for (var i = 0; i < 1000; i++) {
key.push('abdsa' + Math.random()) // 10000次,那样循环加密安全
};
server.use(cookieParser());
server.use(sessionParser({
name: 'aaa', // 改变session的名字
keys: key, // 必须要设置key值
maxAge: 1*3600*1000 // 如果你当前不设置过期时间,在一定时间内没有任何操作,那么session会自动的清除掉, 出于安全性考虑,如果设置成无限过期,那么就会给攻击者足够的时间去破解你的session
}));
// session的写操作
server.use('/', (req, res) => {
if (req.session['num']) {
req.session['num']++
} else {
req.session['num'] = 1
};
// session的读操作
console.log(req.session['num']) // 查看是否在变化,每次签名的session的value值都是不一样的但id都是一样的
res.send('ok').end();
})
// session的删除
server.use('/', (req, res) => {
delete req.session['num']
res.send('11111').end();
})
server.listen(8080);