第二部分是荷载信息,Payload,你可以理解为我们的JWT是一辆大仓库,第一部分头部就是仓库的名称编号等基础信息,而荷载信息就是仓库的本身,包含了仓库里面的所有货物。这些信息又包含了三个部分:
标准中注册的声明
公共的声明
私有的声明
标准中注册的声明 (建议但不强制使用) :iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
公共的声明 :公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要息。但不建议添加敏感信息,因为该部分在客户端可解密。
私有的声明 :私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
事实上我们的Header和Payload都是基于base64加密的,这种密文都是可以对称解密的,因此请不要存放敏感信息。
定义一个payload:
{ "sub": "1234567890", "name": "John Doe", "admin": true }进行base64加密后,得到了我们的第二部分
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9 SignatureJwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)
payload (base64后的)
secret
这一部分可以理解为对前部分的一个校验,将前两部分加密后的密文通过在Header中定义的加密方式,与服务端所传入的密钥进行一次加密,假如前两部分的信息被篡改的话,必然通不过最后一部分签证的校验。因此通过这样保证了Jwt的安全性。
因此,保存并隐藏好我们的加密密钥是非常重要的,假设泄露了,就意味着任何知道密钥的人都可以轻松的对jwt进行自我签发和验证。