是的,我是请求访问的那个人
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 认证工作原理(流程)
- 用户使用邮箱和密码登录。
- 服务器验证凭据。
- 服务器使用密钥生成 JWT。
- JWT 发送给客户端。
- 客户端存储 JWT(cookie 或
localStorage)。 - 客户端在每次请求的
Authorization头部中携带 JWT。 - 服务器验证 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 功能强大、速度快且被广泛采用——但前提是正确使用。了解其内部工作原理有助于设计安全且可扩展的系统。
我把这篇文章作为学习兴趣写出来,以提升自己的知识并与优秀的同行交流。欢迎提供反馈和建议。