什么是http无状态
http无状态是指http的每一次请求都是一次单独的请求
比如:…
http无状态的优点
- 不需要额外的资源来记录状态信息,不仅实现上会简单一些,而且还能减轻服务器的负担。
- 对于有状态协议来说,如果将会话状态与连接绑定在一起,那么如果连接意外断开,整个会话就会丢失,重新连接之后一般需要从头开始
http无状态的缺点
因为每个请求都是独立的,所以单个请求需要的所有信息都必须要包含在请求中一次发送到服务端,这导致单个消息的结构需要比较复杂,必须能够支持大量元数据
解决http无状态的方案
1.cookie
身份验证流程:
1.用户向服务器发送用户名和密码。
2.验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中。
3.服务器向用户返回session_id,session信息都会写入到用户的Cookie。
4.用户的每个后续请求都将通过在Cookie中取出session_id传给服务器。
5.服务器收到session_id并对比之前保存的数据,确认用户的身份。
2. Session
session一般来说要配合cookie使用,因为用户信息存储到cookie也就是浏览器上面很不安全,就出现了session
session是在服务端建一个表,里面存储了用户信息,每次根据sessionid去表里面查用户
session的工作原理
- 用户第一次请求服务器时,服务器端会生成一个sessionid
- 服务器端将生成的sessionid返回给客户端,通过set-cookie
- 客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid
- 当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid,不存在就新建一个sessionid重复1,2的流程,如果存在就去遍历
- 服务端的session文件,找到与这个sessionid相对应的文件,文件中的键值便是sessionid,值为当前用户的一些信息
- 此后的请求都会交换这个 Session ID,进行有状态的会话。
Session的弊端:
Session 信息存到服务器,必然占用内存。用户多了以后,开销必然增大。为了提高效率,需要做分布式,做负载均衡。
3. Token
Token 传递的过程跟 Cookie 类似,只是传递对象变成了 Token
- 用户使用用户名、密码请求服务器后,
- 服务器生成 Token并在响应中返给客户端。
- 客户端再次请求时附带上 Token,服务器取到 Token 进行认证鉴权。
- 认证通过,服务器返回数据。认证不通过,跳转登陆。
4. JWT
具体流程:
- 客户端使用账户密码请求登录接口
- 登录成功后服务器使用签名密钥生成JWT ,然后返回JWT给客户端。
- 客户端再次向服务端请求其他接口时带上JWT
- 服务端接收到JWT后验证签名的有效性.对客户端做出相应的响应
和token的区别
Token需要查库验证token 是否有效,而JWT不用查库或者少查库,直接在服务端进行校验,并且不用查库。因为用户的信息及加密信息在第二部分payload和第三部分签证中已经生成,只要在服务端进行校验就行,并且校验也是JWT自己实现的。
为什么JWT不用验证token是否有效
jwt的查询流程
-
解析JWT
-
判断签名是否正确,根据生成签名时使用的密钥和加密算法,只要这一步过了就说明是payload是可信的
-
判断JWT token是否过期,根据exp,判断是否是VIP,根据isVip
JWT版是没有查库的,他所需要的基础信息可以直接放到JWT里,服务端只要判断签名是否正确就可以判断出该用户是否可以访问该接口,当然JWT里的内容也不是无限多的,其他更多的信息我们就可以通过id去查数据库