JWT是什么?
JWT(JSON Web Token)是一种轻量级的安全传输方式,可以用于在不同的系统之间传递安全可靠的信息,例如用户身份验证、授权和信息交换等。JWT采用JSON格式对信息进行编码和传输,用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 的公钥/私钥对进行签名
JWT的结构
JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:头部(Header)、载荷(Payload)和签名(Signature)。
头部
头部包含了JWT的类型和使用的算法,例如:
{
"alg": "HS256",
"typ": "JWT"
}
载荷
载荷包含了JSON格式的信息,例如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
签名
签名是对头部和载荷进行数字签名或加密生成的,例如:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
三部分加密后组合
头部和载荷使用Base64编码,签名使用指定算法和密钥生成,生成形如这样的密钥
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTQ0ODc1OTIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
基于Token的身份认证 与 基于服务器的身份认证
-
客户端发送POST请求
-
在服务器端生成一个JWT,包括头部、载荷和签名,其中头部和载荷使用Base64编码,签名使用指定算法和密钥生成。
-
将生成的JWT返回给客户端。
-
客户端在后续的请求中将JWT添加到HTTP请求头中的Authorization字段中
-
服务端检查JWT签名,从JWT获得用户名
-
服务端发送响应给客户端
JWT,SWT,安全断言标记语言令牌(SAML)的区别
1. json编码后短
由于JSON 不如 XML 那么冗长,因此在编码时其大小也更小;使 JWT 比 SAML 更紧凑。这使得 JWT 成为在 HTML 和 HTTP 环境中传递的不错选择。
2. 安全性高
在安全方面,SWT 只能由使用 HMAC 算法的共享密钥进行对称签名。而 JWT 和 SAML 令牌也可以使用 X.509 证书形式的公钥/私钥对来签名。但是,与对 JSON 进行签名的简单性相比,使用 XML 数字签名对 XML 进行签名而不引入模糊的安全漏洞是非常困难的。
3. 映射方便
JSON 解析器在大多数编程语言中很常见,因为它们直接映射到对象,相反,XML 没有自然的文档到对象的映射。这使得使用 JWT 比使用 SAML 断言更容易。