# JWT
公司有个项目需要更换验证方式,恰好我在负责,因此学习了一下如何实现 JWT Authorization。
JWT 是用来替换 Session 的一种解决方案。因此它不能有大量的计算,必须尽可能的少计算;也不能存储私密的内容。
在设计 JWT 时,需要分成 header、payload、signature 三部分。这三部分都是在后端计算,返回给前端的只是一个 Token 字符串。
header 存储 JWT 元数据。具体而言就是:JWT 是用什麽算法加密的。
```ruby
{
"alg":"sha256",
"typ":"JWT"
}
```
payload 存储具体数据。比如登录用户的 ID。记住,因爲 payload 默认不加密,仅做 base64 编码,爲了安全考虑,尽量不要存太私密的东西。
```ruby
{
"iss":"
abc.com", //签发人
"exp":time()+600, //过期时间,10 分钟后
"nbf":time()+2, //生效时间,2 秒后
"iat":time(), //签发时间
"uid":uid //userid 用户 ID
}
```
上面的例子里,最重要的是 exp 和 uid。exp(过期时间) 如果不做限制,一但 JWT 泄漏,任何人都可以用它来登录,永远有效。uid(用户 ID) 是我们用来替代 session,识别用户的信息,也是我们这个 payload 存在的目的。
signature 是签名。它用于保证前两个数据没有被人改过。将前两个数据(header, payload)的 base64 编码 用 "." 连接起来,再进行加密。也仅仅在签名的生成上,用了一次加密算法。
```ruby
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
```
secret 是我们自定义的密钥。
在上面的三部分生成完毕之后,用 "." 连接起来,传给前端。以后每次请求,都要使用 JWT 来验证身份。因爲 payload 和 header 都不做加密,因此前端传来时,可以反 base64 解开,看信息。最后,再用 签名 验证一下信息是否是僞造的就好了。