JWT的认证流程、加密算法及令牌原理是什么?

1 个回答

  • 玄清月
    在自己的世界独善其身在别人的世界顺其自然。
    # JWT 的认证流程、加密算法及令牌原理 ## 作用 JWT(JSON Web Token)是一种紧凑、自包含的令牌格式,用于在客户端和服务端之间安全传输 JSON 信息。其主要作用包括: - **身份认证**:用户登录成功后,服务端签发 JWT,客户端后续请求携带该令牌完成认证。 - **无状态认证**:服务端不需要保存 Session,可直接根据令牌内容和签名完成校验,适合分布式、微服务场景。 - **跨域和移动端支持**:通常通过请求头 `Authorization: Bearer <token>` 传输,不依赖 Cookie。 - **信息自包含**:Payload 中可以携带用户 ID、角色、过期时间等声明。 - **防篡改验证**:接收方可以通过签名验证 Header 和 Payload 是否被篡改。 ## 原理 ### 1. JWT 的结构 JWT 由三部分组成,使用 `.` 分隔: ```text Header.Payload.Signature ``` #### Header:头部 Header 是令牌的元数据,通常包含: - `alg`:签名算法,例如 `HS256`、`RS256`。 - `typ`:令牌类型,通常为 `JWT`。 示例: ```json { "alg": "HS256", "typ": "JWT" } ``` 该 JSON 会经过 Base64Url 编码,形成 JWT 的第一段。 #### Payload:载荷 Payload 用于存放声明(Claims),也就是令牌中传递的数据。常见声明包括: - `iss`:签发者。 - `sub`:主题。 - `aud`:受众。 - `iat`:签发时间。 - `exp`:过期时间。 - 自定义字段:如 `userId`、`role` 等。 示例: ```json { "sub": "1234567890", "name": "John Doe", "iat": 1516239022, "exp": 1516242622, "userId": 1001, "role": "ADMIN" } ``` Payload 同样会经过 Base64Url 编码。需要注意:**Base64Url 只是编码,不是加密,因此不要在 Payload 中存放密码、密钥等敏感信息。** #### Signature:签名 签名用于验证令牌完整性和来源合法性。生成过程为: 1. 对 Header 进行 Base64Url 编码。 2. 对 Payload 进行 Base64Url 编码。 3. 使用 `.` 将两者拼接。 4. 使用 Header 中声明的算法和服务端密钥生成签名。 以 `HS256` 为例: ```text HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret ) ``` 最终形成: ```text Base64Url(Header).Base64Url(Payload).Signature ``` ### 2. 常见签名算法 JWT 常用算法包括: - **HS256(HMAC-SHA256)**:对称签名算法,签发和验证使用同一个 Secret,适合服务端自身签发和校验的场景。 - **RS256(RSA-SHA256)**:非对称签名算法,使用私钥签发、公钥验证,适合多方验证或需要隔离签发能力的场景。 签名的重点不是隐藏内容,而是防止内容被篡改。 ### 3. 认证流程 典型 JWT 认证流程如下: 1. **用户登录**:客户端向服务端提交用户名、密码等凭证。 2. **服务端校验身份**:验证用户凭证是否正确。 3. **服务端签发 JWT**:将用户标识、角色、签发时间、过期时间等放入 Payload,并使用密钥进行签名。 4. **客户端保存令牌**:JWT 可保存在 localStorage、Cookie 或移动端本地存储中。 5. **后续请求携带令牌**:客户端通常在请求头中携带: ```http Authorization: Bearer <token> ``` 6. **服务端验证令牌**: - 根据 Header 中的算法重新计算签名。 - 对比请求中携带的 Signature 是否一致。 - 检查 `exp` 等声明,判断令牌是否过期。 - 校验签发者、受众等字段是否符合要求。 7. **认证通过后处理业务**:验证成功,服务端从 Payload 中读取用户信息并授权访问;验证失败则拒绝请求。 ### 4. 核心特点 - **无状态**:服务端不必保存会话,只需根据密钥和令牌内容进行校验。 - **可验证完整性**:签名不一致说明 Header 或 Payload 已被篡改。 - **内容不保密**:Header 和 Payload 仅做 Base64Url 编码,任何人都可以解码查看。 - **默认难主动失效**:由于服务端不存储令牌状态,JWT 在过期前通常持续有效;如需强制登出或封禁,需要结合黑名单、版本号、白名单等机制。
    发布于 2026-10-28 11:05 •IP属地 广东
    举报
    评论
    收藏