JWT 在目前的项目开发中使用到的频率是非常高的,因此它也是面试常问的一类问题,所以今天我们就来看看“项目中 JWT 的执行流程?”这个问题。
1.什么是 JWT?
JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。其核心特点是通过紧凑且自包含的 JSON 对象传递数据,无需服务端存储会话状态。
2.JWT组成
JWT 是由三部分组成的:
- Header(头部):通常由以下两部分组成:
- Token 类型:通常是 JWT。
- 加密算法:例如 HS256(HMAC SHA-256)、RS256(RSA SHA-256)等。
- Payload(载荷) :JWT 的主体部分,通常为以下三类:
- 标准声明(Registered Claims):预定义的字段,如 iss(发行者)、exp (过期时间)、sub(主题)等。
- 公共声明(Public Claims):用户自定义的字段,例如用户 ID、用户名、角色等。
- 私有声明(Private Claims):在特定场景下使用的字段,通常用于内部系统。
- Signature(签名):用于验证 Token 的完整性和防止篡改。
它们之间用点“.”分隔,形成一个字符串(Token)。
3.执行流程
JWT 执行流程如下:
在 Spring Boot 项目中,JWT 的执行流程主要分为以下步骤:
1. 用户登录与令牌生成
- 用户通过用户名和密码发起登录请求。
- 服务端验证用户凭证,若验证成功,则使用 JWT 工具类生成令牌:
- Header:指定算法(如 HS256)和令牌类型(JWT)。
- Payload:包含用户信息(如用户 ID、角色)和声明(如过期时间 exp)。
- Signature:使用密钥对 Header 和 Payload 进行签名,确保令牌不可篡改。
2. 客户端存储令牌
- 服务端将生成的 JWT 返回给客户端(通常通过响应体或 Header)。
- 客户端(如浏览器或移动端)将令牌存储在本地(如 LocalStorage 或 Cookie)。
3. 请求携带令牌
- 客户端在后续请求的 Authorization Header 中以 Bearer
格式携带 JWT。
4. 服务端验证令牌
- 拦截器/过滤器:Spring Boot 通过自定义拦截器或 Spring Security 过滤器链拦截请求,提取并验证 JWT:
- 签名验证:使用密钥校验签名是否有效。
- 过期检查:检查 exp 字段是否过期。
- 用户信息提取:解析 Payload 中的用户信息(如用户 ID),用于后续权限控制。
5. 授权与响应
- 若验证通过,服务端处理请求并返回数据。
- 若验证失败(如令牌过期或签名错误),返回 401 状态码或自定义错误信息。
4.JWT核心实现代码
// 生成 JWT(示例)|SECRET_KEY 为服务保存的密钥。
public String generateToken(UserDetails user) {
return Jwts.builder()
.setSubject(user.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}// 验证 JWT(示例)
public boolean validateToken(String token) {try {Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);return true;} catch (Exception e) {return false;}
}
注意事项
- 密钥安全:签名密钥需妥善保管,并定期修改,避免泄露。
- 无状态性:JWT 无需服务端存储会话信息,适合分布式系统。
5.JWT 优点分析
JWT 相较于传统的基于会话(Session)的认证机制,具有以下优势:
- 无需服务器存储状态:传统的基于会话的认证机制需要服务器在会话中存储用户的状态信息,包括用户的登录状态、权限等。而使用 JWT,服务器无需存储任何会话状态信息,所有的认证和授权信息都包含在 JWT 中,使得系统可以更容易地进行水平扩展。
- 跨域支持:由于 JWT 包含了完整的认证和授权信息,因此可以轻松地在多个域之间进行传递和使用,实现跨域授权。
- 适应微服务架构:在微服务架构中,很多服务是独立部署并且可以横向扩展的,这就需要保证认证和授权的无状态性。使用 JWT 可以满足这种需求,每次请求携带 JWT 即可实现认证和授权。
- 自包含:JWT 包含了认证和授权信息,以及其他自定义的声明,这些信息都被编码在 JWT 中,在服务端解码后使用。JWT 的自包含性减少了对服务端资源的依赖,并提供了统一的安全机制。
- 扩展性:JWT 可以被扩展和定制,可以按照需求添加自定义的声明和数据,灵活性更高。
小结
JWT 是一种用于身份验证的开放标准,由 Header、Payload、Signature 组成。它的执行流程是:用户登录后生成加密令牌、客户端存储并在请求头携带、服务端验证签名和过期时间后授权。它的优点包括无状态、跨域支持、自包含性,适用于分布式系统和微服务架构,通过签名确保数据安全。
课后思考:JWT 过期后会怎样?如何实现自动续期?
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列等模块。