一个JWT,应该是如下形式的:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
这些东西看上很凌乱,但是非常紧凑,并且是可打印的主要用于验证签名的真实性。JWT 解决什么问题?JWT的主要目的是在服务端和客户端之间以安全的方式来转移声明。主要的应用场景如下所示:1.认证 Authentication;2.授权 Authorization // 注意这两个单词的区别;3.联合识别;4.客户端会话(无状态的会话);5.客户端机密。JWT 的一些名词解释1.JWS:Signed JWT签名过的jwt2.JWE:Encrypted JWT部分payload经过加密的jwt;目前加密payload的操作不是很普及;3.JWK:JWT的密钥,也就是我们常说的scret;4.JWKset:JWT key set在非对称加密中,需要的是密钥对而非单独的密钥,在后文中会阐释;5.JWA:当前JWT所用到的密码学算法;6.nonsecure JWT:当头部的签名算法被设定为none的时候,该JWT是不安全的;因为签名的部分空缺,所有人都可以修改。0x01 JWT的组成一个通常你看到的jwt,由以下三部分组成,它们分别是:1.header:主要声明了JWT的签名算法;2.payload:主要承载了各种声明并传递明文数据;3.signture:拥有该部分的JWT被称为JWS,也就是签了名的JWS;没有该部分的JWT被称为nonsecure JWT 也就是不安全的JWT,此时header中声明的签名算法为none。三个部分用·分割。形如 xxxxx.yyyyy.zzzzz的样式。JWT header{
“typ”: “JWT”,
“alg”: “none”,
“jti”: “4f1g23a12aa”
}
jwt header 的组成头通常由两部分组成:令牌的类型,即JWT,以及正在使用的散列算法,例如HMAC SHA256或RSA。当然,还有两个可选的部分,一个是jti,也就是JWT ID,代表了正在使用JWT的编号,这个编号在对应服务端应当唯一。当然,jti也可以放在payload中。另一个是cty,也就是content type。这个比较少见,当payload为任意数据的时候,这个头无需设置,但是当内容也带有jwt的时候。也就是嵌套JWT的时候,这个值必须设定为jwt。这种情况比较少见。jwt header 的加密算法加密的方式如下:base64UrlEncode(header)
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQ
JWT payload{
“iss”: “http://shaobaobaoer.cn”,
“aud”: “http://shaobaobaoer.cn/webtest/jwt_auth/”,
“jti”: “4f1g23a12aa”,
“iat”: 1534070547,
“nbf”: 1534070607,
“exp”: 1534074147,
“uid”: 1,
“data”: {
“uname”: “shaobao”,
“uEmail”: “shaobaobaoer@126.com”,
“uID”: “0xA0”,
“uGroup”: “guest”
}
}
jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【s