DTeam 技术日志

Doer、Delivery、Dream

JWT必知必会

胡键 Posted at — Jan 15, 2017 阅读

最近,项目的安全认证机制全面采用 JWT。现在,趁整个工作基本告一段落之际,将一些知识点总结一下发布出来。

为什么要迁移?

原因很简单,就以下几点:

JWT 为何物?

JWT 由三部分组成:header + payload + signature,每部分是一个 Json 表示。最终的 Token 对这三部分进行编码之后的字符串,中间用“.”分割:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature) # token is now:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

在应用与服务器之间传递的就是上述字符串形式的 Token。

如何使用 JWT?

使用 JWT 的应用基本都遵循下面的使用流程:

  1. 访问登录点。
  2. 登录服务验证之后,签发证书返回给客户端。
  3. 客户端保存证书,并在每次请求时将其附在 request header 中,表示已经登录。
  4. 服务器接收请求之后,通过签名和时戳,验证 Token 的有效性。
  5. 若有效,则响应客户端。

对应的 request header 如下:

Authorization:Bearer <token>

整个过程如下图:

在一般的应用中,验证成功之后,服务器可能会在 Cookie 或 Session 中保留一些用户相关的额外信息,简化后续的编程,同时避免反复读取数据库。

在 JWT,同样可以实现这样的功能:只需将相应的内容放入 payload 即可。这样,下次从客户端发送的 token 中便可以解码得出。

验证 JWT 的有效性时,会考虑至少下面两点:

  1. 签名是否正确?
  2. Token 是否到期?

整个过程的编码其实并不复杂,请参见文后的链接,这里不再啰嗦。

使用中的注意事项

出于安全性,注意以下几点:

以上是对 JWT 的旋风式说明,其他的内容,请参见参考文献。

参考文献


相关文章