Jwt全称是:json web token。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
优点
简洁: 可以通过URL、POST参数或者在HTTP header发送,因为数据量小,传输速度也很快;
自包含:负载中可以包含用户所需要的信息,避免了多次查询数据库;
因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持;
不需要在服务端保存会话信息,特别适用于分布式微服务。
缺点
无法作废已颁布的令牌;
不易应对数据过期。
一、Jwt消息构成
1.1 组成
一个token分3部分,按顺序为
头部(header)
载荷(payload)
签证(signature)
三部分之间用.号做分隔。例如:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxYzdiY2IzMS02ODFlLTRlZGYtYmU3Yy0wOTlkODAzM2VkY2UiLCJleHAiOjE1Njk3Mjc4OTF9.wweMzyB3tSQK34Jmez36MmC5xpUh15Ni3vOV_SGCzJ8
1.2 header
Jwt的头部承载两部分信息:
声明类型,这里是Jwt
声明加密的算法 通常直接使用 HMAC SHA256
Jwt里验证和签名使用的算法列表如下:
JWS 算法名称
HS256 HMAC256
HS384 HMAC384
HS512 HMAC512
RS256 RSA256
RS384 RSA384
RS512 RSA512
ES256 ECDSA256
ES384 ECDSA384
ES512 ECDSA512
1.3 playload
载荷就是存放有效信息的地方。基本上填2种类型数据
标准中注册的声明的数据;
自定义数据。
由这2部分内部做base64加密。
标准中注册的声明 (建议但不强制使用)
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
自定义数据:存放我们想放在token中存放的key-value值
1.4 signature
Jwt的第三部分是一个签证信息,这个签证信息由三部分组成
base64加密后的header和base64加密后的payload连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了Jwt的第三部分。
二、Spring Boot和Jwt集成示例
2.1、项目依赖 pom.xml
com.auth0
java-jwt
3.10.3
2.2、自定义注解//需要登录才能进行操作的注解LoginToken
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public@interfaceLoginToken{
booleanrequired()defaulttrue;
}
//用来跳过验证的PassToken
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public@interfacePassToken{
booleanrequired()defaulttrue;
}
2.3、用户实体类、及查询service
用户实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassUser{
privateStringuserID;