概述

JSON Web Token
用于进行用户认证

数据结构

JWT 的主体为一个token
token分为三段,用 . 分割开,分别是:

  • JWT头
  • 载荷(Payload)
  • 签名 (Signature)

这里有一段token:

  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  2. .eyJleHAiOjE1ODA5OTUyMTQsInVzZXIiOiJhIn0
  3. .xWVPr781NGPgJLqpo8mCTl-JHzoQSt1HXamQxQxUDC4

将其分成三段进行了显示

JWT头(JWT header)

JSON对象,进行 base64url 解码
对上述JWT进行解码:

{"alg":"HS256","typ":"JWT"}

两个字段:

  • alg algorithm 签名加密所使用的算法
  • typ type token类型,JWT token为 JWT

    载荷(Payload)

    类型同 JWT 头,包含了 Claims (此处译为 声明
    对示例解码:
{"exp":1580995214,"user":"a"}

JWT提供了7个默认声明字段:

  • exp Expiration Time 过期时间
  • iss Issuer 发行人
  • sub Subject 主题
  • aud Audience 用户
  • nbf Not Before 在此之前不可用
  • iat Issued At 发布时间
  • jti JWT ID 用于标识该JWT

以上是JWT的Registed Claims,还有以下两种类型:

  • Public Claims
  • Private Claims

其中 Public Claims 公共字段根据官方(jwt.io)描述是已经在 IANA JSON Web Token Registry 中定义的字段,Private Claims可以由用户自定义,并且要和Registed和Public两者不同。

签名(Signature)

签名是由自定的密钥和JWT其他部分经过算法加密得到的,加密规则如下(默认加密算法为 HMAC SHA256):

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

加密算法使用的是在header中声明的算法。

自此 JWT 的三个部分就已经了解了。

应用

jwt-go

Repo: https://github.com/dgrijalva/jwt-go

这是一个比较流行的golang jwt实现,根据 jwt.io 描述,还有一部分 claim check 和几个加密算法没有实现,但是在基本应用上完全够用。

具体实例可以参照:

参考资料: JSON Web Token(JWT)原理和用法介绍 RFC 7519 JSON Web Token (JWT) Introduction to JSON Web Tokens