一、会话管理
HTTP协议是一个无状态的协议,它无法区分多次请求是否发送自同一客户端。
cookie,session,token用来管理会话,识别用户身份。
二、cookie
1、本质
存储在浏览器的文本,随着http请求自动传递给服务器。(请求头/响应头)
2、运作流程
cookie由服务器生成发送到客户端,客户端以key-value形式保存在本地的一小块数据,在下一次请求同一网站时会把该cookie发送给服务端。
3、cookie中重要参数
参数 | 说明 | 后端 |
---|---|---|
Domain | 指定 cookie 所属域名,默认是当前域名 | cookie.setDomain("") |
Max-Age | 设置cookie的过期时间,单位为秒 | cookie.setMaxAge(10) |
Path | 指定 cookie 在哪个路径(路由)下生效,默认是 ‘/’ | cookie.setPath("") |
HttpOnly | 如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全 | cookie.setHttpOnly(true) |
Secure | 告诉浏览器此Cookie只能在Https安全协议中传输,如果是Http则禁止传输 | cookie.setSecure(true) |
4、使用
// 引入express工具
const express =require('express');
// 1、引入 cookieParser 包
const cookieParser = require('cookie-parser');
// 创建应用对象
const app = express();
// 2、设置 cookieParser 中间件
app.use(cookieParser());
// 3、创建路由规则
app.get('/set-cookie', (request, response) => {
// 设置 cookie
response.cookie('username','zhangsan', {maxAge: 5*60*1000});
// 设置生命周期 单位毫秒
// 响应
response.send('Cookie的设置');
});
// 读取 cookie
app.get('/get-cookie', (request, response) => {
console.log(request.cookies);
response.send('Cookie的读取');
});
// 删除cookie
app.get('/delete-cookie', (request, response) => {
response.clearCookie('username');
response.send('成功退出登录');
});
// 启动服务
app.listen(80);
三、session
1、本质
存储在服务器端的一个对象,可以理解为一个状态列表 ,他们拥有一个唯一标识符号sessionId。
2、运作流程
通常存放于 cookie 中。服务器收到 cookie 后解析出 sessionId,再去 session 列表中查找,才能找到相应session。
3、使用
// 1、下载安装
npm i connect-mongo express-session --save
// 2、引入模块
var session = require("express-session");
// 3、设置为中间件
app.use(session({
name: 'id22', //设置cookie的name,默认值是:connect.sid
secret: 'atguigu', //参与加密的字符串(又称签名)
saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
resave: false ,//是否在每次请求时重新保存session
cookie: {
httpOnly: true, // 开启后前端无法通过 JS 操作
maxAge: 1000*30 // 这一条 是控制 sessionID 的过期时间的
},
}));
四、cookie和session区别
1、存在的位置
cookie 存在于客户端,临时文件夹中。
session 存在于服务器的内存中,一个session域对象为一个用户浏览器服务。
2、安全性
cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放。
session存放于服务器的内存中,所以安全性好。
3、网络传输量
cookie会传递消息给服务器。
session通过传id,递流量小。
4、生命周期(以20分钟为例)
cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束。
session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁;但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期。
关机会造成session生命周期的结束,但是对cookie没有影响。
5、大小
cookie数量大小限制,数量不超过50个,单个大小<4kb
session 保存数据理论上没有任何限制(内存有多大就能有多大)
五、token
token 类似一个令牌,无状态,用户信息都被加密到 token 中,服务器收到 token 后解密就可知道是哪个用户。需要开发者手动添加。
Token与session的区别
1、Session是记录会话信息,token是令牌,访问资源接口所需要的的凭证,token使服务器端无状态化,不会存储会话信息。
2、Token的安全性比session好。因为token每一个请求都有签名还能防止监听以及重放攻击,而 session 是依赖链路层来保障通讯安全的。
3、Token 是唯一的。不可以转移到其它 App上,也不可以转到其它用户上。session 只提供一种简单的认证,即只要有此 sessionID ,即认为有此 User 的全部权利。