Loading ...
JWT 面试题

1. 什么是 JWT?它由哪几部分组成?

JWT(JSON Web Token)是一种基于 JSON 的开放标准(RFC 7519),用于在网络应用间安全传递声明。它由三部分组成,用 . 分隔:

  • Header(头部):通常包含令牌类型(如 JWT)和签名算法(如 HS256)。

  • Payload(负载):包含声明(Claims),如用户身份、权限、过期时间等。

  • Signature(签名):使用 Header 中指定的算法,对 Header 和 Payload 签名,确保数据未被篡改。

结构示例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.  // Header
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.  // Payload
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c  // Signature

2. JWT 的三部分分别存储哪些信息?

  • Header

    {
      "alg": "HS256",  // 签名算法
      "typ": "JWT"     // 令牌类型
    }
  • Payload

    {
      "sub": "1234567890",  // 主题(通常是用户 ID)
      "name": "John Doe",   // 自定义声明
      "iat": 1516239022,    // 签发时间(Issued At)
      "exp": 1516325422     // 过期时间(Expiration Time)
    }
  • Signature

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      your-256-bit-secret
    )

3. JWT 的工作原理是什么?

  1. 用户登录:输入凭证发送到服务器

  2. 生成 JWT:服务器验证通过后生成包含用户信息的 JWT

  3. 发送 JWT:将 JWT 返回给客户端

  4. 存储 JWT:客户端本地存储(如 localStorage、cookie)

  5. 发送请求:每次请求携带 JWT(通常在 Authorization 头部)

  6. 验证 JWT:服务器提取并验证 JWT 的有效性

  7. 处理请求:根据 JWT 信息进行身份验证和授权

6. JWT 的优点是什么?

  • 无状态:无需服务器存储 Session,适合微服务和分布式系统。

  • 跨域支持:可通过 localStorage 存储,支持跨域请求。

  • 扩展性:Payload 可自定义声明,灵活携带用户信息。

  • 安全性:签名机制确保数据完整性,支持多种加密算法。

  • 移动端友好:易于在移动应用中实现。

7. JWT 的常见算法有哪些?

  • 对称加密

    • HS256(HMAC-SHA256):使用相同密钥签名和验证。

    • HS384(HMAC-SHA384)、HS512(HMAC-SHA512)。

  • 非对称加密

    • RS256(RSA-SHA256):使用私钥签名,公钥验证。

    • ES256(ECDSA-SHA256):椭圆曲线加密,性能更高。

8. JWT 中重要的注册声明(Claims)有哪些?

  • 标准声明(非强制)

    • iss(Issuer):签发者。

    • sub(Subject):主题(通常是用户 ID)。

    • aud(Audience):受众。

    • exp(Expiration Time):过期时间(Unix 时间戳)。

    • nbf(Not Before):生效时间(在此之前令牌无效)。

    • iat(Issued At):签发时间。

    • jti(JWT ID):唯一标识符(用于防重放攻击)。

9. JWT 与 Session 的区别是什么?

特性JWTSession
存储位置客户端(如 localStorage服务器(如 Redis、内存)
状态性无状态有状态
跨域支持支持(需注意 CSRF)不支持(依赖 Cookie)
扩展性高(Payload 可自定义)低(需查询服务器)
安全性依赖签名和 HTTPS依赖 Cookie 安全(如 HttpOnly
性能无需数据库查询需查询数据库或缓存

10. 什么是密钥混淆攻击?如何防止?

攻击原理 攻击者通过猜测或泄露的密钥,伪造合法 JWT 签名。例如:

  • 使用公共密钥(如 RS256 的公钥)尝试签名。

  • 利用弱密钥(如短字符串、默认值)进行暴力破解。

防范措施

  • 使用足够复杂的密钥(如 256 位随机字符串)。

  • 定期轮换密钥。

  • 避免在客户端或公开代码中暴露密钥。

  • 优先使用非对称加密(如 RS256),私钥仅保存在服务器。

11. JWT 的安全风险有哪些?如何降低?

1. 签名未校验攻击
  • 漏洞原理:开发人员混淆 verify () 和 decode () 方法,仅解码而不验证签名

  • 攻击步骤

    1. 登录获取 JWT

    2. 修改 Payload 中的用户身份(如 sub 改为 administrator)

    3. 重新生成 JWT 并发送请求

    4. 绕过验证访问管理员功能

2. 签名用 None 攻击
  • 漏洞原理:JWT Header 中 alg 设为 “none” 表示不签名,任何 token 都有效

  • 攻击步骤

    1. 登录获取 JWT

    2. 修改 Header 的 alg 为 “none”

    3. 修改 Payload 中的用户身份

    4. 移除 Signature 部分(保留点分隔符)

    5. 发送请求冒充管理员

3. JWT 字典爆破攻击
  • 漏洞原理:使用默认或弱密钥签名 JWT

  • 攻击步骤

    1. 获取有效的 JWT

    2. 使用 hashcat 等工具结合字典暴力破解密钥

    3. 命令示例:hashcat -a 0 -m 16500 <jwt> <wordlist>

    4. 使用破解的密钥生成管理员 JWT

4. JWK Header 注入攻击
  • 漏洞原理:服务器错误使用 jwk 参数中嵌入的密钥

  • 攻击步骤

    1. 生成新的 RSA 密钥对

    2. 修改 JWT 的 Payload 为管理员身份

    3. 在 Header 中注入 JWK 参数(包含生成的公钥)

    4. 使用私钥签名 JWT

    5. 发送请求绕过验证

5. 敏感信息泄露攻击
  • 漏洞原理:JWT 中包含敏感信息且未加密

  • 攻击步骤

    1. 获取 JWT 令牌

    2. 解码 Payload 获取敏感信息(如密码、用户身份)

    3. 使用获取的信息进行登录或进一步攻击

11. JWT 如何实现刷新机制?

  1. 双令牌方案

    • 访问令牌(Access Token):短期有效(如 15 分钟),用于 API 请求。

    • 刷新令牌(Refresh Token):长期有效(如 7 天),存储在安全位置(如 HttpOnly Cookie)。

  2. 流程

    • 访问令牌过期时,客户端使用刷新令牌向 /refresh 端点请求新的访问令牌。

    • 服务器验证刷新令牌,生成新的访问令牌并返回。

  3. 安全措施

    • 刷新令牌仅能使用一次,使用后立即失效。

    • 存储刷新令牌时使用 SecureHttpOnly 属性。

    • 记录令牌使用日志,检测异常行为。

12. JWT 是如何实现签名和验证的?加密和签名的区别是什么?

签名流程

  1. 服务器使用 Header 中指定的算法(如 HS256),对 Header 和 Payload 进行哈希。

  2. 使用密钥对哈希值签名,生成 Signature。

验证流程

  1. 客户端接收到 JWT,分离三部分。

  2. 重新计算 Header 和 Payload 的签名(使用相同算法和密钥)。

  3. 比较计算结果与接收到的 Signature 是否一致。

加密 vs 签名

  • 加密:将数据转换为密文,防止未授权读取(如 AES 加密)。

  • 签名:验证数据来源和完整性,不加密数据(如 HMAC)。

13. 对比 Cookie、Session 和 Token 的区别,并说明 JWT 的应用场景。

维度CookieSessionToken
存储位置客户端(浏览器)服务器端(如内存、数据库)客户端(如 Cookie、localStorage)
状态性客户端存储,服务器无状态(仅读)服务器需维护会话状态服务器无状态(无需存储,通过验证令牌即可)
传输方式随 HTTP 请求自动携带(Cookie 头)依赖 Cookie 传递 Session ID需手动嵌入请求(如 Header、表单)
安全性易被 XSS 窃取(无 HttpOnly 时)相对安全(Session ID 仅在客户端)依赖签名验证,安全性可控
扩展性受浏览器存储大小限制(约 4KB)服务器存储压力大(分布式系统需共享会话)无服务器存储压力,适合分布式系统

JWT 的应用场景

  • 分布式系统认证:跨服务、跨域名的统一身份验证(如微服务架构中,无需共享 Session)。

  • API 接口授权:第三方应用调用 API 时,通过 JWT 传递用户权限,避免频繁登录。

  • 单点登录(SSO):用户一次登录后,通过 JWT 在多个关联系统中实现免密访问。

  • 短期授权:如临时链接(文件下载、邮件验证),通过设置过期时间控制权限时效。

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇