JWT
什么是JWT
从官网里可以看到,JWT是一个开放协议,它以一个可靠的,独立的方式方便在各方之间以Json的方式传输数据。Jwt可以使用秘钥(HMAC算法)或者公钥/私钥(RSA or ECDSA)的方式进行签名
应用场景
授权
常用如登录,登录成功后返回JWT,后续请求都会带上这个JWT,比如SSO
信息交换
使用公钥/私钥对签名时,可以在不同对象间传输信息
JWT结构
一个典型的JWT格式如下:
xxx.yyy.zzz
可以看到JWT由三部分组成,不同部分用.结合起来
- Header
- Payload
- Signature
Header
Header格式如下:
{
"alg": "HS256",
"typ": "JWT"
}
alg表示所使用的算法,如HMAC,SHA256, RSA
typ表示token类型,也就是 JWT
Header经过base64编码后会成为JWT的第一部分
Payload
Payload包含了一些Claims,Claims里又包含了实体和额外信息,有三种类型的Claims
- registered
- public
- private
一个典型的Payload如下:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
registered Claim
registered Claim是预定义的声明,不强制但建议使用,在RFC7519里可以看到,预定义的声明有以下几种
- iss ((Issuer) Claim)
- sub ((Subject) Claim)
- aud ((Audience) Claim)
- exp ((Expiration Time) Claim)
- nbf ((Not Before) Claim)
- iat ((Issued At) Claim)
- jti ((JWT ID) Claim)
public Claim
public Claim是用户可以自定义的,但是为了避免使用冲突,应该遵循IANA JSON Web Token Registry 规范,
private Claim
private Claim就是用来存贮交换信息的部分
Payload经过base64编码后就成为了JWT的第二部分
Signature
将编码后的Header和Payload组合在一起,再加上secret,经过指定的算法加密就形成了JWT的第三部分
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
最后用.号串联起来,最终就生成了一个JWT token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.b21wYW55X2lkIjoiZWQ5OGE4YTMtMWMyNi00OTM5LTg0MDQtMjU0OGUyMjgzOWVmIn0sImV4cCI6MTU2NzEzNzg0NywianRpVtIn0.sAlzke31nRGU_Gh_Ux8uh9uKmCnSYgQTk02GYzE97sU
使用方法
Authorization: Bearer <token>
优点
- 跨域
- 比XML结构简单,小巧
- 跨平台
- 相比Session,无需落地存储
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。