1.JWT介绍
1.1什么是JWT
JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
1.2JWT的组成
一个JWT其实就是一个字符串,由三部分组成:头部(header)、载荷(payload)、签名(signature),以“.”拼接
1.2.1 header
头部用于描述关于该JWT的最基本的信息,header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。
例如:{"typ":"JWT ","alg":"HS256"}
头部指明了签名算法是hs256,用base64对这个json进行编码后就得到了JWT的第一部分
1.2.2 payload
载荷是存放有效信息的地方,包含了声明(要求),声明有三种类型:
(1)标准中注册的声明:(建议但是不强制使用)
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
(2)公共声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
(3)私有声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
例如:{"sub":"1234567890","name":"John Doe","admin":true}
1.2.3signature
签名是一个字符串,是由" header(Base64编码后)+‘.’+payload(Base64编码后) " 拼接的字符串通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
2.java的JJWT实现JWT
JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(ApacheLicense,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
2.1JJWT的快速入门
2.1.1导入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
2.1.2生成token
public class CreateJwt {
public static void main(String[] args) {
JwtBuilder builder =
Jwts.builder() // 生成jwt,下面是载荷的内容
.setId("111") // 当前登录用户的id
.setSubject("皮卡丘") // 用户名
.setIssuedAt(new Date()) // 签发时间
.signWith(SignatureAlgorithm.HS256, "pikapika"); // 加密方式是hs2