一、什么是 JWT
1.1、JWT的介绍
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。
简单来说,JWT 就是用来判断某种信息是否可以被信任的一种签名 json。
1.2、JWT 的使用场景
身份验证(Authentication):JWT 可以被用作用户登录的身份验证凭证。当用户成功登录后,服务端可以生成一个包含用户信息的 JWT,并将其返回给客户端。以后,客户端在每次请求时都会携带这个 JWT,服务端通过验证 JWT 的签名来确认用户的身份。
授权(Authorization):在用户登录后,服务端可以生成包含用户角色、权限等信息的 JWT,并在用户每次请求时进行验证。通过解析 JWT 中的声明信息,服务端可以判断用户是否有权限执行特定的操作或访问特定的资源。
信息交换(Information Exchange):由于 JWT 的声明信息可以被加密,因此可以安全地在用户和服务器之间传递信息。这在分布式系统中非常有用,因为可以确保信息在各个环节中的安全传递。
单点登录(Single Sign-On):JWT 可以被用于支持单点登录,使得用户在多个应用之间只需要登录一次即可使用多个应用,从而提高用户体验。
1.3、JWT 的优势
无状态:JWT 的验证是基于密钥的,因此它不需要在服务端存储用户信息。这使得 JWT 可以作为一种无状态的身份认证机制。
跨语言支持:JWT 的标准化和简单性质使得它可以在多种语言和平台之间使用。
安全性高:由于 JWT 的载荷可以进行加密处理,因此 JWT 能够保证数据的安全传输。同时,JWT 的签名机制也能够保证数据的完整性和真实性。
二、JWT 的结构
JWT 由 Header+Payload+Signature 三部分组成
2.1、Header
JWT 的头部通常由两部分组成,分别是令牌类型(typ)和加密算法(alg)。一般情况下,头部会采用 Base64 编码。
{
"alg": "HS256",
"typ": "JWT"
}
2.2、Payload
JWT 的载荷也称为声明信息,包含了一些有关实体(通常是用户)的信息以及其他元数据。通常包括以下几种声明:
Registered Claims:这些声明是预定义的,包括 iss(发行者)、sub(主题)、aud(受众)、exp(过期时间)、nbf(生效时间)、iat(发布时间)和 jti(JWT ID)等。
Public Claims:这些声明可以自定义,但需要注意避免与注册声明的名称冲突。
Private Claims:这些声明是保留给特定的应用程序使用的,不会与其他应用程序冲突。
注意:Payload 中一定不要存放敏感或重要信息,如密码等
{
"sub": "666666",
"name": "warriors",
"admin": true
}
2.3、Signature
JWT 的签名是由头部、载荷和密钥共同生成的。它用于验证 JWT 的真实性和完整性。一般情况下,签名也会采用 Base64 编码。 例如,如果要使用 HMAC SHA256 算法,将按以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
三、JWT 和 token 的区别
JWT 和 Token 都是用于身份验证的机制,但它们在格式、安全性、扩展性、无状态性以及使用场景上存在明显的区别。
格式:Token 通常是一个字符串,包含了用户的身份信息和其他相关信息,如用户 ID、过期时间等。而 JWT(JSON Web Token)是一种特定的 Token 格式,使用 JSON 对象来存储这些信息,并使用 Base64 编码进行传输。
安全性:JWT 通过使用签名来验证 Token 的有效性,确保 Token 在传输过程中没有被篡改,从而提供更高的安全性。而一般的 Token 没有这种机制,只能通过验证 Token 的合法性来确保安全性。
扩展性:JWT 能够存储更多的信息,如用户的角色、权限等,提供了更好的扩展性。而一般的Token 只能存储有限的信息。
无状态性:JWT 是无状态的,意味着服务端不需要保存任何用户信息,只需验证 JWT 的签名即可。这减少了服务端的负担,提高了系统的可扩展性。相比之下,一般的 Token 需要在服务端存储相关信息,增加了服务端的负担。
使用场景:Token 的使用场景广泛,包括但不限于 API 认证、Web 应用认证等。JWT 特别适用于跨域认证场景,因为它将用户信息加密到 Token 中,服务器不保存任何用户信息,通过使用保存的密钥验证 Token 的正确性来进行身份验证。
综上所述,JWT 和 Token 虽然都是用于身份验证的机制,但 JWT 因其特有的安全性和无状态性,以及更好的扩展性,在需要高安全性和可扩展性的应用场景中更为适用。