JWT(八股文):一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以「JSON」对象的形式安全传递信息的方法.JWT可以使用「HMAC」算法或者是「RSA」 的公钥密钥对进行签名
总结:通过一定规范来生成token,然后可以通过解密算法逆向解密token,这样就可以获取用户信息.
优点:
- 生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库
- 存储在客户端,不占用服务端的内存资源
缺点:
- token是经过base64编码,所以可以解码,因此token加密前的对象不应该包含敏感信息如用户权限,密码等
JWT格式组成「头部、负载、签名」
header+payload+signature
- 头部:主要是描述签名算法
- 负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如iss 签发者,exp 过期时间,sub 面向的用户
- 签名:主要是把前面两部分进行加密,防止别人拿到token进行base解密后篡改token
关于jwt客户端存储
- 可以存储在cookie,localstorage和sessionStorage里面
实战之封装通用方法
- 首先引入依赖
<!-- JWT相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
- 生产token方法
public static String geneJsonWebToken(User user) {
if (user == null
|| user.getId() == null
|| user.getName() == null
|| user.getHeadImg() == null) {
return null;
}
String token =
Jwts.builder()
.setSubject(SUBJECT)
.claim("id", user.getId())
.claim("name", user.getName())
.claim("img", user.getHeadImg())
// 设置发行时间
.setIssuedAt(new Date())
// 设置过期时间
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
// 设置加密算法
.signWith(SignatureAlgorithm.HS256, APPSECRET)
.compact();
return token;
}
- 开发检验token方法
public static Claims checkJWT(String token) {
try {
final Claims claims = Jwts.parser().setSigningKey(APPSECRET).parseClaimsJws(token).getBody();
return claims;
} catch (Exception e) {
}
return null;
}