写点什么

搞懂 JWT 的执行流程,比你想象中简单

作者:秃头小帅oi
  • 2025-02-19
    福建
  • 本文字数:2228 字

    阅读完需:约 7 分钟

搞懂JWT的执行流程,比你想象中简单

JWT 执行流程:用户登录后生成加密令牌、客户端存储并在请求头携带、服务端验证签名和过期时间后授权。它的优点包括无状态、跨域支持、自包含性,适用于分布式系统和微服务架构,通过签名确保数据安全。

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)的认证机制,具有以下优势:

  1. 无需服务器存储状态:传统的基于会话的认证机制需要服务器在会话中存储用户的状态信息,包括用户的登录状态、权限等。而使用 JWT,服务器无需存储任何会话状态信息,所有的认证和授权信息都包含在 JWT 中,使得系统可以更容易地进行水平扩展。

  2. 跨域支持:由于 JWT 包含了完整的认证和授权信息,因此可以轻松地在多个域之间进行传递和使用,实现跨域授权。

  3. 适应微服务架构:在微服务架构中,很多服务是独立部署并且可以横向扩展的,这就需要保证认证和授权的无状态性。使用 JWT 可以满足这种需求,每次请求携带 JWT 即可实现认证和授权。

  4. 自包含:JWT 包含了认证和授权信息,以及其他自定义的声明,这些信息都被编码在 JWT 中,在服务端解码后使用。JWT 的自包含性减少了对服务端资源的依赖,并提供了统一的安全机制。

  5. 扩展性:JWT 可以被扩展和定制,可以按照需求添加自定义的声明和数据,灵活性更高。

小结

JWT 执行流程:用户登录后生成加密令牌、客户端存储并在请求头携带、服务端验证签名和过期时间后授权。它的优点包括无状态、跨域支持、自包含性,适用于分布式系统和微服务架构,通过签名确保数据安全。

前沿拓展

在科技飞速发展的当下,程序员若想在职场中脱颖而出,就必须不断发掘新技术,增强自身竞争力。新技术不仅能拓宽职业道路,还能提升解决问题的能力。

以低代码开发为例,它打破了传统开发模式的束缚,通过可视化界面和少量代码,就能快速搭建应用程序。这种高效的开发方式正被越来越多的企业所采用。而 JNPF 快速开发平台,拥有丰富的组件库和强大的功能,能帮助程序员轻松应对各种复杂的业务需求。

应用地址:https://www.jnpfsoft.com

这是一个基于 Flowable 引擎(支持 java、.NET),已支持 MySQL、SqlServer、Oracle、PostgreSQL、DM(达梦)、 KingbaseES(人大金仓)6 个数据库,支持私有化部署,前后端封装了上千个常用类,方便扩展,框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用。

所以,程序员们不妨深入了解 JNPF 快速开发平台,掌握低代码开发技术,为自己的职业发展增添强大助力 。

用户头像

摸个鱼,顺便发点有用的东西 2023-06-19 加入

互联网某厂人(重生版)

评论

发布
暂无评论
搞懂JWT的执行流程,比你想象中简单_秃头小帅oi_InfoQ写作社区