JWT 由头部、载荷、签名三段以点号拼接而成。服务端在登录成功后用密钥签发令牌,客户端把它放在后续请求的 Authorization 头里带上来,服务端用同一把密钥验证签名即可确认身份。全程不需要在服务端存储会话,天然适合分布式部署与前后端分离架构。
在 Node 里通常用 jsonwebtoken 签发与校验,再把校验逻辑封装成一个 Express 中间件保护需要登录的路由。要点:密钥必须放在环境变量里;载荷只放用户 ID 等非敏感信息;设置较短的有效期并用 refresh token 续期;令牌存进 cookie 时要开启 HttpOnly 与 SameSite。
const jwt = require('jsonwebtoken'); const express = require('express'); const app = express(); app.use(express.json()); const SECRET = process.env.JWT_SECRET; // 走环境变量 // 登录签发令牌 app.post('/login', (req, res) => { const token = jwt.sign({ userId: 1 }, SECRET, { expiresIn: '2h' }); res.json({ token: token }); }); // 鉴权中间件:保护需要登录的路由 function auth(req, res, next) { const header = req.headers.authorization || ''; const token = header.split(' ')[1]; if (!token) { res.status(401); return res.end('未登录'); } jwt.verify(token, SECRET, (err, decoded) => { if (err) { res.status(401); return res.end('令牌无效'); } req.user = decoded; next(); }); } app.get('/me', auth, (req, res) => res.json(req.user)); app.listen(3000);