1:传统的session认证
- http是一种无状态的协议,每次都得我们用户手动的去进行认证,根据http协议,我们并不知道当前的这一份请求是哪一个用户发出的,所以我们能够让我们的应用能够识别出来是哪一个用户发起的请求,我们只能在服务器端存放一份用户登录的信息,这份登录的信息在响应的时候会传递给浏览器,并且告诉他保存为cookie,以便下一次的请求的回收发送给我们的应用,这就是我们的session认证
- 缺点
- 内存受到限制,session放在内存中,随着用户的增多,性能会收到限制
- 记录保存在内存中,在分布式的系统中,下一次的请求必须还要在这个服务器才能拿到资源,限制了负载均衡的能力
- 基于cookie做识别的,如果cookie被篡改,很容易被攻击
- 在前后端分离的系统中
- CSRF,跨站伪造请求攻击,如果cookie被拦截,很容易被攻击
- 用户的一次请求需要转发多次,如果使用sessionID,每次都要查询用户的信息,给服务器增加负担
2:JWT
- 用户通过账号,密码进行登录,获得认证
- 我们生成一个JWT返回给用户,同时JWT也会进行本地的保存
- 每次访问的时候,携带JWT,我们拦截器会对JWT进行拦截
- 如果成功,就执行响应的业务逻辑处理
- 如果失败,则返回错误的信息
1:认证的流程
- 账号,密码发送到后端的接口,http post请求
- 后端核对后,将用户的ID和其他信息作为JWT payload,并且和头部进行base64的编码后签名,形成一个token。
- token: head,payload,签名
- 后端将jwt字符串返回给前端,前端可以保存在缓存中,退出的手删除
- 前端每次请求的时候将JWT放在header中的授权位
- 后端检查是否存在,如果存在验证他的有效性,和时效性
2:结构
- 表头.payload.signature
- 标头:当前的JWT类型和所使用的签名 HS256
- 声明:用户和其他数据,同样使用base64的编码
- 不要放比较敏感的信息
- 签名:对前两部分做加密,HS256,保证JWT没有被篡改过