2.9 KiB
JWT
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
由于其轻量级和易于使用的特性,JWT在现代的Web应用中非常流行,尤其是在需要跨域认证的场景中。
JWT的组成
JWT由三部分组成,用点.
分隔,形成header.payload.signature
的结构:
-
Header(头部):通常由两部分组成:算法(alg)和令牌类型(typ)。例如:
{"alg":"HS256","typ":"JWT"}
。 -
Payload(负载):包含所谓的“Claims”,即声明。声明可以是注册声明,也可以是公开的声明。注册声明是预定义的声明,如
iss
(发行者),sub
(主题),aud
(观众),exp
(过期时间),iat
(签发时间),jti
(JWT的唯一身份标识)等。公开的声明可以由发行者自行定义。 -
Signature(签名):是一个使用头部中指定的算法对前两部分进行签名的结果。签名用于验证消息在传递过程中没有被篡改,并且,如果使用了私钥签名,还可以验证JWT的发行者。
JWT的工作流程
-
用户认证:用户使用用户名和密码在客户端进行认证。
-
认证服务器验证:服务器验证用户的凭据,如果验证成功,服务器会生成一个JWT。
-
发送JWT:服务器将JWT发送回客户端。
-
存储JWT:客户端可以将其存储在本地存储(如LocalStorage)、SessionStorage或Cookies中。
-
发送请求:客户端在每次请求到受保护资源时,将JWT发送到服务器。
-
服务器验证:服务器接收到JWT后,会验证其签名的有效性,并检查如
exp
(过期时间)等声明,以确保JWT没有过期。 -
访问资源:如果JWT有效,服务器允许客户端访问请求的资源。
-
刷新令牌:如果JWT过期,客户端可以使用刷新令牌(如果存在)来获取新的JWT。
示例
假设一个用户登录了一个网站,以下是JWT的工作流程:
- 用户输入用户名和密码。
- 网站将这些凭据发送到服务器。
- 服务器验证凭据,如果验证通过,生成一个JWT。
- 服务器将JWT发送回用户。
- 用户将JWT存储在浏览器的LocalStorage中。
- 用户想要访问一个受保护的页面。
- 用户的浏览器发送一个请求到服务器,并将JWT作为请求的一部分发送。
- 服务器验证JWT的签名,检查
exp
声明以确保它没有过期。 - 如果JWT有效,服务器提供受保护的页面内容。
JWT是一种无状态的认证机制,它使得用户状态不需要存储在服务器上,从而减轻了服务器的负担,并且可以跨不同的服务和API进行使用。