什么是JWT(JSON Web Token)?
JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对对JWT进行签名。
1.JWT能做什么?
-
授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。
-
信息交换:JSON Web令牌是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。
2. JWT的结构
JSON Web Token以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是:
- Header(标头)
- Payload(有效载荷)
- Signature(签名)
因此,JWT通常如下所示。
xxxxx.yyyyy.zzzzz
Header
标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。使用Base64UrlEncode编码组成JWT结构的第一部分
{
"alg": "HS256",
"typ": "JWT"
}
Payload
令牌的第二部分有效负载。其包含声明。声明是有关实体(通常是用户)类和其他数据的声明。同样使用Base64UrlEncode编码组成第二部分。 不要存放敏感信息。
{
"sub":"123456"
"name":"John Doe"
"admin":true
}
Signature
前面两部分都是使用base64进行编码。及前端可以知道里面的信息。signature需要使用编码后的header和payload以及我们提供的一个密钥。然后使用header中指定的签名算法进行签名。签名的作用是保证jwt没有被篡改过。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
签名的目的: 最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被篡改。
如果有人对头部信息内容进行篡改,在进行编码,加上之前的签名组合形成新的jwt的话