注:本文大体上是对JWT官方文档介绍(https://jwt.io/introduction)的简化翻译,并加入了一些自己的理解。
JWT的定义
应用场景
- 授权(Authorization):这是JWT最常用的场景。当用户成功登录(log in)之后,后续的每个request里都包含JWT token,以便访问server所提供的服务,资源等。
- 交换信息:JWT本身是一种安全传输信息的方式,因为JWT包含了数字签名。此外,由于JWT是用其本身的header和payload来签名的,这就保证了这些内容不会被篡改。
JWT的结构
JWT token一般由3部分组成,各个部分之间以 .
分隔:
- Header
- Payload
- Signature
例如: xxxxx.yyyyy.zzzzz
Header
Header通常由类型( typ
)和算法( alg
)2部分组成,例如:
{
"alg": "HS256",
"typ": "JWT"
}
该JSON数据经过 Base64Url 编码后,组成了JWT的 Header
。
Payload
Payload由一些声明( claim
)组成。这些声明包括:
- Registered claims:例如
iss
(issuer),exp
(expiration time),sub
(subject)等 - Public claims:
- Private claims
例如:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
该JSON数据经过 Base64Url 编码后,组成了JWT的 Payload
。
注:尽管这些信息有数字签名以确保其不会被篡改,但它们可能会被任何人读取(注意encoding并不是加密)。因此,不要在Header和Payload里放置任何敏感数据(除非经过加密,比如https)。
Signature
也就是把 <encoded header>.<encoded payload>
,和一个 secret
,以Header中所指定的算法,生成数字签名。例如:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
如上文所述,该数字签名一来用来验证身份,二来可确保Header和Payload没有被篡改。
最终生成的JWT token,是一个由2个 .
所分隔的Base64-URL字符串,例如:
JWT的使用
当用户使用credentials成功登录之后,server会生成JWT token并返回给用户。用户后续的request里会包含该JWT token,通常是放在HTTP request的 Authorization
Header里面,并冠以 Bearer
schema,例如:
Authorization: Bearer <token>
Server收到request后,会去检查并验证该JWT token,如果验证成功,就会允许request访问所请求的资源。此外,由于JWT本身可以包含一些信息,这就有可能减少一些DB的查询(比如上面例子中的 name
和 admin
身份的信息)。
试一试
有一些在线网站,可以验证和decode JWT token。比如JWT官网:
https://jwt.io/#debugger-io
参考
- https://jwt.io/introduction