JWT
Jwt简介
什么是JWT
JWT即 JSON Web Token
的缩写,它是一种用于在网络应用环境间安全地传输信息的一种基于 JSON
的开放标准RFC 7519。它可以在各方之间以 JSON
对象的形式安全地传输信息,这些信息可以通过数字签名进行验证和信任。JWT常用于身份认证和信息交换的场景。
JWT结构
JWT
由三部分组成,分别是 Header
,Payload
和 Signature
。这三部分分别过签名算法编码成字符串,然后通过 .
连接起来,就形成一个 JWT
字符串。
Header(头部)
通常包含两部分,一个是token的类型,即JWT,另一个是所使用的签名算法,例如HMAC SHA256或RSA。其 JSON
结构为:
1 | { |
Payload(负载)
包含一系列声明(Claims),通常是指实体(用户)和其他数据。声明有三种:
Registered Claims(注册声明) :是一些预定义的,非强制但推荐使用的声明,可以帮助系统更加高效和便携地管理
JWT
。这些声明有:iss (Issuer) :签发者。标识或识别发行
JWT
的签发主体。sub (Subject) :主题。表示该
JWT
的主题(描述)。aud (Audience) :观众,受众。用于识别JWT意图发送的接收者。每个打算处理
JWT
的主体必须通过在受众声明中识别自己的值。exp (Expiration Time) :过期时间。用于识别
JWT
不应被接受处理的时间点或之后的过期时间nbf (Not Before) :不可早于。用于识别
JWT
不应被接受处理的时间点之前。iat (Issued At) :发行于。用于识别
JWT
被发行的时间点。jti (JWT ID) :JWT ID。为
JWT
提供了一个唯一的标识符。
一般应用中,iss,sub,aud,exp 注册声明使用较为频繁。
Public Claims(公共声明) :公共声明由用户随意定义,但需要避免冲突
Private Claims(私有声明) :用户可以在私有声明中定义或创建自己要通过
JWT
传输的信息。
Payload 部分的 JSON
结构如:
1 | { |
Signature(签名)
签名用于验证消息在传输过程中没有被更改,在用私钥签名的令牌的情况下,还可以验证 JWT
的发送者是否匹配。
创建签名的步骤:
对
JWT
的头部进行Base64Url
编码。对
JWT
的负载进行Base64Url
编码。将编码后的头部和负载用点(
.
)连接起来。使用指定的
HMAC SHA256
算法和密钥对连接后的字符串进行处理后便得到JWT
的签名部分。
进一步,将 JWT
的头部,负载分别进行使用算法处理后与签名一起,中间使用 .
连接起来,便得到完整的 JWT
字符串。其格式为:
1 | xxxxxx.yyyyyy.zzzzzz |
JWT应用
身份认证:用户登录后,服务器生成一个JWT token,返回给用户。之后用户的每次请求都会带上这个token,服务器验证token的有效性后,进行资源访问控制。这是目前
JWT
的主要使用场景。信息交换:在多个服务之间安全地传输信息。由于
JWT
构造简单,且具有一定安全性,因此可以用来在一些系统或服务间便携安全地传输信息。
JWT的安全性
应该使用HTTPS协议来防止中间人攻击。
保护好签名密钥,避免泄露。
避免在
JWT
中嵌入敏感信息,因为base64编码并不是加密。设置合适的过期时间,以减少token被滥用的风险。