JWT(JSON Web Token)

一个JWT由三部分组成,<font color='red'>头部、载荷 与 签名</font>。

JWT原理类似我们加盖公章或手写签名的的过程,合同上写了很多条款,不是随便一张纸随便写啥都可以的,必须要一些证明,比如签名,比如盖章。JWT就是通过附加签名,保证传输过来的信息是真的,而不是伪造的;

载荷:

包含生成Token时间,过期时间,以及一些身份标识,标准定义了6个字段,载荷json经过base64编码后得到JWT的载荷:

Payload载荷:
    jti:该jwt的唯一标识
    iss:该jwt的签发者
    iat:该jwt的签发时间
    aud:该jwt的接收者
    sub:该jwt的面向的用户
    nbf:该jwt的生效时间,可不设置,若设置,一定要大于当前Unix UTC,否则token将会延迟生效
    exp:该jwt的过期时间

可自定义其他key-value形式的数据作为载体

签名:

将头部和载荷用'.'号连接,再加上一串密钥,经过头部声明的加密算法加密后得到签名

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret
)

JWT Token

Token=头部+'.'+载荷+'.'+签名

基本数据结构

上面是签名的使用例子,下面分析签名的源码实现,首先看下数据结构Token,包含了我们标准中说道的三部分:头部,载荷和签名,此外还带了一个用于存储生成token的字段Raw和校验标识符Valid


// A JWT Token.  Different fields will be used depending on whether you're
// creating or parsing/verifying a token.
type Token struct {
    Raw       string                 // The raw token.  Populated when you Parse a                                          token
    Method    SigningMethod          // The signing method used or to be used
    Header    map[string]interface{} // The first segment of the token
    Claims    Claims                 // The second segment of the token
    Signature string                 // The third segment of the token.  Populated when                                         you Parse a token
    Valid     bool                   // Is the token valid?  Populated when you                                             Parse/Verify a token
}