- Session就是后端生成的一个唯一值,常用的就是后端生成一个guid返回给前端,这个guid被称为sessionId,大概的实现就是先验证登录信息,登录信息验证成功,后端生成sessonId,返回给前端,后端经sessionId存储到自己能读取的地方,之后,前后端交互就要校验sessionid,从这个层面上来说,sessionId就是一个通行证,并且通行证很有可能是带有效期的。
- 对于分布式集群环境,Session数据保存在服务器内存中显然是不对的,因为多个后端服务节点,是没用办法共享内容的,所以这时候,session数据应该放到一个中心状态服务器上,一般就是Redis、Memcached等
- 中心状态服务器在大规模系统中,其实也会有性能问题
基于以上对session的介绍和分析,在实际开发中,后续引入了JWT(JsonWebToke)的概念
- JWT把登录信息(也称作令牌)保存在客户端
- 为了让防止客户端的数据造假,保存在客户端的令牌经过了签名处理,而签名的密钥只有服务端才知道,每次服务端收到客户端提交的令牌的时候,都要检查一下签名
Session跟Jwt的区别在于,sessionId后端生成后,后端都需要存储,一般通过登录名(或用户id)作为key来存储sessionId,前端请求到后端,后端需要根据用户登录名(或用户id)作为key去读取相关sessionId,并验证其是否过期。
而JWT是后端生成,前端存储,后端无需存储,前端传递给后端之后,后端需要经过算法,才能知晓令牌是否合法,是否过期;这时令牌其实是密文令牌。
基于上边的介绍,我理解jwt是用计算资源换取了后端的存储资源,这样,不需要和中心状态服务器进行通讯,性能会更高;而且也不会再出现中心状态服务器的性能瓶颈问题,更容易平行拓展。由于签名技术保证了客户端无法数据造假,