JWT 介绍

JWT 是什么

JWT 全称是 JSON Web Tokens,是 RFC 7519 标准,用于安全校验两方可信性的安全措施。

JWT 解决了哪些问题?

JWT 本身设计是用于解决 Session 机制不能够很好的在 SPA/API 类型 (restful) 应用中处理身份认证问题。通常 API 的调用是无状态(stateless)的,使用 Session 等形式会有上下文要求。如当用户登录完成后,可以通过下发 JWT 的形式进行无状态的 API 调用。在此之前通常是使用的方式包括不限于如 Basic Auth、Oauth2 或 Token 形式进行。

JWT 相比是额外添加了签名校验方式,本质上来说对抗如暴力碰撞等形式有一些作用。但是由于本身长度的限制,存储的信息量有限。

JWT 处理方式

JWT 内容主要分为三段,分别对应头部信息,存储数据和签名信息三部分,中间使用『.』符号连接,三段信息均进行 Base64 编码。

具体实现方式可参考如下伪代码实现:

1
encodeBase64(header) + '.' + encodeBase64(payload) + '.' + Sign(key + encodeBase64(header) + '.' + encodeBase64(payload))

其中 Sign 的算法是可以在 header 中进行定义,支持如 HMAC-SHA256 和 RSA-SHA256 等方式。key 则是用于验证的 key 信息。

其中 header 格式如下:

1
2
3
{"alg": "HS256", // 指定加密算法,可以选择 RS256 等。
"typ": "JWT"
}

payload 为存储的数据区块,由于此部分未进行加密,不建议存储敏感信息。内容为字典结构。

JWT 存在的安全问题

JWT 披露了一个比较 严重的安全问题:JWT 中允许设置加密方法『alg』为 none,这样签名信息可设置为 “”,这样就给恶意用户伪造 JWT 的可能。并且该验证是在验证签名之前(决定签名使用算法),所以在安全实现 JWT 时需要对验证算法进行可信安全校验。

还有一个问题是 JWT 本身并不会加密 payload 中的信息,因此在传递敏感信息时需要单独对数据进行个别处理。

参考连接

  1. JWT.io http://jwt.io/