熊 玉
合肥科技研发中心
由于Http协议本身是无状态的,那么服务器是怎么识别两次请求是不是来自同一个客户端呢,传统用户识别是基于seeion和cookie实现的。大致流程如下:
上述常用的做法,客户端在服务端登陆成功之后,服务端会生成一个sessionID,返回给客户端,客户端将sessionID保存到cookie中,再次发起请求的时候,携带cookie中的sessionID到服务端,服务端会缓存该session(会话),当客户端请求到来的时候,服务端就知道是哪个用户的请求,并将处理的结果返回给客户端,完成通信。
通过上面的分析,可以知道传统的做法存在以下缺点:
对于分布式架构的支持以及扩展性不是很好。
session是保存在内存中,单台服务器部署如果登陆用户过多占用服务器资源也多。
集群必须得实现session共享的话,集群数量又不易太多,否则服务器之间频繁同步session也会非常耗性能。
从而引出:用户标识数据存在浏览器,浏览器每次请求都携带该数据,服务器做校验,这也是JWT的思想。
01
JWT概念和组成结构
什么是JWT:Json Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,简称JWT,在HTTP通信过程中,进行身份认证。JWT是目前比较流行的跨域认证解决方案,是一种基于JSON的开发标准,由于数据是可以经过签名加密的,比较安全可靠,一般用于前端和服务器之间传递信息,也可以用在移动端和后台传递认证信息。
组成结构:JWT就是一段字符串,格式如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIn0.qfd0GelhE1aGr15LrnYlIZ_3UToaOM5HeMcXrmDG由三部分组成,之间用"."接。
头信息、载荷、签名如下:
02
JWT验证流程
下图演示一次post请求的验证过程, 用户端登录成功后,服务器会生成一个token给到用户端,token里面包含用户信息(用户id),发送POST携带该token进行请求访问,服务器从用户的请求中成功解析token信息,则说明用户的请求合法有效,反之服务器从token解析不出用户信息就认为请求非法失效。
03
案例演示
1、生成加密公钥私钥,RS256加密算法公钥私钥生产:openssl命令生成(git的客户端gitbash上面运行或安装jdk的机器上面cmd运行命令)。
第一步:生成私钥,这里我们指定私钥的长度为2048,openssl genrsa -out rsa_private_key.pem 2048 ;
第二步:根据私钥生成对应的公钥:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key_2048.pub ;
第三步:私钥转化成pkcs8格式:openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt > rsa_private_key_pkcs8.pem 。
2、源码展示
加密函数:
解密函数:
运行结果如下图:加密前后信息一致,解析正确可识别当前访问用户。
以上给大家简单分享的JWT加密算法的基本概念和优点,从编程实现的角度做了具体demo代码实现,工作中会面对不同的业务应用场景,应当结合实际使用。