11.11
http无状态的
cookie
在浏览器保存一下数据,每次请求的时候都会带过来;
大小限制4K,有session的ID;
保存到客户端,不安全;
session
因为cookie的不安全,session应运而生;
保存数据的,保存在服务端;
大小无限;
基于cookie,不是单独存在的;
cookie中会有一个sessionid,服务器利用 sessionid
找到session文件、读写、写入 ;
隐患:
session_id劫持
下载安装
npm i express express-static cookie-parser cookie-session
以下的代码自动加上
const express = require('express')
var server = express()
server.listen(8989)
cookie使用【不建议使用这个,不建议去加密cookie】
空间小—节省
安全性差
1、精打细算
2、校验是否被篡改
cookie-parser 签名
cookie-encrypter对cookie加密加密
发送cookie
//cookie
server.use('/',function (req,res) {
//path是在什么路径下有效
//maxAge有效期
res.cookie('user','xxxx',{path:'/aaa',maxAge:30*24*3600*1000})//设置cookie
res.send('ok')
})
读取cookie
cookie-parser
var secretStr='whhhhsnsmjsjsd'
//读取cookie
server.use(cookieParser(secretStr))
server.use('/',function (req,res) {
//给cookie加密
req.secret=secretStr;//签名密钥,不能加密,但是防篡改
res.cookie('user','xxxx',{signed:true});//signed需要签名
// s%3Axxxx.V8iQe9VjTgKlfaXJio3pl5D3knxVWuN1%2F06gosSPXBE
console.log(req.cookies);//无签名的
//可以用decodeURIComponent解析,可以看到,如果修改后可以知道
// console.log(decodeURIComponent('s%3Axxxx.V8iQe9VjTgKlfaXJio3pl5D3knxVWuN1%2F06gosSPXBE'));//s:xxxx.V8iQe9VjTgKlfaXJio3pl5D3knxVWuN1/06gosSPXBE
console.log(req.signedCookies)//所有签过名的
res.send('ok')
})
删除cookie
res.clearCookie(名字)
session使用
cookie-session
//注意这里的代码是会报错的
const express = require('express')
const cookieParser = require('cookie-parser')
const cookieSession = require('cookie-session')
var server = express()
server.listen(8989)
//session
server.use(cookieParser())
server.use(cookieSession())
server.use('/',function (req,res) {
console.log(req.session);
res.send('ok')
})
报错如下
//session
server.use(cookieParser())
server.use(cookieSession({
keys:['aaa','vvv','desssss']
}))
server.use('/',function (req,res) {
console.log(req.session);//{}
res.send('ok')
})
改良后如下:
//session
server.use(cookieParser())
server.use(cookieSession({
keys:['aaa','vvv','desssss']
}))
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')
})
express:sess.sig每次刷新页面都会改变
express:sess每次刷新页面都会改变
//session
server.use(cookieParser())
server.use(cookieSession({
name:'ssess',
keys:['aaa','vvv','desssss'],
maxAge:2*3600*1000,//长时间未操作,时间越短月安全,占用时间越长,服务的压力越大
}))
//...
})
keys可以优化为
var arr = [];
for(var i=0;10000000,i++){
arr.push('sig_'+mMath.random());
}
//--------省略部分代码块
keys:arr
删除session
delete req.session
token
总结:
cookie—存在浏览器【客户端】,4K,不安全,可签名【防篡改】、可加密
const express = require('express')
const cookieParser = require('cookie-parser')
var server = express()
server.listen(8989)
//cookie
var secretStr='whhhhsnsmjsjsd'
//读取cookie
server.use(cookieParser(secretStr))
server.use('/',function (req,res) {
//给cookie加密
req.secret=secretStr;//签名密钥,不能加密,但是防篡改,*这句可不用*
res.cookie('名字','值',{path:'/',maxAge:2,signed:true});//signed需要签名
// s%3Axxxx.V8iQe9VjTgKlfaXJio3pl5D3knxVWuN1%2F06gosSPXBE
console.log(req.cookies);//无签名的
//可以用decodeURIComponent解析,可以看到,如果修改后可以知道
// console.log(decodeURIComponent('s%3Axxxx.V8iQe9VjTgKlfaXJio3pl5D3knxVWuN1%2F06gosSPXBE'));//s:xxxx.V8iQe9VjTgKlfaXJio3pl5D3knxVWuN1/06gosSPXBE
console.log(req.signedCookies)//所有签过名的
//删除cookie
res.clearCookie('名字')
res.send('ok')
})
session—存在服务器,安全,无限大,不能独立存在【基于cookie】