概述
JSON Web Token
用于进行用户认证
数据结构
JWT 的主体为一个token
token分为三段,用 .
分割开,分别是:
- JWT头
- 载荷(Payload)
- 签名 (Signature)
这里有一段token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJleHAiOjE1ODA5OTUyMTQsInVzZXIiOiJhIn0
.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-go
这是一个比较流行的golang jwt实现,根据 jwt.io 描述,还有一部分 claim check 和几个加密算法没有实现,但是在基本应用上完全够用。
具体实例可以参照:
- 搭配 Echo 框架和 JWT 中间件使用 https://echo.labstack.com/cookbook/jwt
- 使用原生
net/http
https://pkg.go.dev/github.com/dgrijalva/jwt-go?tab=doc#example-package-GetTokenViaHTTP
参考资料: JSON Web Token(JWT)原理和用法介绍 RFC 7519 JSON Web Token (JWT) Introduction to JSON Web Tokens