场景:http是一种<font color="#e74f4c">无状态协议</font>,不对请求或响应做持久化处理,确保协议的<font color="#e74f4c">可伸缩性</font>
解决方案
cookie
客户端第一次发送请求
服务器进行cookie设置(set-cookie首部),返回一个加密的cookie
浏览器保存cookie(包括名(name)和值(value)),后续请求携带cookie(cookie首部)
性质
优点
不需要在服务器存储客户端的数据
占用资源小
可拓展性高
缺点
不安全,获取cookie后可以直接伪造登录状态
cookie一般比sessionID大,传输占用资源
禁用cookie:可将信息放入url的params中,通过重写url传递
session
客户端第一次发送请求
服务器创建session对象,产生sessionID
服务器进行cookie设置(set-cookie首部),在其中加入sessionID,将会话时间设置为cookie有效期并返回
服务器将sessionID保存在服务器文件或数据库中
浏览器保存cookie(此时保存的是sessionID),后续请求只有cookie的sessionID有实际效益
会话结束后浏览器删除cookie,用户需要重新输入账号密码
性质
缺点
需要在服务端存储数据,可能面临分布式问题,且占用资源较大
<font color="#e74f4c">token(JWT-Jason Web Token)</font>
客户端第一次发送请求
服务器生成JWT
JWT内容
payload-负载
特定数据,例如有效期、用户名等
signature-签名
header和payload进行Base64编码后按照header的算法加密,生成signature签名信息定义秘钥
服务器保存JWT签名密文(密钥),将JWT发送给客户端
客户端将JWT按照cookie或session或LocalStorage的方式存储
下次登录时将token放在Authorization中或者cookie中,服务端收到token后使用密钥解密确认身份
放在cookie中
依赖后端set-cookie响应头
可以用HttpOnly防止cookie被JS捕获,避免<font color="#e74f4c">XSS攻击</font>
存在<font color="#e74f4c">CSRF攻击</font>问题
放在请求头Authorization字段中(JWT认证规范要求)
由JS代码写入
JS添加全局拦截器,天然防止CSRF攻击
Nodejs不支持cookie,可以由JS写入Secure、Expires功能
性质
优点
安全
无状态实现
服务器端只存储密钥,占用资源小
缺点
服务器不掌握客户端状态,无法主动踢出用户登录