JWT(Json web token),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT组成
- Header(头部) : 包含两部分,使用base64编码组成,token类型和采用的加密算法
base64({
"alg":"HS256",
"typ":"JWT"
})
-
Payload(负载) : 这部分就是存放信息的地⽅,同样使用base64编码组成,可以把⽤户 ID 等信息放在这⾥,JWT 规范⾥⾯对这部分有进⾏了⽐较详细的介绍,常⽤的由 iss(签发者),exp(过期时间),sub(⾯向的⽤户),aud(接 收⽅),iat(签发时间)。
-
Signature(签名) : 需要使⽤编码 后的 header 和 payload 以及我们提供的⼀个密钥,然后使⽤ header 中指定的签名算法(HS256)进 ⾏签名。签名的作⽤是保证 JWT 没有被篡改过。
三个部分通过“.”连接在⼀起组成 JWT 了,它可能⻓这个样⼦,⻓度貌似和你的加密算法和私钥 有关系。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9`.`eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYz UzZGJkNSIsInhzcmYiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUz OTU0OWM0MDE2NDM2YWZkYTY1ZDIzMzBlIiwiaWF0IjoxNDc2NDI3OTMzfQ`.`PA3QjeyZSUh7H 0GfE0vJaKW4LjKJuC3dVLQiY4hii8s
签名目的
最后⼀步签名的过程,实际上是对头部以及负载内容进⾏签名,防⽌内容被窜改。如果有⼈对头部以及 负载的内容解码之后进⾏修改,再进⾏编码,最后加上之前的签名组合形成新的JWT的话,那么服务器 端会判断出新的头部和负载形成的签名和JWT附带上的签名是不⼀样的。如果要对新的头部和负载进⾏ 签名,在不知道服务器加密时⽤的密钥的话,得出来的签名也是不⼀样的。



