Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:信息安全:jwt

JWT

JSON Web Token


特性、用途

JWT可以包含用户信息,它本质上是一种自包含(self-contained)的令牌格式。JWT 被设计成可以携带身份信息,这样服务器端就不需要在每次请求时去查数据库获取用户状态(例如用户名、权限等)。它的“自包含”结构使得所有相关信息都嵌入其中。

一个标准的 JWT 由三部分组成,用英文句点分隔:Header.Payload.Signature

# Header(头部),包含令牌的元数据,通常是这样的 JSON:
{
  "alg": "HS256",
  "typ": "JWT"
}

# Payload(负载),这里是存放**用户信息和其他声明(claims)**的地方。比如:
{
  "sub": "1234567890",
  "name": "Alice",
  "role": "admin",
  "exp": 1723456789
}

# Signature(签名)
# 使用头部中声明的算法(如 HMAC SHA256)对 Header + "." + Payload 进行签名,以保证数据没有被篡改。
# 签名是由服务器根据前两部分(Header + Payload)和一个私密密钥生成的。
# 作用:只有持有密钥的一方(一般是服务器)才能生成正确的签名。因此,签名起到认证签发者身份的作用
# 服务端可以确信这个 JWT 是自己或受信任方签发的;
# 客户端不能伪造 JWT(因为没有密钥);

数据虽然不加密,但有签名保护:这意味着任何人都可以看到 Payload,但只有持有密钥的服务端才能生成有效的签名。这样能保证 Payload 未被篡改。

JWT 中的用户信息不是保密的,不能放敏感信息(如密码、银行卡号等),因为任何接收到 JWT 的人都可以解码。认证时,服务端应该始终验证签名,不能仅信任 Payload。

JWT 经常使用 Base64 编码,但是注意 Base64 只是编码,不是加密。

其他

  1. 一旦 JWT 发出去就很难“让它失效”,除非加上额外的黑名单机制(好像所有Token都是这样吧)
  2. 在绝大多数实际系统里,JWT 都是“按一次认证(或一次设备登录)生成一枚”;同一用户只要在不同时间、不同浏览器或不同手机登录,就会拿到多枚互相独立的 JWT。每枚 JWT 都带着自己的唯一 jti 或 sid 标识、签发时间 iat 和过期时间 exp,这样既方便逐设备吊销,又能限制泄露窗口。

详细算法实现(TODO)

/var/www/DokuWikiStick/dokuwiki/data/pages/程序/信息安全/jwt.txt · Last modified: 2025/09/15 18:48 by zhonghui