Session原理
- HTTP是一种无状态协议,每次服务器端接受到的请求都是全新的请求,session和cookie就是为了弥补HTTP的无状态
- Session是保存在服务器端的,客户端请求服务端,服务端会生成一个sessionId,并通过set-cookies响应头命令,向客户端发送要求设置的cookies,客户端会根据set-cookies讲sessionID保存在前端,下次请求的时候会带上sessionId
- 后端根据浏览器传过来的sessionId进行身份验证
Session缺点
加大服务器压力,服务器需要存储session
当A服务器存了session,A访问量激增,A做了负载均衡,将请求转发到B服务器,B服务器没有存储session,就会使请求失败
Cookie原理
cookie是服务器端通过Set-Cookies推送给浏览器的,浏览器会把cookie存储在本地,然后下次发请求会带上cookie.
cookie有两种类型,一种会话cookies,一个永久cookies.会话cookie储存在内存中,浏览器关闭后会丢失。持久cookie保存到磁盘,只有过期之后才会作废。
cookie属性
domain:cookie绑定的域名,如果没有设置,就会绑定到当前域
secure:设置为true,cookie只能在https等安全协议下传输
httpOnly: 设置为true,不允许js获取cookie,防止XSS攻击
sameSite: 来限制第三方Cookie。
JWT
token是一个令牌,浏览器第一次访问服务器的时候会签发一张令牌
TOKEN认证流程:
- 客户端用用户名和密码登录
- 2.服务器收到请i去,验证用户名和密码
- 验证成功后,服务器会签发一个TOken,一般token由用户信息,时间戳和加密算法的签名组成
- 客户端收到token之后把它储存下俩,比如放在cookie或者Local Storage里面
- 之后每次请求带上token
- 服务器验证token
session-cookie缺点
认证方式只局限于浏览器端,在app中无法使用cookie
在服务器分布式环境下,需要给每个服务器备份,增加服务器陈本
在http中使用cookie容易收到CSRF跨站点请求伪造攻击
token缺点
加密解密消耗,使得token认证比session-cookie更消耗性能
token比session大,站贷款
区别
- token不仅仅限于cookie,所以支持多端认证
- 不使用cookie可以避免CSRF攻击
token不需要存储,token中包含了用户信息,服务器端变成无状态
JWT
JWT由header,payload和signature组成
JWT支持跨域验证JWT缺点:
服务器是不保存状态的,所以JWT一旦生成是没有办法取消的
- JWT本身包含了认证信息,一旦泄密,就会被盗用,所以一般会设置一个比较短的有效期
- JWT一般配合https协议传输
单点登录
多个系统只需要登录一次就可以
需要有一个SSO认证中心
系统A在SOO认证成功
系统B再登录的时候,会转发到SSO认证中心,如果认为已经登录过了,就不用重新登录