一、背景引入
由于Http协议本身是无状态的,那么服务器是怎么识别两次请求是不是来自同一个客户端呢,传统用户识别是基于seeion和cookie实现的。大致流程如下:
![ff5c59561728392427f6ea7b5ac3e932.png](https://i-blog.csdnimg.cn/blog_migrate/701c4d28e9abed7425104b5c6fde7baa.jpeg)
- 用户向服务器发送用户名和密码请求用户进行校验,校验通过后创建session绘画,并将用户相关信息保存到session中服务器将sessionId回写到用户浏览器cookie中用户以后的请求,都会鞋带cookie发送到服务器服务器得到cookie中的sessionId,从session集合中找到该用户的session回话,识别用户
这种模式有很多缺点,对于分布式架构的支持以及扩展性不是很好。而且session是保存在内存中,单台服务器部署如果登陆用户过多占用服务器资源也多,做集群必须得实现session共享的话,集群数量又不易太多,否则服务器之间频繁同步session也会非常耗性能。当然也可以引入持久层,将session保存在数据库或者redis中,保存数据库的话效率不高,存redis效率高,但是对redis依赖太重,如果redis挂了,影响整个应用。还有一种办法就是不存服务器,而是把用户标识数据存在浏览器,浏览器每次请求都携带该数据,服务器做校验,这也是JWT的思想。
二、JWT介绍
2.1 概念介绍
Json Web Token(JWT)是目前比较流行的跨域认证解决方案,是一种基于JSON的开发标准,由于数据是可以经过签名加密的,比较安全可靠,一般用于前端和服务器之间传递信息,也可以用在移动端和后台传递认证信息。
2.2 组成结构
JWT就是一段字符串,格式如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIn0.qfd0GelhE1aGr15LrnYlIZ_3UToaOM5HeMcXrmDG
由于三部分组成,之间用"."接。第一部分是头信息Header,中间部分是载荷Payload,最后部分是签名信息Signature。
头信息Header:描述JWT基本信息,typ表示采用JWT令牌,alg(algorithm)表示采用什么算法进行签名,常见算法有HmacSHA256(HS256)、HmacSHA384(HS384)、HmacSHA512(HS512)、SHA256withECDSA(ES256)、SHA256withRSA(RS256)、SHA512withRSA(RS512)等。如果采用HS256则头信息结构为:
{ "typ": "JWT