是的,我是请求访问的那个人

发布: (2025年12月16日 GMT+8 07:47)
4 min read
原文: Dev.to

Source: Dev.to

NOTE: This is my first post, so apologies in advance if I’ve misunderstood something. I’m open to discussions and corrections.

什么是 JWT?

JWT 代表 JSON Web Token。它定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象安全地传输信息。由于信息经过数字签名,这些信息可以被验证并可信。

  • JWT 是短期有效的;它们会在设定的时间后过期。
  • 已签名的令牌验证其所包含声明的完整性。
  • 加密的令牌则隐藏这些声明,使其他方无法看到。

JWT 的使用

授权

JWT 最常见的用例是 授权——控制对路由、服务和资源的访问。

  • 认证 → 验证用户的身份。
  • 授权 → 确定用户被允许访问的内容。

信息交换

JWT 也可以用于 安全的信息交换。因为它们可以签名(例如使用公钥/私钥对),所以可以确保发送者就是其声称的身份。

JWT 的结构

JWT 由三部分组成,使用点 (.) 分隔:

Header(头部)

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload(负载)

{
  "userId": 123,
  "email": "user@example.com",
  "role": "admin",
  "exp": 1712345678
}

Signature(签名)

签名通过以下方式生成:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret_key
)

JWT 认证工作原理(流程)

  1. 用户使用邮箱和密码登录。
  2. 服务器验证凭据。
  3. 服务器使用密钥生成 JWT。
  4. JWT 发送给客户端。
  5. 客户端存储 JWT(cookie 或 localStorage)。
  6. 客户端在每次请求的 Authorization 头部中携带 JWT。
  7. 服务器验证 JWT,若有效则授予访问权限。

JWT 的优势

  • 无状态认证(每次请求无需查询数据库)。
  • 快速且可扩展。
  • 易于在微服务之间使用。
  • 与 REST API 和移动应用配合良好。

JWT 的劣势

  • 令牌不易撤销。
  • 若令牌被盗,攻击者即可获得访问权限。
  • 负载是可读的(未加密)。
  • 大体积的令牌会增加请求大小。

在 Express.js 中使用 JWT

生成令牌

const jwt = require("jsonwebtoken");

const token = jwt.sign(
  { userId: user._id },
  process.env.JWT_SECRET,
  { expiresIn: "1h" }
);

验证令牌(中间件)

const verifyToken = (req, res, next) => {
  const token = req.headers.authorization?.split(" ")[1];
  if (!token) return res.status(401).json({ message: "No token" });

  jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
    if (err) return res.status(403).json({ message: "Invalid token" });
    req.user = decoded;
    next();
  });
};

最后感想

JWT 功能强大、速度快且被广泛采用——但前提是正确使用。了解其内部工作原理有助于设计安全且可扩展的系统。

我把这篇文章作为学习兴趣写出来,以提升自己的知识并与优秀的同行交流。欢迎提供反馈和建议。

Back to Blog

相关文章

阅读更多 »

令牌验证

概述 验证 JWT 的过程包括:1. 解析 token 字符串。2. 解码 header 和 payload。3. 使用适当的密钥验证签名。

实验性 Hono auth npm 包

我正在构建的东西:我正在创建一个 auth package,开发者可以将其直接放入他们的应用中,而无需编写常规的登录、注册、JWT、电子邮件验证等样板代码。