![f71ea52cf7d4dd6f66eda99167999fe7.png](https://i-blog.csdnimg.cn/blog_migrate/a576d5504f3d15785008e2e02b17eea2.jpeg)
熊 玉
合肥科技研发中心
由于Http协议本身是无状态的,那么服务器是怎么识别两次请求是不是来自同一个客户端呢,传统用户识别是基于seeion和cookie实现的。大致流程如下:
![83ae9dfc538b91f265e86cd920da9f07.png](https://i-blog.csdnimg.cn/blog_migrate/03889fe10fe82e7810b1a7600be9c50e.png)
上述常用的做法,客户端在服务端登陆成功之后,服务端会生成一个sessionID,返回给客户端,客户端将sessionID保存到cookie中,再次发起请求的时候,携带cookie中的sessionID到服务端,服务端会缓存该session(会话),当客户端请求到来的时候,服务端就知道是哪个用户的请求,并将处理的结果返回给客户端,完成通信。
通过上面的分析,可以知道传统的做法存在以下缺点:
对于分布式架构的支持以及扩展性不是很好。
session是保存在内存中,单台服务器部署如果登陆用户过多占用服务器资源也多。
集群必须得实现session共享的话,集群数量又不易太多,否则服务器之间频繁同步session也会非常耗性能。
从而引出:用户标识数据存在浏览器,浏览器每次请求都携带该数据,服务器做校验,这也是JWT的思想。
01
![e83567dba8953094f8f3f18d11851637.png](https://i-blog.csdnimg.cn/blog_migrate/9433368368205900dd30a0b9128be0a2.png)
JWT概念和组成结构
什么是JWT:Json Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,简称JWT,在HTTP通信过程中,进行身份认证。JWT是目前比较流行的跨域认证解决方案,是一种基于JSON的开发标准,由于数据是可以经过签名加密的,比较安全可靠,一般用于前端和服务器之间传递信息,也可以用在移动端和后台传递认证信息。
组成结构:JWT就是一段字符串,格式如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIn0.qfd0GelhE1aGr15LrnYlIZ_3UToaOM5HeMcXrmDG由三部分组成,之间用"."接。
![8f59aabd9ce8bf7a0e397a52daa4372f.png](https://i-blog.csdnimg.cn/blog_migrate/6722ca47f72bb0a04fe67036238b7a48.png)
头信息、载荷、签名如下:
![5e58d1c87a95506e0ce3ca86a9101891.png](https://i-blog.csdnimg.cn/blog_migrate/2e79a08f44bc11c175db239a14ba7617.png)
![7f7daef8655af194d3fa34a3899e5e47.png](https://i-blog.csdnimg.cn/blog_migrate/6303be912d48a84dfece937fdf957866.png)
02
![e83567dba8953094f8f3f18d11851637.png](https://i-blog.csdnimg.cn/blog_migrate/9433368368205900dd30a0b9128be0a2.png)
JWT验证流程
下图演示一次post请求的验证过程, 用户端登录成功后,服务器会生成一个token给到用户端,token里面包含用户信息(用户id),发送POST携带该token进行请求访问,服务器从用户的请求中成功解析token信息,则说明用户的请求合法有效,反之服务器从token解析不出用户信息就认为请求非法失效。
![5a0ca142706550527ebe5ae4abde0251.png](https://i-blog.csdnimg.cn/blog_migrate/207b5d98902f250679d9ceb4a7745f66.png)
![b7e595f525c3e02e607af517d73692ee.png](https://i-blog.csdnimg.cn/blog_migrate/d5bac9bde7e0c5de31aa53b721227ac8.png)
03
![e83567dba8953094f8f3f18d11851637.png](https://i-blog.csdnimg.cn/blog_migrate/9433368368205900dd30a0b9128be0a2.png)
案例演示
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、源码展示
加密函数:
![0b02c2ee6802d5e61b2bd2ad78863b73.png](https://i-blog.csdnimg.cn/blog_migrate/07411379442c8aee19c5722247f3c30b.png)
解密函数:
![962c28bf2f5b59eaeea3e38905b06287.png](https://i-blog.csdnimg.cn/blog_migrate/a37dd43f2ca64619d0a7491f55a83886.png)
运行结果如下图:加密前后信息一致,解析正确可识别当前访问用户。
![fdf20e248fab41d458785b4edef0b314.png](https://i-blog.csdnimg.cn/blog_migrate/c1555c4cc7e839c14cb057f8fb73aa3c.png)
![0e3cff8150bbee54afa214c7a9f216ea.png](https://i-blog.csdnimg.cn/blog_migrate/fe879a5c40b66ff98b04cf10f4b11c6c.png)
![0e3cff8150bbee54afa214c7a9f216ea.png](https://i-blog.csdnimg.cn/blog_migrate/fe879a5c40b66ff98b04cf10f4b11c6c.png)
![e83567dba8953094f8f3f18d11851637.png](https://i-blog.csdnimg.cn/blog_migrate/9433368368205900dd30a0b9128be0a2.png)
以上给大家简单分享的JWT加密算法的基本概念和优点,从编程实现的角度做了具体demo代码实现,工作中会面对不同的业务应用场景,应当结合实际使用。
![aa856ae531883bf466f2f47a74119d71.gif](https://i-blog.csdnimg.cn/blog_migrate/91f8222235291f35ff999e1d6c5f7700.gif)
![534e592d37c6b22f8ec2d19f18fdd4c7.gif](https://i-blog.csdnimg.cn/blog_migrate/bb4870ffed3e430c6181bb01521260ae.gif)