首先不得不提到一个知识叫做跨域身份验证,JWT的出现就是为了更好的解决这个问题,但是在没有JWT的时候,我们一般怎么做呢?一般使用Cookie和Session,流程大体如下所示:
1、用户向服务端发送用户名和密码进行验证
2、服务端验证之后,相关数据(如用户角色、登录时间等信息)会保存在当前的Session中
3、服务端向用户返回一个唯一的session_id,同时在响应请求中设置cookie,属性名为jessionid
4、客户端收到之后会保存jessionid,再次请求的时候,会在header中设置,服务端可以从请求头中获取
5、服务端验证获取到的sessionid是否存在,即可验证是否是同一用户
使用Cookie和Session这种模式最大的问题之一就是它不支持横向扩展,也就是不支持分布式架构,如果当前只有一台服务器,那就没什么问题,但是在当下的时代,一台服务器往往是不够的,现在绝大多数都是服务器集群。如果是服务器集群,那么在负载均衡的时候就不能保证每次都发送到同一台服务器上,这样的话也就不能验证用户的身份了,但是这对用户是不友好的,用户是感知不到自己的请求发送到了别的服务器上的。
所以这个时候就提出来了让session落库,当一个请求发过来之后,验证服务从数据库去验证用户身份,这样就能让各个服务器正确的验证用户身份信息,但是这样做,依赖性太强,如果这个session数据库挂了,那么整个认证系统都会崩溃。
![](/images/780-200-2.jpg)