JWT是一个轻量级的规范,之前学习过,但一直没有什么应用。最近在做一个OAuth 2相关的项目,有用到JWT。于是,再复习一遍。
JWT是什么?
JSON Web Token (JWT) 是一个简洁的,自包含的,可安全的在两个模块之间传输。这是JWT.io给出的定义。
简洁: JWT的规模比较小,它的报文可以通过URL或者HTTP的POST参数,甚至插入在HTTP头中。
自包含:在JWT payload部分包含了所有的必须的信息。
JWT报文结构:
Header: Header通常包含两部分:typ token类型, alg 所用的hash算法
{
"alg": "HS256",
"typ": "JWT"
}
Payload:Payload部分是JWT的信息主体。Payload有三种申明信息:注册,公开和私有申明信息。
注册声明:这一类中,JWT推荐但不是要求必须的四个参数是:iss (issuer), exp (expiration time), sub (subject), aud (audience).
共有声明:这些可以被定义在那些使用JWT的规范中,例如OpenID Connect,例如name, give_name。但是注意,避免使用冲突。
私有声明:自定义的声明
例子:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature: 签名是一个利用算法对header和payload的组合的加密字符串。这个签名可防止信息的篡改但不能防止信息的泄露。所以在JWT中,不能包含敏感信息。
签名的算法过程:
1. header字符串用base64加密
2. payload字符串用base64加密
3. 前两者加密的结果用点号 (.)连接起来。heder在前,paload在后
4. 然后使用header头中的注明的算法,对这个字符串加密的结果就是签名。加密过程中还会用到一个secret字符串
如下算法示意:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
完整的 JWT字符串是base64(header).base64(paload).Signature参考文章:
1. https://jwt.io/introduction/