本文是对 JSON Web Token(JWT)原理和用法的基本介绍。
目录
- 简介
- 原理
- 数据结构
- 使用方式
- 特点
- 附录
简介
JSON Web Token(JWT) 是基于 Token 技术的一种标准,是目前流行的跨域认证解决方案。
原理
服务端认证通过后生成一个 JSON 对象返回给客户端,后续客户端向服务端发起请求时都必须带上这个 JSON 对象,服务器只通过这个 JSON 对象便可确认客户端的身份。为了防止 Token 被篡改,服务端在生成 Token 时会加上签名。服务端不再保存任何 Session 数据,从而使得服务端实现了无状态,比较容易实现水平扩展。
数据结构
JWT 最终形态为一个长字符串,由三部分组成,以 .
分隔:Header.Payload.Signature
Header
Header(头部)是一个 JSON 对象,描述 JWT 的元数据。
{
"alg": "HS256",
"typ": "JWT"
}
-
alg
:签名算法(algorithm)默认采用HMAC SHA256(HS256)
-
typ
:Token 类型,JWT Token 类型统一为JWT
最后将以上 JSON 对象使用BASE64URL
算法编码成字符串。
Payload
Payload(负载)也是一个 JSON 对象,用于存放实际需要传递的数据。
JWT 规定了 7 个官方字段:
-
iss
:issuer,签发人 -
exp
:expiration time,过期时间 -
sub
:subject,主题 -
aud
:audience,受众 -
nbf
:Not Before,生效时间 -
iat
:Issued At,签发时间 -
jti
:JWT ID,编号
除官方字段外,可以自定义私有字段,如:
{
"username": "admin"
}
注意:JWT 默认是不加密的,所以不要将敏感信息放在 Payload 中。
以上 JSON 对象也要使用 BASE64URL
算法编码成字符串。
Signature
Signature 是对 Header 和 Payload 的签名,防止被篡改。
首先需要一个只有服务端才知道的密钥,然后使用 Header 中指定的签名算法按照以下公式生成签名:
algorithm(base64url.encode(Header) + "." + base64url.encode(Payload), 密钥)
算出签名后,将 Header、Payload 和 Signature 三部分合并成一个字符串,每部分用 .
分隔后得到最终的 Token 返回给用户。
使用方式
服务端生成 JWT Token 后不存储直接返回给客户端,客户端收到后存储在 Cookie 或 LocalStorage 中,后续每个请求中都要带上这个 Token。
建议不要将 Token 放在 Cookie 中,不能解决跨域问题,建议放在 HTTP Header 的 Authorization
字段。
特点
- JWT 默认不加密,也可以在 Token 生成后加密,不加密时不能放入敏感数据;
- JWT 最主要用途是用于身份认证,但也可以用于信息交换;
- JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该 Token 的所有权限。为了减少此风险,JWT 的有效期应该设置得比较短(考虑区分 access_token 和 refresh_token)。对于一些比较重要的权限,使用时应该再次对用户进行认证。
网友评论