JSON Web Token (JWT)
JSON Web Token (JWT)
- 官网
- 什么是 JWT ?
- 什么时候使用 JWT ?
- JWT 格式
- Header
- Payload
- Signature
- JSON Web Tokens 工作原理
- 生成JWT 的 java 库
官网
- 官网 https://jwt.io/
- RFC 7519文档 https://www.rfc-editor.org/rfc/rfc7519.html
什么是 JWT ?
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。
JWT可以使用密码(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
加签后的token 能够使用 JWT 里的算法验证 json 的完整性.
什么时候使用 JWT ?
- 授权
- 信息交换
JWT 格式
使用逗号分隔的三部分 :
- Header
- Payload
- Signature
token 格式:xxxxx.yyyyy.zzzzz
Header
Header 通常由 token 类型和签名算法名两部分组成.是token的第1部分
例如:
{
"alg": "HS256", // 签名算法
"typ": "JWT" // token类型
}
然后, 这个JSON 使用 Base64Url 编码后放到 JWT 的第1部分.
Payload
Payload 是token的第2部分.包含了一些声明(claims).声明的名字必须是唯一的.
claims 是包含了 用户数据和其他数据的陈述,
有三种类型的声明:
- Registered Claim Name
预定义好的一些声明(如果有需要就使用,没需要可不使用):
- "iss"
- "sub"
- "aud"
- "exp"
- "nbf"
- "iat"
- "jti"
更多参见 https://www.iana.org/assignments/jwt/jwt.xhtml
-
Public Claim Names
公共的声明,可以预先定义在 IANA JSON Web Token Registry 中,或者定义在1个能解决名字冲突的地方. -
Private Claim Names
双方共享数据使用的私有名字.既不在 Registered Claim Name 也不在 Public Claim Names 中.
payload 示例
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后, 这个JSON 使用 Base64Url 编码后放到 JWT 的第2部分.
Signature
拿到编码后的 header 和 编码后的 payload 使用 密码进行签名.
使用 HMAC SHA256 加签示例:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JSON Web Tokens 工作原理
在认证时,用户登录成功后,就会返回一个JSON Web Token.
当用户访问一个受保护的路由资源或者时,需要将
JWT 放到 Header 的 Authorization 属性中,并且前边需加上" Bearer ",如下示例
Authorization: Bearer
服务器会校验 Header 的 Authorization 中的JWT ,
生成JWT 的 java 库
推荐地址:https://jwt.io/libraries?language=Java