JSON Web Token (JWT) for Authorization

已经通过认证(Authentication)的用户在随后进行资源访问时,系统需要对其进行授权检查(Authorization)。

JSON Web Token (JWT) 是进行 Authorization 的一种方法。

JWT 的网站是 https://jwt.io/

Authorization

Authorization 必定是一段数据。对于这段数据,主要需要解决的问题是如何避免伪造。

避免伪造的方式可以是对整段数据进行加密,增加伪造的难度。但加密的问题是一旦被破解,系统就面临风险。

但既然主要问题是避免伪造,在可以接受这段数据明文显示的情况下,对数据进行签名就是很自然的方法。

JWT 生成

set header_base64  [binary encode base64 $header]
set payload_base64 [binary encode base64 $payload]
set secret "some-secret"
set signature [sha256 "$header_base64.$payload_base64" $secret]

set jwt_token "$header_base64.$payload_base64.$signature"

header 和 payload 的内容是 JSON Object

header = {
  "alg": "HS256",
  "typ": "JWT"
}

payload = {
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

根据算法实现来说,header 和 payload 实际上没有限定格式,只要使用 JWT Token 的各方一致就可以。比如对于 Tcl 爱好者来说,直接使用 list 就很方便。

JWT 使用

Authorization: Bearer <token>

JWT 加密

从上面的 JWT 基本算法可以看出,JWT 的 header 和 payload 部分是明文的。

因此,需要注意不要在 JWT Token 中包含敏感信息。

JWT Token 强调的是 Token 内容的真实性 - integrity。

当然用户可以考虑

JWT 签名

上面的 JWT 基本算法中,签名的真实性依赖于一个共享的 secret

用公钥/私钥(public/private key pairs)也是可选的方案。

JWT 和 Cookie

JWT 经由 Authorization: Bearer <token> 传送。这和 Cookie 实质上是一样的。

只是 Cookie 这个词由于历史原因已经暗含了同一个 Domain 的限定。 JWT 也因此暗含了用于跨域访问这种假设。