JWT 认证与授权

有一个项目采用了 Spring Security 和 JWT(JSON Web Token)进行用户认证和授权。

JWT 介绍

JWT 是一种基于 JSON 的开放标准(RFC 7519),用于在各方之间安全地传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT 通常用于身份验证和信息交换。

JWT 结构

JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。示例如下:

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}
1
2
3
4
5
6
7
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"roles": ["user", "admin"]
}
1
2
3
4
5
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)

认证流程

  1. 用户通过用户名和密码登录,系统验证用户身份。
  2. 验证通过后,系统生成 JWT,并将其返回给用户。
  3. 用户在后续请求中将 JWT 放入 Authorization 头中,格式为 Bearer <token>
  4. 服务器端通过解析 JWT,验证其合法性和有效性,从而完成用户身份验证。

授权流程

  1. 服务器在接收到客户端请求时,从 Authorization 头中提取 JWT。
  2. 服务器验证 JWT 的有效性(签名、过期时间等)。
  3. 若 JWT 有效,服务器根据令牌中的用户信息和权限,决定是否允许访问请求的资源。
  4. 若 JWT 无效或权限不足,服务器返回相应的错误响应(如 401 未授权或 403 禁止访问)。
  5. 用户登出时,客户端删除存储的 JWT,服务器可选择将该令牌加入黑名单以防止其继续使用。