一、为什么使用JWT
HTTP是无状态的,开发人员需要基于HTTP来模拟实现状态的保存。经典的实现用户登录的做法是用Session,用户登录验证成功后,服务端生成SessionId。服务端会将SessionId与登录的用户信息的对应关系保存在服务器内存中,同时将SessionId返回给浏览器端,sessionId一般存储在浏览器Cokiee中,浏览器端的每次请求都携带SessionId,服务端可以通过SessionId从服务器的内存中取到用户信息,这就实现了用户登录功能。对于分布式集群环境,Session数据一般保存到所有集群实例都能访问的状态服务器上,如Redis、Memcached、关系数据库等。
但是,在分布式环境下,特别是在“前后端分离、多客户端”时代,Session暴露出很多问题。
1. 如果session数据存储到内存中,当登录用户量很大的时候,Session数据就会占用非常多的内存,且无法支持分布式集群环境。
2. 如果Session数据保存到Redis等状态服务器中,它可以支持分布式集群环境,但是没遇到一次客户端请求都要向状态服务器获取一次sessions数据,会导致请求的响应速度变慢。
二、JWT是什么
JWT全称是JSON Web Token,JWT是使用json格式来保存令牌信息的。JWT是将登录信息保存到客户端(解决了以上session暴露出的问题),为防止数据造假,保存在客户端的令牌经过了签名处理,签名的密钥只有服务端知道。每次服务端接收到客户端提交的令牌的时候都会检查一下签名,检查签名通过,对令牌进行解码,服务端从而知道当前登录信息,若发现数据被篡改,则拒绝接受客户端提交的令牌。
JWT分为头部header、负载payload、签名sinature三部分。header保存加密算法的说明,payload保存的是用户基本信息,signature是根据header和payload一起算出来的值。