JWT(JSON Web Tokens) 是一个开放的标准(RFC 7519)定义的一种简洁的、自包含的方法,用于通信双方之间以 Json 对象的形式安全的传递信息。
1 JWT结构
JWT由header、payload、signature三部分组成。

对它们更详细的描述如下:
1.1 header
jwt 的头部承载两部分信息:
- 声明类型,固定为 jwt
- 声明签名算法,通常为 HMAC SHA256
完整的头部就像下面这样的JSON:
{
"typ": "JWT",
"alg": "HS256"
}
然后将头部进行 base64 编码,构成了第一部分。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
1.2 payload
有效载荷就是存放有效信息的地方,这些有效信息包含三个部分:
- 标准中注册的声明(Reserved claims)
这些 claim 是 JWT 预先定义的,在 JWT 中并不会强制使用它们,而是推荐使用
iss:jwt签发者
sub:jwt所面向的用户
aud:接收 jwt 的一方
exp:jwt的过期时间,这个过期时间必须要大于签发时间
nbf:定义在什么时间之前,该jwt都是不可用的.
iat:jwt 的签发时间
jti:jwt 的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
- 公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息,因为该部分在客户端可解密。 - 私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为 base64 是编码方式,有对应的解码方式,意味着该部分信息可以归类为明文信息。
定义一个 payload:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后将其进行 base64 编码,得到 Jwt 的第二部分:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
1.3 signature
创建签名需要使用编码后的 header 和 payload 以及一个秘钥,使用 header 中指定签名算法进行签名。例如如果希望使用 HMAC SHA256 算法,那么签名应该使用下列方式创建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
secret 是保存在服务器端的,jwt 的签发生成也是在服务器端的,secret 就是用来进行 jwt 的签发和 jwt 的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个 secret, 那就意味着客户端是可以自我签发和验证 jwt 了。
碰到 JWT token 可以去 JWT 官网解密看看,下面这是官网解密出来的数据,可以很清楚的看到它的三部分内容:
碰到 JWT token 可以去 JWT 官网解密看看,下面这是官网解密出来的数据,可以很清楚的看到它的三部分内容:

2. JWT使用
JWT在实际应用流程如下:

其中,因为JWT加密算法如HMAC为信息摘要算法,所以第5步check jwt signature的过程应当为重新计算signature并比对的过程。
网友评论