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 只是编码,不是加密。
其他: