JWT web token
**JWT(JSON Web Token)**是一种开放的标准(RFC 7519),定义了一种紧凑的、自包含的方式来安全地在各方之间传输信息作为一个 JSON 对象。这个信息可以被验证和信任,因为它是数字签名的。JWT 已经被广泛用于认证和授权,例如在单点登录(Single Sign-On, SSO)场景中。 ### JWT 构成 JWT 由三部分组成,分别是 Header(头部)、Payload(负载)和 Signature(签名)。 #### 1. Header 头部通常包含两部分:令牌的类型(JWT)和使用的哈希算法(如 HMAC SHA256 或 RSA)。头部信息被编码为 JSON 对象,然后进行 Base64URL 编码。 #### 2. Payload 负载部分包含了声明(claims)。声明是关于实体(通常是用户)和其他数据的断言。声明分为三种类型: - **Registered Claims**:预定义的声明,如 `iss`(发行者)、`exp`(过期时间)、`sub`(主题)、`aud`(受众)等。 - **Public Claims**:可以自由定义,但需要避免冲突。 - **Private Claims**:特定发件人和接收者之间的私有声明。 负载也被编码为 JSON 对象并进行 Base64URL 编码。 #### 3. Signature 签名用于验证 JWT 的完整性和来源。它通过将编码后的头部和负载连接在一起,然后用一个密钥和在头部指定的算法来计算哈希。这确保了 JWT 没有被篡改。 ### JWT 工作流程 - 用户通过提供凭证(如用户名和密码)向服务器请求认证。 - 服务器验证成功后,创建一个 JWT,并使用秘密(secret key)生成签名。 - 服务器将 JWT 返回给客户端,客户端将其存储(例如在本地存储或Cookie)。 - 当客户端需要访问受保护的资源时,它将 JWT 作为授权标头发送到服务器。 - 服务器验证 JWT 的签名,确认其未被篡改,并解码其中的声明以获取用户信息,如果验证通过,允许访问资源。 ### JWT 应用场景 - **身份验证**:当用户登录后,服务器会返回一个 JWT,之后用户可以将其保存并在后续请求中提供,以证明他们的身份。 - **权限控制**:JWT 可以包含关于用户角色和权限的声明,服务器可以通过解析 JWT 来决定用户对资源的访问权限。 - **信息交换**:由于 JWT 是自包含的,可以在安全的环境中传输信息。 ### 开源工具 在开发过程中,可以使用各种开源工具和库来处理 JWT,例如: - Node.js 中的 `jsonwebtoken` 库,用于生成、解析和验证 JWT。 - Java 中的 `jjwt` 库,提供了 JWT 的实现。 - .NET 中的 `System.IdentityModel.Tokens.Jwt`,是.NET Framework 和 .NET Core 的内置组件。 ### 注意事项 - **安全性**:尽管 JWT 提供了安全性,但必须妥善管理密钥,避免被泄露。此外,JWT 不应存储敏感信息,因为它们可能在客户端被查看。 - **过期时间**:为了避免永久性会话,应该设置合理的过期时间。同时,也可以考虑使用刷新令牌(refresh token)来更新 JWT。 ### 总结 JWT 作为一种轻量级的身份验证和授权机制,已经成为现代 Web 应用中的重要组成部分。理解其原理和工作流程,以及如何在实际项目中使用,对于 IT 从业人员来说至关重要。