JWT在线解码和结构解析
JWT 简介
JWT 概念
JWT 全称为 JSON Web Token
是目前最流行的跨域认证解决方案,官网地址链接,
JWT 优点
基于 token 的认证方式相比传统的 session 认证方式能够解决移动端和分布式开发中跨域问题,具有下列优点:
- 减少服务器压力:服务端不需要存储 session 信息,token 可以携带登录用户服务器所需信息
- 支持跨域访问:将 token 放到请求头中,就不需要 cookie 存储信息,所以跨域后不会因为 cookie 是无法跨域而导致信息丢失
- 更适用于移动端:当客户端是非浏览器平台时或者 cookie 被禁止时,采用 token 认证方式会简单很多
- 更适用 CDN:可以通过内容分发网络请求服务端的所有资料
- 无需考虑 CSRF:由于不再依赖 cookie,所以采用 token 认证方式不会发生 CSRF,所以也就无需考虑 CSRF 的防御
JWT 在线解码工具
这个解码工具只能解析 Base64
编码后的 header
以及 Payload
部分,对于加密的 Signature
部分是无法解密的只有服务器端使用 secretKey
进行解密才能知道具体的内容。
JWT 在线解码工具入口
JWT 结构解析
JWT 由 3 部分组成:标头(Header
),有效载荷(Payload
)和签名(Signature
)。在传输的时候,会将 JWT 的三个部分分别进行 Base64
编码后,拼接成最终传输的字符串,也就是我们的 Json Web Token。
JWTString=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)
header
和 payload
可以直接利用 base64
解码出原文,从 header
中获取哈希签名的算法,从 payload
中获取有效数据signature
由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验 token 有没有被篡改。服务端获取 header 中的加密算法之后,利用该算法加上 secretKey
对 header
、payload
进行加密,比对加密后的数据和客户端发送过来的是否一致,注意其中 secretKey
只能保存在服务端,以保证数据的安全性。
1.Header
JWT 头是一个描述 JWT 元数据的 JSON 对象,alg 属性表示签名使用的算法,默认为 HMAC SHA256(写为 HS256);typ 属性表示令牌的类型,JWT 令牌统一写为 JWT。最后,使用 Base64 URL 算法将上述 JSON 对象转换为字符串保存
{
"alg": "HS256",
"typ": "JWT"
}
2.Payload
有效载荷部分,JWT
主体内容部分,是一个包含需要传递数据的 JSON
对象。 其中有七个默认字段供选择。
{
"iss":发行人
"exp":到期时间
"sub":主题
"aud":用户
"nbf":在此之前不可用
"iat":发布时间
"jti":JWT ID用于标识该JWT
}
以上默认字段并不要求强制使用。我们还可以自定义私有字段,一般会把包含用户信息的非保密数据放到 payload
中。
{
"admin_id": "93b5909c927c235ed5f9ee655e0e01abf988f5ebaeff4788542fde9573d79f3b4556c462b332493d2d34c7421dca804bf407dcf51815671cf8ce832165296441e3ca9b42ddc00a7e4914bbc536e1cec84afa6c61785c27b597b492de60baff8f",
"merchant_id": "93b5909c927c235ed5f9ee655e0e01abf988f5ebaeff4788542fde9573d79f3b4556c462b332493d2d34c7421dca804bf407dcf51815671cf8ce832165296441e3ca9b42ddc00a7e4914bbc536e1cec84afa6c61785c27b597b492de60baff8f"
}
注意:默认情况下 JWT
是未加密的,只是采用 base64
算法,拿到 JWT 字符串后可以转换回原本的 JSON
数据,任何人都可以解读其内容,因此不要构建隐私信息字段,比如用户的密码一定不能保存到 JWT
中,以防止信息泄露。JWT
只是适合在网络中传输一些非敏感的信息
3.Signature
签名哈希部分是对上面两部分数据签名,需要使用 base64
编码后的 header
和 payload
数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret
)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用 header
中指定的签名算法(默认情况下为 HMAC SHA256
)根据以下公式生成签名
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)
写在最后
JWT
作为现在主流的验证方式,在各种语言中都有着对用的使用方法,还是十分值得研究学习的。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。