面试官:说说你项目中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 北京

相关推荐

HR部门一面(2.25)手撕:LRU+一道SQL1. 项目是否上线?为什么不上线?2. 大营销项目是否是Demo项目?3. Java集合类型有哪些?4. ArrayList源码看过吗?扩容机制?是否可以自己设置容量?设置的太小或者太大有什么问题?5. 集合有哪些线程安全?6. Hash Table是线程安全的吗?7. HashMap和Hash Table有什么区别呢?8. HashMap能保持插入之后的读写顺序吗?9. 哪个类型能保证HashMap插入节点的顺序?10. ConcurrentHashMap线程安全是怎么实现的?11. 什么是线程、进程、协程?12. 有没有了解Java新版的虚拟线程?13. 介绍TCP连接过程?14. 介绍TCP结束过程?15. 有没有了解http对tcp做了哪些优化,来简化开发?16. http1.1和http2有什么区别?17. 介绍一下https的加密过程?18. 传输数据是采用什么加密?19. 非对称加密和对称加密的优缺点?20. 有个大数据的列表,之前是循环的for each处理,怎么简单的提高性能?21. 怎么重复利用线程?22. Mysql隔离级别?23. 什么是幻读?24. Mysql的数据库引擎?25. Mysql的索引类型?26. 什么是覆盖索引?27. 一次查询可以用多个索引吗?(索引合并)28. Mysql什么时候会出现死锁?29. 什么是索引碎片化?30. Sql的执行顺序?31. 如果Blog打不开,一直转圈,如何排查?32. Blog有没有使用数据库?如果是大营销系统,可能是什么问题?33. 用过大模型吗?deepseek大模型对其它大模型有什么优点?34. 你目前的Base?二面(3.3 凉)算法题 :Welcome to Tencent 按字符串反转([反转字符串中的单词](*******************************************************))项目:1. 有哪几个比较复杂的问题?通过什么方式解决的?2. 中奖概率怎么设计的?什么样的空间?Log(n)算法是什么?3. 奖品数据永远不会很大?需要设计两种算法吗?4. 抽奖的人分配什么东西?5. 1W个人,100个奖品,奖品概率为0.01? 能否全部抽完?如何保证全部抽完?6. 怎么控制随机性?通过什么算法去控制,让他基本在1W人能够全部抽到?7. 自定义组件来做分库分表怎么实现的?8. 散列会散列到多少张表上去?9. 用户的ID是怎么样的?哈希完之后的结果是怎么样的?10. 我看你是学大数据的,为什么没有往大数据方向走?11. 有没有往大数据和算法方面走的倾向?基于什么背景考虑?12. 看相关源码?有什么不错的想法分享吗?13. Redis的stream场景?14. 使用方式?15. 和RabbitMQ有什么区别?16. 为什么Stream有消息丢失问题?17. Redis的持久化有哪些方式?
点赞 评论 收藏
分享
评论
3
30
分享

创作者周榜

更多
牛客网
牛客企业服务