面试官:说说你项目中JWT的执行流程?

JWT 在目前的项目开发中使用到的频率是非常高的,因此它也是面试常问的一类问题,所以今天我们就来看看“项目中 JWT 的执行流程?”这个问题。

1.什么是 JWT?

JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。其核心特点是通过紧凑且自包含的 JSON 对象传递数据,无需服务端存储会话状态。

2.JWT组成

JWT 是由三部分组成的:

alt

  • 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 执行流程如下:

alt 在 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 是一种用于身份验证的开放标准,由 Header、Payload、Signature 组成。它的执行流程是:用户登录后生成加密令牌、客户端存储并在请求头携带、服务端验证签名和过期时间后授权。它的优点包括无状态、跨域支持、自包含性,适用于分布式系统和微服务架构,通过签名确保数据安全。

课后思考:JWT 过期后会怎样?如何实现自动续期?

#java##八股文#
Java面试精讲 文章被收录于专栏

Java常见面试题、场景题、企业真题精讲。

全部评论
更多面试题,可以定于我的牛客专栏:https://www.nowcoder.com/creation/manager/columnDetail/0OZ35z
点赞 回复 分享
发布于 02-20 15:30 北京

相关推荐

运维实习生一面(2025年4月)面试时间:2025年4月面试形式:语音面试面试时长:约12分钟面试流程自我介绍与背景面试官先确认了我的年级和学校所在地,我介绍自己是大三,目前课程压力不大,可以随时到岗实习。项目与技术经历主要聊了在学校实验室做运维的经历,包括负责小程序的运维、Docker部署、前后端代码编译和Nginx部署、MySQL数据库使用等。介绍了用阿里云作为主服务器,腾讯云做备份,自己写了MySQL数据库备份脚本,用rsync每天同步到腾讯云。面试官追问了备份细节、是否做多活、服务规模(访问量、数据库大小等),我如实回答是单体服务,数据量不大,主要是SQL备份,没有做多活,访问量每天不到1000,数据库文件不到100M。自学与技术栈我提到自学了Go语言,写过项目。面试官问到自动化运维相关经验,我说部署过一次K8S集群,装了Nginx,使用官方工具和网络插件(如Flannel),并解释了不同网络插件的区别和部署过程。详细描述K8S部署过程:我用的是官方的kubeadm工具,先在一台云服务器上初始化master节点,再用kubeadm join把另一台node节点加入集群。网络插件一开始用的是Calico,但因为两台服务器分别在不同云厂商(阿里云和腾讯云),公网环境下Calico的BGP路由不太好连通,后面改用Flannel的overlay模式,才让节点间网络打通。部署过程中遇到过证书、端口开放、网络策略等问题,都是查官方文档和社区帖子解决的。Nginx是在K8S集群里用Deployment方式部署的,配置了Service做负载均衡,整体流程从环境初始化、节点加入、网络插件选择到应用部署都自己动手实践过。监控与日志服务日志采集主要用MySQL自带日志,没有用ELK。监控方面用Prometheus,自己在Go项目里加了中间件,统计请求数和耗时。具体做法是用Prometheus的client库,在HTTP请求入口加request counter和request time的指标,暴露metrics接口给Prometheus拉取。实习意向与公司情况面试官介绍了公司运维团队和研发团队的规模,以及云平台和自建机房的情况。公司有多云环境和自建机房,能接触到GPU服务器,但具体要看个人能力和项目安排。我表达了希望能接触K8S、CI/CD等自动化运维技术,也问了是否有机会接触大模型相关服务器。面试官表示公司有相关项目,但分配要看实际情况。面试建议与流程面试官建议实习生更看重基础和学习能力,不会太在意线上大规模经验。介绍了面试流程,后续可能有HR和老板面试,结果会在一周内通知。整体面试氛围轻松,问题以项目经历和技术细节为主,K8S部署和云平台运维相关内容问得比较细。后面进来之后发现面试我的是+2,技术还是很好的,人也非常好
运维求职圈
点赞 评论 收藏
分享
07-11 16:49
已编辑
测试开发
呜呜呜,一面面试下来体验感挺好的,但我是笨蛋1.自我介绍2.对于测试开发岗位有什么了解3.你更希望从事哪一方向4.现在有两个选择,一个是稳定的业务部门有带教老师指导你做一些工作,一个是刚起步独立的部门,做的任务有挑战,你选哪一个5.使用python在linux编写脚本测试linux系统重启功能,执行命令是什么6.你开发测试并维护了一个测试平台,然后节假日放了个小长假回来发现这个平台在假期第二天崩溃了,你会怎么处理这个问题,说出详细步骤7.自动化的测试框架你了解多少,主要用什么,还了解其他的吗,为什么当时选择这个框架去搭建接口自动化8.你还了解其他自动化测试吗9.你还知道其他的可以为测试提效的方式吗10.有了解过公司的产品吗11.美图秀秀这个软件的照相功能从性能角度出发你怎么测试12.对一个钥匙扣进行测试,如果我们公司没有钥匙,挂钩,包,你应该怎么去测他的兼容性易用性13.当你发现了一个问题的时候你怎么分析定位14.还有其他的问题我想一下反问:1.公司支持员工在工作中使用AI完成工作吗2.您觉得对于入职测试开发岗位的应届生需要面临的挑战有哪些3.岗位base地在哪体验:很棒,面试官挺帅的,沟通过程中也会引导你多说一些,但是沟通到最后他说这个岗位的门槛很高,面试通过率低,我们需要去找到最合适的人选,我应该是黄了啊啊啊啊啊啊啊我是笨蛋,我很想加入这个公司,我爱厦门我爱美图秀秀二面hr线上面问了一下处理问题的一些问题,然后最后问了一下薪资。个人体验没有太好
查看42道真题和解析
点赞 评论 收藏
分享
评论
4
33
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务