什么是 JWT
JWT(JSON Web Token)是由 JSON 组成的开放标准(RFC 7519),用于在各方之间传递安全可靠的信息。一个 JWT 由三部分组成:Header(头部)、Payload(负载)和 Signature(签名)。
- Header: 存放算法和签名所需的参数。
- Payload: 存放 JWT 的实际内容,可以存放用户的信息和其他自定义信息。
- Signature: 通过 Header、Payload 和 Secret(密钥)生成,用于验证 JWT 是否为有效的、未被篡改的 Token。
JWT 的优势在于,它不需要在服务端存储会话信息,只需将必要信息存储在 Token 中,每次都将 Token 作为 HTTP Header 的一部分发送到服务器端,无需专门的存储、传输和解析会话信息,从而降低了服务器的负担。
JWT 的认证与授权
在 RESTful API 中,JWT 可以用来认证和授权用户的请求。当用户登录时,服务器生成 JWT 并返回给客户端,客户端在后续请求中将 JWT 作为请求头传递到服务器端,服务器验证 JWT 是否有效,如果有效则允许用户访问相应的资源。以下是 JWT 的认证和授权过程:
- 用户在客户端输入用户名和密码进行登录。
- 服务器验证用户的信息,如果成功登录,则生成 JWT。
- 服务器将 JWT 发送给客户端,客户端将 JWT 存储在本地。
- 在后续请求中,客户端将 JWT 作为请求头传递给服务器。
- 服务器验证 JWT 的有效性,如果有效,则允许用户访问相应的资源。
JWT 的配置与安全性
- Secret(密钥): JWT 的签名算法需要一个 Secret 作为密钥,用来进行签名和验证。Secret 一旦泄露,会给整个系统带来安全风险,因此需要保护好 Secret。同时,Secret 需要定期更新,确保安全性。
- 过期时间: JWT 的过期时间决定了 Token 能够被使用的有效期。过期时间过短会导致频繁的登录,过期时间过长会降低安全性。合适的过期时间应该根据具体的应用场景进行权衡和调整。
- 颁发者和受众: JWT 包含了颁发者(iss)和受众(aud)两个字段作为限制条件,确保 Token 只能被指定的应用场景使用。同时,颁发者可以用于标识 Token 的合法性。
- 签名算法: JWT 可以使用多种签名算法进行签名和验证,不同的签名算法具有不同的安全性和效率。目前主流的签名算法有:HMAC SHA-256、RSA 和 ECDSA。
示例代码
登录生成 JWT
----- --- - ------------------------ ----- ------ - ----------- -- ------------ ----- ------ --------------------- ----- ----- ---- -- - ----- - -------- - - --------- ----- ----- - ---------- -------- -- ------- - ---------- -- - -- --- ---------- ----- -- ---
验证 JWT
----- --- - ------------------------ ----- ------ - ----------- -- -- ----- ------------------- ----- ----- ---- -- - ----- ----- - ---------------------------------- ------ ----------------- ------- ----- -------- -- - -- ----- ------ -------------------- ----- - -------- - - -------- ---------- -------- --- --- ---
总结
JWT 是一个简单、安全、可靠的认证和授权方案,在很多应用场景中都可以发挥重要的作用。但同时也需要注意合理的配置和安全性保障,否则可能会带来风险和损失。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66427516d3423812e405ea7e