·后端开发·4 分钟阅读

Node.js API 的 JWT 认证:签发、校验与安全清单

分享X微博

JWT 适合什么场景

  • 无状态 API:水平扩展时不必共享 session 存储
  • 短期访问令牌 + 可选 refresh token
  • 微服务间传递用户身份(注意信任边界)

不适合:需要服务端随时吊销且没有黑名单的高敏感场景(除非配合 Redis 黑名单)。

最小签发与校验(jose)

import { SignJWT, jwtVerify } from "jose";

const secret = new TextEncoder().encode(process.env.JWT_SECRET!);

export async function signToken(sub: string) {
  return new SignJWT({ sub })
    .setProtectedHeader({ alg: "HS256" })
    .setIssuedAt()
    .setExpirationTime("7d")
    .sign(secret);
}

export async function verifyToken(token: string) {
  const { payload } = await jwtVerify(token, secret);
  return payload;
}

ZhuBook 后台登录即类似流程:校验用户名密码后签发 token,写入 HttpOnly Cookie

存储XSS 风险
localStorage脚本可读,被盗即冒充用户
HttpOnly CookieJS 不可读,需防 CSRF

推荐:

Set-Cookie: token=...; Path=/; HttpOnly; Secure; SameSite=Lax

Secure 要求 HTTPS;备案上线后务必开启。

Next.js Route Handler 保护

import { cookies } from "next/headers";
import { verifyToken } from "@/lib/auth";

export async function GET() {
  const token = (await cookies()).get("admin_token")?.value;
  if (!token) return Response.json({ error: "未登录" }, { status: 401 });
  try {
    await verifyToken(token);
  } catch {
    return Response.json({ error: "令牌无效" }, { status: 401 });
  }
  // 业务逻辑
}

安全清单

  1. JWT_SECRET 至少 32 字节随机,放环境变量
  2. 设置合理 exp(如 7 天),敏感操作可要求重新登录
  3. 生产禁用弱口令;后台路径可加 IP 白名单(Nginx allow
  4. 登录接口限流,防暴力破解
  5. 不在 JWT payload 放密码、信用卡等敏感明文

小结

JWT + HttpOnly Cookie 是个人站后台的务实组合;密钥管理与 Cookie 属性比选型 HS256/RS256 更能决定真实安全性。

相关阅读

本站评论 (0)

  • 暂无评论,来说第一句吧。