从官网里能够看到,JWT是一个开放协议,它以一个可靠的,独立的方式方便在各方之间以Json的方式传输数据。Jwt能够使用秘钥(HMAC算法)或者公钥/私钥(RSA or ECDSA)的方式进行签名html
经常使用如登陆,登陆成功后返回JWT,后续请求都会带上这个JWT,好比SSO算法
使用公钥/私钥对签名时,能够在不一样对象间传输信息跨域
一个典型的JWT格式以下:编码
xxx.yyy.zzz
能够看到JWT由三部分组成,不一样部分用.结合起来加密
Header格式以下:翻译
{ "alg": "HS256", "typ": "JWT" }
alg表示所使用的算法,如HMAC,SHA256, RSA
typ表示token类型,也就是 JWT
Header通过base64编码后会成为JWT的第一部分code
Payload包含了一些Claims,Claims里又包含了实体和额外信息,有三种类型的Claimsjwt
一个典型的Payload以下:htm
{ "sub": "1234567890", "name": "John Doe", "admin": true }
registered Claim是预约义的声明,不强制但建议使用,在RFC7519里能够看到,预约义的声明有如下几种对象
public Claim是用户能够自定义的,可是为了不使用冲突,应该遵循IANA JSON Web Token Registry 规范,
private Claim就是用来存贮交换信息的部分
Payload通过base64编码后就成为了JWT的第二部分
将编码后的Header和Payload组合在一块儿,再加上secret,通过指定的算法加密就造成了JWT的第三部分
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
最后用.号串联起来,最终就生成了一个JWT token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.b21wYW55X2lkIjoiZWQ5OGE4YTMtMWMyNi00OTM5LTg0MDQtMjU0OGUyMjgzOWVmIn0sImV4cCI6MTU2NzEzNzg0NywianRpVtIn0.sAlzke31nRGU_Gh_Ux8uh9uKmCnSYgQTk02GYzE97sU
Authorization: Bearer <token>