JWT的全称是Json Web Token。是基于RFC 7519开放标准的,它定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以用作验证和相互信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。
以下是JWT两种使用场景:
授权
:这是使用 JWT 的最常见的使用场景。用户登录后,每个后续请求都将包含 JWT,允许用户访问使用该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够跨不同域轻松使用。信息交换
:JWT是在各方之间安全传输信息的比较便捷的方式。由于 JWT 可以签名(例如,使用公钥/私钥对),因此可以确定发送者是否是在您的授权范围之内。并且,由于签名是使用标头和有效负载计算的,因此还可以验证内容是否未被篡改。
JWT的组成
这是一个JWT的token串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
很复杂,看不懂是不是?其实这一串是经过加密之后的密文字符串,中间通过.
来分割。每个.
之前的字符串分别表示JWT的三个组成部分:Header
、Payload
、Signature
。
Header部分定义
Payload(负载信息)
也称为JWT claims,放置需要传输的信息,有三类:
保留claims
:主要包括iss发行者、exp过期时间、sub主题、aud用户等。公共claims
:定义新创的信息,比如用户信息和其他重要信息。私有claims
:用于发布者和消费者都同意以私有的方式使用的信息
Signatrue(签名信息)
Signature 部分是对Header和Payload两部分的签名,作用是防止 JWT 被篡改。这个部分的生成规则主要是是公式(伪代码)是:
Header中定义的签名算法(
base64编码(header) + "." + base64编码(payload),
secret
)
secret
是存放在服务端加密使用到的盐。
得到签名之后,把Header的密文、Payload的密文、Signatrue的密文按顺序拼接成为一个字符串,中间通过.
来连接并分割,整个串就是JWT了。