Token 相关的高频面试题

一、基础概念题

1.什么是 Token?为什么不直接用用户名密码做身份验证?

每次请求都传密码,泄露风险大,服务器也要反复查库验证。Token 是一次验证后发放的临时凭证,减少密码暴露,降低服务器压力。

2.Cookie、Session、Token 三者的区别?

  • Cookie:浏览器存储机制,自动随请求发送,受同源策略限制
  • Session:服务端存储用户状态,通过 Cookie 里的 SessionID 关联,有状态
  • Token:客户端持有的凭证,服务端无状态,放在 Header 里传输,不依赖 Cookie

3.JWT 由哪三部分组成?各自的作用?

Header(算法声明)、Payload(数据载荷)、Signature(签名防篡改)。前两部分是 Base64 编码不是加密,Signature 用密钥生成,保证内容不被篡改。

4.JWT 的 Payload 是加密的吗?能放敏感信息吗?

不是加密,是 Base64 编码,任何人都能解码。绝对不能放密码、身份证号等敏感数据。如果需要加密载荷,要用 JWE(JSON Web Encryption)。

二、原理深入题

5.JWT 怎么保证数据没被篡改?

服务端用密钥对 Header + Payload 做签名生成 Signature。验证时重新计算签名,和 Token 里的 Signature 比对。攻击者没有密钥,改了 Payload 就对不上签名。

6.Token 存在哪里?localStorage vs Cookie 各有什么问题?

  • localStorage:方便,但容易被 XSS 攻击读取
  • Cookie(设置 HttpOnly + Secure + SameSite):JS 无法读取,防 XSS,但要处理 CSRF

推荐方案:Token 存 HttpOnly Cookie,配合 CSRF Token 双重防护。

7.Token 过期了怎么办?什么是 Refresh Token?

Access Token 设短过期时间(如 15 分钟),Refresh Token 设长过期时间(如 7 天)。Access Token 过期后,用 Refresh Token 换新的 Access Token,不需要用户重新登录。Refresh Token 只在续期时传输,减少暴露风险。

8.服务端怎么主动让一个 Token 失效?

JWT 本身是无状态的,签发后服务端无法主动撤销。常见方案:

  • Token 黑名单(Redis 存已注销的 Token,每次验证时查一下)
  • 版本号机制(数据库存用户 Token 版本,改密码时版本号+1,旧 Token 版本对不上就失效)
  • 短过期时间 + Refresh Token(缩小影响窗口)

三、场景设计题

9.分布式系统下,Session 和 Token 分别怎么处理?为什么 Token 更适合?

Session 需要所有服务器共享状态(Sticky Session 或 Redis 集中存储),架构复杂。Token 自包含用户信息,任何服务器拿到密钥都能独立验证,天然适合分布式和微服务。

10.如果 Token 被截获了怎么办?怎么防?

  • 必须用 HTTPS,防止传输层被抓包
  • 设短过期时间,减少被盗用的窗口
  • 绑定客户端指纹(IP、User-Agent),异常时拒绝
  • 关键操作(改密码、支付)要求二次验证
  • 检测到异常立即加入黑名单

11.设计一个登录系统,要求支持"记住我"和"踢人下线"功能,怎么做?

  • 记住我:登录时签发长期 Refresh Token(如 30 天),不勾选则只给短期 Token
  • 踢人下线:服务端维护用户的有效 Token 列表(Redis),踢人时删除对应记录,被踢用户下次请求验证不通过

12.单点登录(SSO)中 Token 怎么流转?

用户访问 A 系统 → 未登录,跳转到统一认证中心 → 登录成功,认证中心签发 Token → 重定向回 A 系统并带上 Token → A 系统用 Token 向认证中心验证 → 通过,用户进入 A 系统。访问 B 系统时,认证中心发现已登录,直接签发 Token 给 B。

四、高频追问

13.对称加密(HS256)和非对称加密(RS256)签名 JWT 有什么区别?什么场景用哪个?

  • HS256:签发和验证用同一个密钥,简单快速,适合单体应用
  • RS256:私钥签发,公钥验证,适合微服务(各服务只需公钥就能验证,不用共享私钥,更安全)

14.Token 无感刷新怎么实现?

前端拦截器检测到 401 响应 → 暂停其他请求 → 用 Refresh Token 调续期接口 → 拿到新 Access Token → 重放之前失败的请求。要注意并发场景下多个请求同时 401,只发一次刷新请求,其他请求排队等待。

15.OAuth 2.0 中的 Token 和 JWT 是什么关系?

OAuth 2.0 是授权框架,定义了 Token 的发放流程(授权码模式、客户端模式等),但没规定 Token 的格式。JWT 是一种 Token 格式。OAuth 2.0 的 Access Token 可以是 JWT,也可以是普通随机字符串(需要服务端查库验证)。

结尾

关于 Token 能聊的还有很多,一篇装不下。后面我会陆续补充进来,与其说这是一篇文章,不如说是一份在长大的笔记。收藏一下,隔段时间回来看看,说不定就多了你正好需要的那块。

相关推荐
洛卡卡了5 小时前
我们在用 AI 写代码时,为什么建议要好好维护 AGENTS.md 呢?
面试·agent·claude
PBitW5 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
自由路飞11 小时前
RAG 混合检索深挖:BM25 和向量分数为什么不能直接相加?
面试
未秃头的程序猿11 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
阳光是sunny1 天前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
蝎子莱莱爱打怪1 天前
DSpark 讲透:DeepSeek 不换模型,硬把 V4 提速 85%,是怎么做到的?
人工智能·面试·程序员
程序员七平2 天前
面试官:你说你Vibe Coding手拿把掐,那 Claude Code 用户级、项目级、本地级配置怎么隔离?
面试
葫芦和十三2 天前
图解 MongoDB 17|大集合与工作集:数据超过内存怎么办
后端·mongodb·面试
葫芦和十三2 天前
图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工
后端·mongodb·面试
葫芦和十三2 天前
图解 MongoDB 15|journal 与持久化:写入怎么不丢,崩溃怎么恢复
后端·mongodb·面试