如何为200天有效期的refresh token生成对应的过期时间?
Refresh Token 过期时间(exp)生成方案
1. exp 字段的标准格式
根据JWT(JSON Web Token)官方规范,
exp(过期时间)声明必须使用Unix时间戳格式,也就是从1970-01-01 00:00:00 UTC到目标时间的秒数(部分框架也支持毫秒级时间戳,使用前注意对齐依赖库的规范要求)。
不推荐使用YYYY/MM/DD这类字符串日期格式,原因是不同语言、不同系统对字符串日期的解析规则存在差异,极易出现时区偏差、解析失败等问题,整数类型的Unix时间戳跨平台兼容性最好,计算和校验逻辑也更简单。
2. 200天有效期的exp计算逻辑
基础计算规则非常简单:exp = 当前Unix时间戳 + 200天对应的秒数
其中200天换算成秒为固定值:200 * 24 * 60 * 60 = 17280000 秒。
3. 常用工具库及示例
生产环境建议直接使用成熟的JWT开源库生成exp字段,不需要手动计算,减少出错概率:
- Node.js/前端:使用
jsonwebtoken库,签发token时直接指定有效期即可自动生成正确的exp字段:// 自动处理exp const refreshToken = jwt.sign(payload, 密钥, { expiresIn: '200d' }) // 手动计算也可以: const exp = Math.floor(Date.now() / 1000) + 17280000 - Python:使用
PyJWT库:# 自动处理exp refresh_token = jwt.encode(payload, 密钥, algorithm="HS256", expires_delta=datetime.timedelta(days=200)) # 手动计算: exp = int(time.time()) + 17280000 - Java:使用
JJWT库:String refreshToken = Jwts.builder() .setClaims(payload) .signWith(密钥) .expiration(Date.from(Instant.now().plus(200, ChronoUnit.DAYS))) .compact(); - Go:使用
golang-jwt库:claims := &jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(200 * 24 * time.Hour)), } refreshToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
4. 注意事项
- 计算时间时尽量基于UTC时间计算,避免本地时区偏差导致的有效期不符合预期
- 手动计算Unix时间戳时注意单位是秒还是毫秒,避免出现有效期多/少1000倍的低级错误
- 生产环境不要手动实现JWT签发、校验逻辑,优先使用生态成熟的开源JWT库处理所有字段,降低安全风险和出错概率
内容的提问来源于stack exchange,提问作者rejs
相关产品推荐
相关产品推荐

