JWT
JWT结构
在其紧凑形式中,JSON Web Tokens 由三部分组成,以点 (.) 分隔,它们是:
- Header
- Payload
- Signature
因此,JWT 通常如下所示。
1 | xxxxx.yyyyy.zzzzz |
Header
标头通常由两部分组成:令牌的类型,即 JWT,以及正在使用的签名算法,例如 HMAC SHA256 或 RSA。
例如:
1 | { |
然后,这个 JSON 被 Base64Url 编码以形成 JWT 的第一部分。
Payload
令牌的第二部分是负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的说明。共有三种类型的声明:已注册声明、公共声明和私有声明。
Registered claims: 这些是一组预定义的声明,这些声明不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。其中一些是:iss(发行者)、exp(到期时间)、sub(主题)、aud(受众)等。.
Public claims: 这些可以由使用 JWT 的人随意定义。但是为了避免冲突,它们应该在 IANA JSON Web Token Registry中定义,或者定义为包含抗冲突命名空间的 URI。
Private claims: These are the custom claims created to share information between parties that agree on using them and are neither registered or public claims.
An example payload could be:
1 | { |
payload 进行 Base64Url 编码以形成 JSON Web Token的第二部分
注意:
对于已签名的令牌,此信息虽然受到防篡改保护,但任何人都可以读取。除非加密,否则不要将机密信息放入 JWT 的负载或标头元素中。
Signature
要创建签名部分,您必须获取--------被编码过的标头、被编码过的有效载荷、secret、标头中指定的算法,并对其进行签名。
例如,如果要使用 HMAC SHA256 算法,则签名将通过以下方式创建:
1 | HMACSHA256( |
签名用于验证消息在此过程中没有更改,并且在使用私钥签名的令牌的情况下,它还可以验证 JWT 的发送者是它所说的那个人。
Putting all together
输出是三个由点分隔的 Base64-URL 字符串,可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更加紧凑。
下面显示了一个 JWT
JWT如何工作
每当用户想要访问受保护的路由或资源时,用户代理应该发送 JWT,typically in the Authorization header using the Bearer schema
标题的内容应如下所示:
1 | Authorization: Bearer <token> |