别再猜测:JWT 是什么?别再猜测:JWT 是什么?保持联系

2025-06-07

别再猜测了:什么是 JWT?

别再猜测了:什么是 JWT?

保持联系

别再猜测了:什么是 JWT?

JSON Web Token 由一串以点分隔的英文字符组成,它包含三部分:标头、有效负载和签名。

JSON Web 令牌 (JWT)

JWT 是一种开放标准,它定义了一种紧凑且自包含的方式,用于在 REST API 中执行身份验证,其中信息作为 JSON 对象在双方之间安全地传输。

由于这些信息经过数字签名,因此可以验证和信任。JWT 可以使用密钥(采用 HMAC 算法)或 RSA 公钥/私钥对进行签名。

注1:我们认为它是紧凑的,因为它的大小,可以通过URL、POST参数或HTTP头发送。此外,由于它的大小,它的传输速度也很快。
注2:我们认为它是自包含的,因为我们不需要多次查询数据库,有效载荷包含了关于用户的所有必要信息。


何时使用 JWT?

身份验证:用户登录后,每个后续请求都会包含 JWT。这允许用户访问需要该令牌的路由、服务和资源。

信息交换:JWT 是一种在各方之间安全传输信息的方式,因为您可以确保发送者的身份,因为它们可以被签名(可能使用公钥/私钥对)。您还可以验证内容是否更改,因为签名是使用标头和有效负载创建的。


JWT 结构

JWT 由三部分组成,三部分之间用点 (.) 分隔:Header、Payload 和 Signature。这些部分遵循以下结构:xxxxx.yyyyy.zzzzz。

JWT 的第一部分是标头,第二部分是有效负载,第三部分是签名。

标题

包含一些信息,通常包括令牌类型(即 JWT)和哈希算法(例如 HMAC、SHA256 或 RSA)。

之后,包含该 Header 的 JSON 将经过 Base64Url 编码,形成 JWT 的第一部分。

//Example of a Header
{
  "alg": "HS256",
  "typ": "JWT"
}

有效载荷

包含有关实体(通常是用户)的陈述和附加元数据的声明。

注意:不能包含有关用户的敏感信息,例如密码,但可以包含用户 ID、姓名或电子邮件。

声明示例:iss(颁发者)、exp(到期时间)、sub(主题)、aud(受众)等。
之后,包含有效负载的 JSON 经过 Base64Url 编码,形成 JWT 的第二部分。

//Example of a Payload
{
  "sub": "0987654321",
  "name": "Jane Doe",
  "admin": true 
}

签名

用于验证 JWT 的发送者是否是其所声称的人,并确保消息在传输过程中未被更改。

要创建签名,请采用编码的标头、编码的有效负载、秘密、标头中指定的算法,然后对其进行签名。

//Example of a Signature using the HMAC SHA256 algorithm
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

注意:生成密钥的一个简单方法是使用http://www.md5.cz/生成字符串的 MD5 哈希值。

统一三个部分

输出是三个以点分隔的 Base64 字符串:一个编码的标头,一个编码的有效负载,以及一个使用密钥签名的字符串。它们可以在 HTML 和 HTTP 环境中传递。

展示 jwt.io 网站,您可以在其中通过编码和解码来使用 JWT。您可以选择哈希算法。

注意:请访问 jwt.io,这是一个允许您解码、验证和生成 JWT 的网站。


JWT 如何工作?

1 - 当用户使用其凭证成功登录并进行身份验证时,将返回 JWT。

Insomnia 通过传递包含用户电子邮件和密码的 http POST 请求来生成 JWT。

Insomnia 收到了之前发送的响应。响应中包含 JWT 和用户信息。

注意:请记住,令牌是凭证,因此您必须防止安全问题:不要将令牌保留超过所需的时间。

2 - 每当用户想要访问受保护的路由时,其请求都应发送 JWT,通常在 Authorization 标头中使用 Bearer 模式:Authorization: Bearer 。

Insomnia 通过在请求中包含 JWT 来发送访问需要 JWT(经过身份验证的用户)的路由的请求。

注意:此身份验证机制是无状态的,因为用户状态不会保存在服务器内存中。相反,服务器的受保护路由会检查 Authorization 标头中是否存在有效的 JWT,并且只有满足此条件时才允许用户访问。因此,由于 JWT 是自包含的,因此无需多次查询数据库,因为数据库本身已经包含所有必要的信息。

为什么要使用 JWT?

  • 它们是无状态的:由于令牌是自包含的,它们包含身份验证所需的所有信息。这有利于提高可扩展性,因为您的服务器无需存储会话状态。
  • 它们可以在任何地方生成:令牌生成和令牌验证是解耦的。这允许你在单独的服务器上处理令牌的签名。
  • 它们允许访问控制:在有效载荷内,可以指定用户角色和权限。您还可以定义用户可以访问的资源。

最佳实践

  • 让令牌过期:令牌签名后将永不过期,除非您更改签名密钥或明确设置过期时间。这可能会带来潜在问题,因此有必要制定一个用于令牌过期和/或撤销的策略。
  • 不要在有效载荷中存储敏感数据:令牌很容易被解码,其目标是防止其签名被篡改。因此,只需在有效载荷中添加必要数量的声明,即可获得最佳的性能和安全性。
  • 做一个优秀的魔术师,不要泄露你的秘密:只向真正需要它的服务透露签名密钥。它应该像其他凭证一样被对待。
  • 利用 HTTPS:在非 HTTPS 连接上,请求更容易被拦截,令牌也更容易被泄露。

保持联系

通过我的社交媒体联系我。我们可以在LinkedInGitHub上讨论安全、身份验证和编程方面的话题

与我们分享您提倡的 JWT 良好实践。

文章来源:https://dev.to/stevescruz/stop-guessing-what-is-a-jwt-47d9
PREV
React 中的过度设计
NEXT
Domain-driven Design (DDD): File Structure Project Current File Structure Domain DDD (Domain-driven Design) Modules Shared Infrastructure Layer vs Domain Project File Structure using DDD Final considerations Keep in touch