JWT数据结构(二)
一、JWT的数据结构:
形如 xxxxx.yyyyy.zzzzz 有三部分组成,每部分用英文句号连接
即:header(标头).payload(负载).signature(签名)
二、Header(标头部分)
JWT第一部分,是一个JSON 对象, 描述JWT的元数据,通常如下所示。
{ "alg": "HS256", "typ": "JWT" }
表头的组成:
typ属性(type):令牌的类型,JWT 令牌统一写为JWT
alg属性(algorithm):所使⽤的签名算法 如:HMAC、SHA256、RSA
最后,使用Base64 URL编码算法将上述JSON对象转换为字符串保存。
三、payload(负载部分)
JWT第二部分,是一个JSON对象,描述一个声明数据,声明通常是用户有关实体对象或者其他数据。通常如下所示:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
一般是在这个部分定义私有字段: 例如{"userId":"123456","userName":"jack","isAdim":"true"}
其中payload官方规定了7个字段,如下:
iss (issuer):发行人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):用户
nbf (Not Before):生效时间(在此时间之前不可用)
iat (Issued At):发布时间
jti (JWT ID):编号(用户标识该JWT)
注意:JWT 默认是不加密的,任何人都可以解读其内容,所以不要把机密信息放在这个部分,以防信息泄露。 如:用户的密码就不能放在这里
最后,使用Base64 URL编码算法将上述JSON对象转换为字符串保存。
四、signature(签名部分)
JWT的第三部分,是对前两部分进行签名(签名可以理解为:加盐),防止数据的篡改。通常如下所示:
HMACSHA256 (base64Ur1Encode(header) + "." + base64Ur1Encode(payload) , secret);
secret:密钥(密钥绝对⾃⼰保管好,签名值同样做Base64编码,该secret仅仅保存在后端服务器中,不能泄露给客户端)