Skip to content

分布式会话与状态管理面试题:Session、JWT、Redis与无状态服务

本页只放面试标准回答和原理跳转。完整链路、流程图、Demo 和 Runbook 见分布式会话主线

高频问题

面试题标准回答原理知识点
单机Session到多实例为什么有问题单机Session在当前JVM内存里,多实例后下一次请求可能被负载均衡到另一台机器,另一台机器没有这个Session,就会被当成未登录。分布式会话要解决身份状态放在哪里、任意实例怎样恢复身份。单机Session问题
分布式Session有哪些方案常见有粘性会话、Session复制、Redis Session、JWT、Opaque Token。粘性会话简单但故障和扩容体验差;Redis Session服务端可撤销但依赖Redis;JWT扩展性好但撤销、权限变更和泄露处理复杂。方案对比
Redis Session怎么工作登录成功后服务端生成SessionId,把Session数据写Redis,浏览器保存Cookie。后续请求携带SessionId,任意实例都能从Redis恢复用户上下文。它支持登出和踢人,但Redis延迟、故障、Session过大都会影响登录态。Redis Session
JWT为什么不是完全无状态JWT减少了中心化Session读取,但登出、改密码、权限收回、Token泄露、密钥轮换都需要服务端状态或版本,例如黑名单、短Token、Refresh Token、tokenVersion、权限版本和JWK轮换。JWT不是完全无状态
JWT里能不能放敏感信息不能。普通JWT payload只是Base64Url编码,不是加密,拿到Token的人可以解码看到内容。Token里只放必要声明,如sub、iss、aud、exp、jti、scope、tenant_id,不放密码、身份证、手机号、密钥。JWT怎么工作
粘性会话有什么问题粘性会话让同一用户尽量打到同一实例,但实例故障、扩缩容、哈希重分布会导致登录态丢失,还会让热用户或大租户集中到单实例。它可以做优化,不适合作为关键登录态唯一方案。粘性会话边界
哪些状态不能只放本地内存登录态、权限、验证码、购物车、幂等记录、上传进度、离线消息等影响正确性的状态不能只放单实例内存。本地内存只适合可重建、短暂旧值可接受、丢失影响小的缓存。状态放哪里
WebSocket连接状态怎么管理连接对象只能在当前实例内存,但用户到连接实例的映射应放Redis或连接注册表,离线消息放MQ或数据库。实例宕机后连接必然断开,靠心跳、TTL、重连和离线消息恢复。WebSocket状态
权限改了为什么用户还拥有旧权限可能是权限写在JWT快照里且Token未过期,也可能是Redis权限缓存、本地缓存、Gateway缓存没有失效。应缩短Access Token有效期,使用tokenVersion或权限版本,改权限后清缓存并让旧Token失效。权限变更Runbook
用户串号怎么排查优先查ThreadLocal、MDC、SecurityContextHolder是否在finally清理;再查异步任务是否复用上下文,Gateway是否清洗用户Header,本地缓存Key是否缺少userId或tenantId,是否用静态变量保存用户。用户串号Runbook

场景题

1. 用户登录后刷新几次就掉线,怎么排查

标准回答:

我会先看登录方案。Session模式下查Cookie是否携带、Domain/Path/SameSite/Secure是否正确,再查负载均衡是否打到没有Session的实例,Redis Session是否过期、被删除或序列化失败。JWT模式下查Authorization是否携带、Token是否过期、刷新Token是否失败、Gateway和后端是否使用不同密钥。还要看网关和后端是否同时维护两套登录态。

原理入口:用户反复掉线Runbook

2. JWT退出登录后为什么还能访问

标准回答:

因为JWT在过期前只要签名、issuer、audience和时间校验通过,服务端默认会信任它。退出登录如果不记录黑名单、不提升tokenVersion、不缩短Access Token有效期,旧Token仍可能访问。生产常用短Access Token、Refresh Token、Redis黑名单、tokenVersion和设备维度撤销组合。

原理入口:JWT不是完全无状态

面试回答模板

text
分布式会话要解决多实例下任意请求都能恢复用户身份的问题。单机Session放JVM内存,多实例后请求打到其他实例会丢。常见方案有粘性会话、Session复制、Redis Session、JWT和Opaque Token。Redis Session把状态放服务端,便于登出、踢人和权限撤销,但依赖Redis高可用;JWT横向扩展好,但不是完全无状态,登出、权限变更、泄露和密钥轮换需要短Token、Refresh Token、黑名单、tokenVersion或权限版本。影响正确性的状态不要只放单实例内存,本地状态必须可重建或丢失可接受。

本章小结

分布式会话面试不要只说“用JWT”。要讲清 Session、Redis、JWT、粘性会话、撤销、权限变更、Token泄露、本地状态、WebSocket和生产排查。