数据格式是这样的 header.payload.signature

jwt里面的内容可以用在前端上,比如说payload里面包含的用户名(name),你可以直接显示在前端,不需要在后端查询了 ,注意每个数据中间都用 点 分割开来

用户解码获取里面的数据再重新加密生成的jwt不能通过后端的验证通过,因为用户不知道后端签发jwt时候用的哪个密钥.

JWT的结构 - 图1

1.header



header描述了应用于jwt的密码操作,以及jwt的附加属性, header extends 了map集合,所以可以根据自己的需求put内容进去.

需要注意,

可以实例化一个header对象 然后 JwtBuilder setHeader进去 , 也可以组成map集合用重载方法setHeader进去,具体看源码
JWT的结构 - 图2
alg
是指定加密的算法,比如 HMAC SHA256 或者RSA

typ
声明MIME媒体类型的,使用jwt的应用程序可以使用此值消除不同类型(应该是MIME媒体类型)之间的歧义,

建议参数是 “JWT” 来表示这个对象是一个jwt token ,虽然媒体类型不区分大小写,但是建议typ始终用大写拼音.

最后,这个参数是可写可不写的.

cty
由[JWS]和[JWE]定义的”cty”(内容类型)头参数
此规范用于传达有关的结构信息吗
JWT。
在嵌套签名或加密操作的正常情况下
如果未使用此标题参数,则不建议使用此标题参数。
在使用嵌套签名或加密的情况下,这样做
头参数必须存在;在本例中,值必须是
“JWT”,表示该JWT中携带一个嵌套JWT。而
媒体类型名称不区分大小写,建议使用“JWT”
始终使用大写字母拼写,以便与之兼容
遗留实现。有关嵌套的示例,请参见附录a .2
JWT。

2.payload(有效载荷)

在payload数据块中一般用于记录实体(通常为用户信息)或其他数据的。主要分为三个部分,分别是:已注册信息(registered claims),公开数据(public claims),私有数据(private claims)

已注册信息是在jwt中已经注册声明好的标准信息,比如说发行者是谁,到期时间是什么时候,受众(谁能使用)

公开数据和私有数据可以由程序员任意定义,也就是说你可以结合业务随便写,但是需要注意不要和已注册信息重名

payload可以放一些非敏感的用户有效信息,比如用户名什么的,可以尽量的减少查数据库的次数.当然也可以不传递任何数据,直接返回空数据

注意:即使JWT有签名加密机制,但是payload内容都是明文记录,除非记录的是加密数据,否则不排除泄露隐私数据的可能。不推荐在payload中记录任何敏感数据。


Payload
payload是主体部分,意为载体,承载着有效的jwt数据包,它包含三个部分
1. 标准声明(claim)
2. 公共声明
3. 私有声明

标准声明的字段有:
1. iss token的发行者
2. sub 该jwt所面向的用户
3. aud 接收该jwt的一方
4. exp token的失效时间
5. nbf 在此时间段之前,不会被处理
6. iat jwt发布时间
7. jti jwt唯一标识,防止重复使用

标准中建议使用这些字段,但不强制


JWT的结构 - 图3

Claim

playload用来承载要传递的数据,它的一个属性对被称为claim,这样的标准成为claims标准,同样是将其用Base64Url编码

claim有标准的默认属性,包括(iss , sub ,aud ,exp ,nbf ,iat ,jti) , 你也可以往里面添加业务需要的信息属性,因为claim extends Map 所以用面下代码添加自定义属性:

JwtBuilder builder = Jwts.builder() .setClaims(map集合数据)



解析的时候直接获取Claims对象.get(key) 来获取value属性了,需要注意的必须JWT是没过期的状态才可以取出来,如果过期了,将无法从payload里面取出Claims

public static Claims getClaimFromToken(String token) {
return Jwts.parser()
.setSigningKey(JwtConstants.SECRET)
.parseClaimsJws(token)
.getBody();
} Claims claims = JwtTokenUtil.getClaimFromToken(token);
Object identification1 = claims.get(“identification”);
String subject = claims.getSubject();
Object accountType = claims.get(“accountType”);
Date expiration = claims.getExpiration();


iss(发行者)

iss是jwt签发者,一般填写一个http(s),比如 https://www.baidu.com
在token的验证过程中,会将它作为验证的一个阶段,如果无法匹配将会造成验证失败,最后返回HTTP 401 .
iss的值是区分大小写的字符串,包含一个字符串或者url,

说明:这个是可以不设置的

JwtBuilder builder = Jwts.builder().setIssuer(ISSUER) // 签发者

sub(主题)


存放用户信息,可以给用户信息转成json字符串存放起来

说明: 这个是可以不设置的

JwtBuilder builder = Jwts.builder().setSubject(subject) //

aud(受众)

声明接收jwt的接收人,

从百度的意思上,应该是存放接收jwt的客户端的信息,具体用处不得而知了.

说明:这个可以不设置
Jwts.builder().setAudience(aud)

exp(到期时间)

设置jwt的过期时间,它的值必须是一个数字

说明: 这个可以不设置 , 但是为了token的安全,必须得设置,而且设置时间不能过长

形参是Date类型的,一般毫秒值转成Date类型后进行设置
Jwts.builder.setExpiration(expDate)

/
生成token(通过用户名和签名时候用的随机数)

*
@param subject 主题
*
@param expirationLong 过期时间(单位: 秒 也就是说 写60 就是 1分钟)
*
@return
*/
public static String generateTokenSubjectExpiration(String subject, Long expirationLong) {
final Date createdDate = new Date();
//过期时间
final Date expirationDate = new Date(createdDate.getTime() + expirationLong * 1000);

return Jwts.builder()

.setSubject(subject)
.setIssuedAt(createdDate)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.
HS512, JwtConstants.SECRET**)
.compact();
}


nbf

设置可用时间,在这个时间之前token都是有效的,过了这个时间token就不能使用了,一般没什么用处.因为我们可以主动设置过期时间.


形参是Date类型的,一般毫秒值转成Date类型后进行设置
Jwts.builder.setNotBefore(nbf)

iat

jwt的签发时间,这个声明是可以确定jwt的年龄的

说明:可以不设置
形参是Date类型的,一般给当前系统时间设置进去

JwtBuilder builder = Jwts.builder().setIssuedAt(now)

jti

是jwt的唯一身份标识,主要用来作为一次性的token,从而回避重放攻击,可以用uuid进行设置
Jwts.builder() .setId(UUID.randomUUID().toString().replaceAll(“-“, “”))

说明: 这个是可以不设置的,不设置的话可能会出现相同的值,当然出现的概率可以忽略不计


其它内容

name
admin 都是程序员自己设定进去的东西

PAYLOAD也要用base64编码.

3.signature(签名)



安全性保障签名信息。这是一个由开发者提供的信息。是服务器验证的传递的数据是否有效安全的标准。在生成JWT最终数据的之前。先使用header中定义的加密算法,将header和payload进行加密,并使用点进行连接。如:加密后的head.加密后的payload。再使用相同的加密算法,对加密后的数据和签名信息进行加密。得到最终结果。

signature 是签证信息,该签证信息是通过header和payload,加上secret(密钥),通过算法加密生成。

公式 signature = 加密算法(header + “.” + payload, 密钥);

上面的 header 中,我们已经定义了加密算法使用 RS256,也已经实现了生成header和payload,下面我们来生成 signature