
自从 RESTful 架构兴起后,越来越多的人提倡使用 JWT 来取代传统 Session 的场景,究竟什么是 JWT 呢,来了解下吧~
JWT 的结构可以看作是三个 JSON 对象,并且用点(.)来分隔,这三个部分会各自进行编码,组成一个 JWT 字符串。也就是变成:xxxxx.yyyyy.zzzzz
由两部分组成:
示例:
{
"alg": "HS256",
"typ": "JWT"
}然后进行 Base64 进行编码。Base64 是通过 64 个字符来表示二进制数据的一种方法,编码的方式是固定的而且可以逆向解码的,并不是那种安全的加密算法。
这里放的是声明(Claim)内容,也就是用来传递消息的地方,在定义上有三种声明:
可以看作是标准公认的一些消息,建议可以放,但并不强迫,例如:
这个,可以看作是传递的字段必须与上面的 Registered claims 字段不能冲突,然后可以向官方申请定义公开声明,会进行审核等步骤,实际上在开发上是不太会用这部分的。
这是发放 JWT 服务器可以自定义的部分,例如实际上会放 User Account、User Name、User Role 等不敏感的数据。
所谓不敏感的数据就是不会放用户的密码等敏感数据,因为该 Payload 传递的消息最后也是通过 Base64 进行编码,所以是可以被破解的,因此放用户密码会有安全性的问题。
示例:
{
"sub": "1234567890",
"account": "kenny@example.com",
"role": "admin"
}个人感觉通常都会放 iat、exp 等标准字段,因为通常需要检查 JWT 发送时间及是否过期,以及还有用户账号,为了方便查询用户的一些数据,通常以前的做法是 Session 里面存放用户账号,现在改用 JWT 的 payload 上存放,以及角色身份的定义,可以用来看该用户是否有权限获取后端 API 的内容。
由三大部分組成:
也就是:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)header 和 payload 中间用点(.)来连接,secret 是存放在服务器端的秘密字符串,最后将这三个部分串接再一起的字符串进行加密算法进行加密。
secret 是要保存在服务器端的,这个 secret 一旦泄露给客户端,客户端就可以自己生成 JWT,并通过该 JWT 访问资源,因此 secret 是永远不该泄露的。
最后将 Header、Payload、Signature 三者用点(.)串联在一起,就是一个合法签发的 JWT 字符串。在 JWT 官网:https://jwt.io/ 有提供现成的 JWT 签发工具,可以使用该工具来看产生的 JWT 字符串长什么样:
我使用上面我写的三个部分的内容各自填上去,左边就会出现正确的 JWT 字符串出来。红色部分就是编码后的 Header、紫色部分就是编码后的 Payload,蓝色部分就是将 Header、Payload、Secret 合在一起并进行加密算法加密后的编码。最后就是用点(.)将三个部分串联在一起。
Authorization: Bearer <JWT token>JWT 之所以会兴起,除了因为 RESTful 架构出现,加上现在微服务的架构的关系,一般来说上线的系统,不太可能用单台服务器来处理一切,多台服务器处理 Session 会有其局限性,虽然可以用统一的数据库进行存放 Session 来控制,但是会有性能的问题。
不过其实这还有很多探讨的空间,在这篇文章没有去说,Session/Cookie 的架构其实也是可以跟 JWT 并行。但就我两者都使用过的经验来看,我觉得 JWT 的方式的确很简洁易懂,Session 的机制有时候的确很繁琐。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。