银行级系统需动态设定cookie过期时间,服务端以time()+动态偏移量生成unix时间戳,结合角色、风险等级调整;必须启用httponly、secure、samesite=lax;前端仅做心跳检测与提示,服务端校验时间戳并拒绝过期请求。

银行级系统要求登录态既不能“太短”影响用户体验,也不能“太长”留下安全敞口。动态设定 Cookie 过期时间,本质是让 Cookie 的有效期与用户真实活跃状态实时对齐——不是固定30分钟就一成不变,而是每次有效操作后刷新倒计时。这需要服务端与前端协同,且必须以服务端为准。
服务端:用 time() + 动态偏移量生成 expires
PHP 中调用 setcookie 时,expires 必须是 Unix 时间戳。不要硬写固定值(如 time() + 1800),而应从会话上下文或策略配置中读取当前适用的超时时长:
- 根据角色动态赋值:普通柜员设为 15 分钟,主管账号设为 5 分钟,后台审计账号设为 2 分钟
- 结合风险等级调整:用户刚完成转账操作后,自动缩短下次过期窗口至 3 分钟
- 避免直接暴露逻辑:不在 Cookie 值中写明“剩余秒数”,只传服务端计算好的绝对时间戳
Cookie 属性必须启用 HttpOnly + Secure + SameSite=Lax
仅控制过期时间远远不够。金融场景下,Cookie 一旦被 XSS 窃取或跨站伪造,动态刷新反而扩大攻击面:
- HttpOnly = true:阻止 JavaScript 读取 session_id,切断 XSS 直接盗 token 的路径
- Secure = true:强制仅 HTTPS 传输,防止中间人劫持明文 Cookie
- SameSite = 'Lax':防御 CSRF,尤其在跳转支付、授权等敏感操作前自动拦截非法来源请求
前端需配合心跳检测 + 路由守卫,但不主导判定
前端可做友好提示和预退出,但所有“是否过期”的最终裁决权必须在服务端:
- 每次用户鼠标移动、键盘输入、页面滚动后,触发一次轻量心跳请求(如
/api/keepalive),服务端收到后重算并返回新 expires 时间戳 - 前端用该时间戳更新本地倒计时 UI,并在剩余 60 秒时弹窗提醒:“您将在 1 分钟后自动登出”
- 路由守卫中不检查 localStorage 或内存中的 token 有效期,而是发起一个受保护接口(如
/api/user/profile);若返回 401,则清空本地凭证并跳转登录页
关键细节:服务端必须校验时间戳,而非信任客户端
前端可能伪造时间、禁用 JS、篡改本地存储。因此:
- 每次请求携带 Cookie 后,服务端需比对当前时间与 Cookie 中记录的
expires字段(可通过签名或加密方式嵌入 session 数据) - 拒绝处理任何
expires 的请求,立即销毁 session 并返回 401 - 不依赖浏览器自动清除机制——即使浏览器未删 Cookie,服务端也应拒绝过期凭证











