JWT组成:
jwt有3个组成部分,每部分通过点号来分割 header.payload.signature
头部(header) 是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子
载荷(payload) 是一个 JSON 对象,用来存放实际需要传递的数据
签证(signature) 对header和payload使用密钥进行签名,防止数据篡改。
① 头部header
Jwt的头部是一个JSON,然后使用Base64URL编码,承载两部分信息:
声明类型typ,表示这个令牌(token)的类型(type),JWT令牌统一写为JWT
声明加密的算法alg,通常直接使用HMACSHA256,就是HS256了,也可以使用RSA,支持很多算法(HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512、PS256、PS384)
var header = Base64URL({ “alg”: “HS256”, “typ”: “JWT”})
Base64URL:Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。
② 载荷payload
payload也是一个JSON字符串,是承载消息具体内容的地方,也需要使用Base64URL编码,payload中可以包含预定义的7个可用,它们不是强制性的,但推荐使用,也可以添加任意自定义的key
iss(issuer): jwt签发者
sub(subject): jwt所面向的用户
aud(audience): 接收jwt的一方, 受众
exp(expiration time): jwt的过期时间,这个过期时间必须要大于签发时间
nbf(Not Before): 生效时间,定义在什么时间之前.
iat(Issued At): jwt的签发时间
jti(JWT ID): jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
// 该token签发给1234567890,姓名为John Doe(自定义的字段),签发时间为1516239022
var payload = Base64URL( {“sub”: “1234567890”, “name”: “John Doe”, “iat”: 1516239022})
注意,JWT中payload是不加密的,只是Base64URL编码一下,任何人拿到都可以进行解码,所以不要把敏感信息放到里面。
③ signature
Signature 部分是对前两部分的签名,防止数据篡改。
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。