1.简介:
Jwt 是一种生成token,或者解析token 返回对象的工具,现在流行的都是前后端分离项目,用之前的shiro,或者sercurity 去做权限是会遇到无法做前端的权限,所以就采用token 这种方式,服务器返回token 给前端,前端通过token 访问资源,前端通过cookie保存。
2.为什么是jwt?
WT本质上是一个字符串,一个完整的JWT由三部分组成,头部(header), 荷载(Payload), 和签名(Signature),中间用.
隔开,如下是一个典型的JWT:eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE1NjE4Njk2MjMsInVzZXIiOiIxMjM0NSIsInN1YiI6InhsIn0.5szo9Rfp_6b3cszas3-g0V719IIWAN97ZIZhx49-CK1mLGJlbYd__idPuT1EEsMSq92FV7vneEo9IrrZw9XH6g
3. 如何生成 JWT
- 生成头部header
- 生成荷载payload
- 生成签名signature
signature = encode(base64(header) + '.' + base64(payload), secret) - JWT = header.payload.signatrue
注:encode是header.alg指定的加密算法;secret为密钥,需要妥善保存。
4. 如何验证一个 JWT 的合法性
在得到一个 JWT 串之后,如何验证它携带的信息是否可靠呢(假设该串为:header.payload.signatyre),我们只需要:
- base64 解码 header 得到加密算法 encode;
- 计算vercode = encode(header.payload, secret);
- 验证 vercode 和 signatyre 是否匹配
5. 应用
JWT可作为Token,用于单点登陆;相比普通的Token,它的优势在于服务器无需使用额外的存储空间来保存Token,因为使用生成JWT时的secret,就可以验证JWT的合法性。
JWT的安全性建立在加密方密钥的安全性之上。若服务端使用JWT作为Token来鉴别用户身份,而密钥泄漏的话,得到密钥的人便可以为任意用户生成合法的Token,进而冒充他们与服务端交互。
6.jwt 生成和解析
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> //生成token Map<String, Object> map = new HashMap<>(1); map.put("user", "12345"); //后面可以换成用户实体 String str = Jwts.builder() .setClaims(map) .setSubject("xl") //用户名 .setExpiration(new Date(System.currentTimeMillis() + 3600*1000)) //token保留的时间 .signWith(SignatureAlgorithm.HS512, "123456") // .compact(); System.out.println(str);
//解析token Claims claims = Jwts.parser() .setSigningKey("123456") .parseClaimsJws("eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE1NjE4Njk2MjMsInVzZXIiOiIxMjM0NSIsInN1YiI6InhsIn0.5szo9Rfp_6b3cszas3-g0V719IIWAN97ZIZhx49-CK1mLGJlbYd__idPuT1EEsMSq92FV7vneEo9IrrZw9XH6g") .getBody(); System.out.println(claims.getSubject());