You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JWT Cookie maxAge设置异常:时区偏移致浏览器存储时间错误

问题分析

你遇到的浏览器显示过期时间和预期不符的情况,核心是时区转换导致的展示误解,而非maxAge设置错误:

  • 你的maxAgeInSeconds计算逻辑是正确的:JWT的exp是UTC时间戳(秒),new Date().getTime()返回的是UTC时间戳的毫秒版,两者差值转换后的秒数确实是20分钟左右的有效时长。
  • 浏览器开发者工具会把Cookie的UTC过期时间,自动转换为你的本地时区时间展示。比如你预期UTC时间17:15过期,若处于UTC+3时区,浏览器就会显示本地时间20:15,这属于正常的时区转换,并非设置错误。

解决方案

1. 简化maxAge设置(推荐)

没必要通过解码JWT计算maxAge,直接手动设置20分钟的秒数即可,和JWT的expiresIn: "20m"完全匹配,减少冗余步骤:

const accessToken = jwt.sign(
  {
    Id: user.UserId,
    Roles: roles
  },
  "SECRET",
  { expiresIn: "20m" }
)

const serialized = serialize('token', accessToken, {
    httpOnly: true,
    secure: process.env.MODE === 'production',
    sameSite: 'strict',
    maxAge: 20 * 60, // 直接设置20分钟对应的秒数
    path: '/',
});

res.setHeader('Set-Cookie', serialized);

2. 确认浏览器时间展示逻辑

查看浏览器开发者工具的Cookie面板,注意过期时间后的时区标注(比如Chrome会显示2024-05-01 20:15 (UTC+3)),这个时间是本地时区的展示,对应的UTC时间就是你预期的17:15,属于正常现象。

3. 验证实际过期效果

可以等待20分钟,观察开发者工具中的Cookie是否自动消失(因为你的Cookie是httpOnly,前端JS无法读取),以此确认实际过期时长是否符合预期。

排查额外问题

如果实际过期时长确实不对,检查以下两点:

  • 服务器系统时间是否和UTC同步:服务器时间偏差会直接导致maxAge计算错误。
  • 自定义解码工具是否出错:替换成jsonwebtoken库自带的jwt.decode方法,避免自定义解码时把exp当成本地时间戳处理:
    const decodedJWT = jwt.decode(accessToken); // 使用官方解码方法
    

内容的提问来源于stack exchange,提问作者Lucas Bois

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:37:44