WEB安全
00-HTTP协议
01-前端基础【HTML】
02-前端基础【CSS】
03-后端基础【PHP速通】
04-后端基础【PHP面向对象】
05-MySQL基础操作
06-前后端联动【代码练习】
07-SQL注入
08-SQL注入 Labs
09-跨站脚本攻击【XSS】
09-XSS Labs
10-CSRF
11-SSRF
12-XML 外部实体注入【XXE】
13-代码执行漏洞
14-命令执行漏洞
15-文件包含漏洞
16-文件上传漏洞
17-反序列化漏洞
18-业务逻辑漏洞
19-未授权访问漏洞集合
20-跨源资源共享【CORS】
21-SSTI模板注入
22-并发漏洞
23-点击劫持【Clickjacking 】
24-请求走私
25-路径遍历
26-访问控制
27-身份验证漏洞
28-WebSocket
29-Web缓存中毒
30-HTTP 主机头攻击
31-信息泄露漏洞
32-原型污染
33-API概述
34-API分类类型
35-API交换格式
36-API身份验证
37-API常见漏洞
38-crAPI靶场
39-JWT
40-DVGA靶场
41-服务器端参数污染
42-API Labs
43-OAuth Labs
44-GraphQL API Labs
45-JWT Labs
46-小程序抓包
47-云存储
48-对象存储OSS
49-存储桶
50-存储桶漏洞
51-STS访问OSS
-
+
39-JWT
浏览
2
## JWT JWT(JSON Web Token) 是一种基于 JSON 格式的令牌(Token),用于在双方之间以安全、可验证、可紧凑的方式传递信息。 它通常用于 身份认证(Authentication) 和 信息交换(Information Exchange)。 它的关键特性: - 自包含(self-contained):Token 内包含了所有必要的信息,不需要额外的数据库查询(除非做黑名单等额外验证)。 - 可签名(签名防篡改):使用 HMAC 或 RSA/ECDSA 等算法对数据签名,确保数据在传输过程中不被篡改。 - 可携带:体积小,可以通过 URL、HTTP Header、Cookie 等方式传输。 ## 结构 JWT 是一个字符串,由 三部分 组成: ```css Header.Payload.Signature ``` ### Header(头部) 描述令牌类型和签名算法。 ```json { "alg": "HS256", // 签名算法(HMAC-SHA256) "typ": "JWT" // 类型 } ``` 编码方式:Base64Url 编码。 ### Payload(有效载荷) 存放声明(claims),即 Token 内的数据,分为三类: > 注册声明(Registered Claims) 官方建议字段: - iss (Issuer):签发者 - sub (Subject):面向的用户 - aud (Audience):接收方 - exp (Expiration Time):过期时间(时间戳,单位秒) - nbf (Not Before):在此时间之前不可用 - iat (Issued At):签发时间 - jti (JWT ID):唯一标识 > 公共声明(Public Claims) 需要约定命名防冲突,比如 "role": "admin" > 私有声明(Private Claims) 应用内部自定义字段 > 示例: ```json { "sub": "1234567890", "name": "Alice", "role": "admin", "iat": 1699892400, "exp": 1699896000 } ``` 同样用 Base64Url 编码。 ### Signature(签名) 签名的本质是一个加密哈希值,由 JWT 的前两部分(Header 和 Payload)、密钥(或私钥)以及 Header 中指定的算法共同生成。其核心作用有两个: 1. 防篡改:确保 JWT 在传输过程中(如从服务器到客户端,或客户端到服务器)未被恶意修改(例如篡改 Payload 中的用户权限、过期时间等)。 2. 验真:证明该 JWT 确实是由合法的签发者(Issuer) 生成的,而非攻击者伪造。 签名的生成需要三个要素: - 编码后的 Header(第一部分) - 编码后的 Payload(第二部分) - 密钥(对称加密算法)或私钥(非对称加密算法,由签发者持有) - Header 中指定的哈希算法(如 HS256、RS256 等) > 具体步骤 1、对 Header 和 Payload 进行 Base64Url 编码 前两部分(Header 和 Payload)会先被转换为 JSON 字符串,再通过Base64Url 编码(一种适合 URL 传输的 Base64 变体,替换了+为-、/为_,去除了末尾的=)生成字符串,例如: - 编码后的 Header:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 - 编码后的 Payload:eyJzdWIiOiIxMjM0NTY3ODkiLCJuYW1lIjoiSm9obiBEb2UifQ 2、拼接编码后的字符串 将编码后的 Header 和 Payload 用点(.)拼接,得到: ```txt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkiLCJuYW1lIjoiSm9obiBEb2UifQ ``` 3、用指定算法和密钥生成签名 根据 Header 中alg字段指定的算法(如HS256),对拼接后的字符串进行哈希计算,并使用密钥(或私钥)进行加密,最终生成签名。 生成的签名是一串二进制数据,通常会转换为 Base64Url 编码的字符串,例如:SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c。 4、拼接完整 JWT 最终 JWT 为三部分用点拼接的字符串:Header编码.Payload编码.Signature编码。 > 计算方式 ```ini Signature = Sign( Base64UrlEncode(Header) + "." + Base64UrlEncode(Payload), secret_key ) ``` 如果使用 HMAC: ```scss HMACSHA256(data, secret) ``` 如果使用 RSA/ECDSA: ```scss SignWithPrivateKey(data) ``` 最终得到: ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIn0. hPxdv0L1Cp0VYH9Uaz9sP_kYPJ5cY5iEKnGgBwnD6WY ``` 可使用https://jwt.io进行模拟。  ## 工作原理 > 以用户登录为例: 用户登录:提交用户名/密码给服务器。 服务器验证:验证成功后,生成 JWT,写入用户信息(例如 userId、角色等)。 返回 Token:JWT 发送给客户端(常通过 Authorization: Bearer <token>)。 后续请求:客户端每次请求时带上 Token。 > 服务器验证 检查签名是否有效; 检查 exp、nbf 等时间字段; 如果没问题,读取负载内容并处理请求。 > 特点 无状态(Stateless):服务器不需要存储 Session 信息。 可扩展:多个服务间共享 JWT,无需共享 Session 存储。 ## JWT 与 Session 的对比 | 特性 | JWT | 传统 Session | | ---------- | ------------------- | --------------------- | | 存储位置 | 客户端 | 服务器(数据库/内存) | | 是否无状态 | ✅ | ❌ | | 扩展性 | 高,适合分布式 | 低 | | 安全性 | 依赖签名 & 过期时间 | 依赖服务器存储 | | 撤销 Token | 需要额外机制 | 直接删除 Session | | 数据存储 | Token 内部存数据 | 存在服务器端 | ## 安全性 JWT 攻击是指用户向服务器发送修改过的 JWT 以实现恶意目的。通常,此目的是通过冒充其他已通过身份验证的用户来绕过身份验证和访问控制。 > 签名保证了防篡改,但不保证加密 - JWT 默认不加密,Payload 可以被任何人解码(Base64Url)。 - 如果需要加密内容,需要结合 JWE(JSON Web Encryption)。 > 常见安全问题 不验证签名 → 任意伪造 Token(致命) 算法混淆攻击(Alg None Attack): - 如果服务端支持 "alg": "none" 且不做验证,攻击者可以删除签名绕过验证。 密钥过弱: - HMAC 密钥长度太短会被暴力破解。 长时间有效期: - Token 被盗后风险极大。 XSS/CSRF 攻击: - 如果 Token 存在 localStorage,很容易被 JS 窃取。 ## 优劣势 ### 优点 跨语言支持好:JSON 通用格式,几乎所有语言有库支持。 无状态:适合分布式架构,不依赖中央 Session 存储。 可自包含:认证信息直接存储在 Token 中。 ### 劣势 撤销困难:不像 Session 可以随时使无效,需要额外黑名单机制。 体积大:Base64 编码后长度比原始 JSON 大 33% 左右。 泄露风险高:Payload 可被解码,敏感信息不能直接放。 ## 常用场景 前后端分离的身份认证 API 网关鉴权 微服务之间的信息传递 移动端 / 单页应用(SPA)登录状态保持 ## 扩展协议 JWS(JSON Web Signature):JWT 的签名标准 JWE(JSON Web Encryption):JWT 的加密标准 JWK(JSON Web Key):密钥表示标准 JWA(JSON Web Algorithms):算法标准
毛林
2026年11月15日 18:27
转发文档
收藏文档
上一篇
下一篇
评论(0)
登录
后可发表评论
还没有评论,来抢沙发~
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
还没有评论,来抢沙发~