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 也因此暗含了用于跨域访问这种假设。