一、token
介绍:令牌,本质是一个字符串(随机生成的位数比较多的字符串,UUID),令牌的作用就是身份识别
1.1什么时候给前端?
登录成功以后,把token给其前端,并且在redis中保存下来设置一个过期时间(免登录)
1.2 前端什么时候用token?
下次请求的时候,我们把token携带到请求头中就可以了
1.3怎么识别token有效?
1.3.1 后端拦截器拦截到前端的每一次请求,并且对比是否携带token(检查时有效)
1.3.1 对一些特别请求,就需要放行
二、JWT
2.1 构成 :有头部、载荷和签名组成。
三、头部(header)
头部用于描述关于该JWT的最基本的信息,例如令牌类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
{"typ":"JWT","alg":"HS256"}
下面有:{"typ":"JWT","alg":"HS256"}
编码后的结果:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
四、载荷(playload)
载荷就是存放有效信息的地方。这些有效信息包含三个部分
1)标准中注册的声明(建议但不强制使用,默认的属性)
iss: jwt签发者
sub: 当前令牌的描述说明
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
2)公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,
因为该部分在客户端可解密.
3)私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该
部分信息可以归类为明文信息。
这个指的就是自定义的claim。比如下面面结构举例中的admin和name都属于自定的claim。这些claim跟JWT
标准规定的claim区别在于:JWT规定的claim,JWT的接收方在拿到JWT之后,都知道怎么对这些标准的claim
进行验证(还不知道是否能够验证);而private claims不会验证,除非明确告诉接收方要对这些claim进行验
证以及规则才行。
定义一个payload:
{"sub":"1234567890","name":"John Doe","admin":true}
base64加密结果是:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
载荷中只有标准声明是参与校验的,公共和私有是不参与校验的。
五、签名(signature)
jwt的第三部分是一个签证信息,用来校验数据是否被篡改,这个签证信息由三部分组成:
1)header (base64后的)
2)payload (base64后的)
3)secret(私钥/盐)
签名 ={ base64(header) + base64(payload) + 私钥(盐)} + HS256算法签名 ={ base64(header) + base64(payload) + 私钥(盐)} + HS256算法