我需要使用 JavaScript 创建一个会话 cookie(有关更多信息,请参阅问题)。我想知道有效期应该是多少?我猜这是浏览会话,所以如果我不设置到期日期,这将用作默认设置,对吗?此会话将用于验证登录用户。那么这是否取决于我希望用户在自动注销之前保持登录状态多长时间(如果是,那么什么是好时机,还是应该是浏览会话?)?
会话 cookie 的到期日期通常是什么时候?
我猜这是浏览会话,所以如果我不设置到期日期,这将用作默认设置,对吗?
是的。除非您特别需要会话以在浏览器重新启动后继续存在,否则请省略该expires
参数,以便 cookie 仅用于浏览器会话并且不会持久保存到磁盘。
这是否取决于我希望用户在自动注销之前保持登录状态多长时间
这取决于您的实际会话到期时间,这应该仅在服务器端实现。如果您确实使用某个expires
时间,您通常希望它至少与服务器端超时一样长,但您不应依赖浏览器将其expires
视为确保旧会话无法访问的方法。
通常,仅会话(无expires
)cookie 用于会话跟踪,超时发生在服务器端。如果使用无法识别或丢失的 cookie 发出请求,则很可能会话在服务器端已过期,浏览器已在客户端关闭,或两者兼而有之,您应该指示用户开始新的会话。
通常,无论您的 Web 框架在服务器端的什么位置,都会包含一个会话管理工具,它会通过Set-Cookie
在 HTTP 响应(初始 HTML 页面或 XMLHttpRequest 响应)上发送适当的标头来为您解决这个问题。虽然您可以仅使用 JavaScript、传递的参数以及例如 localStorage 作为 cookie 的替代品来自己重新实现会话管理,但通过重新发明轮子似乎并没有太大的优势。
我的建议是:“不要使用 JavaScript 创建身份验证 cookie。” 标识经过身份验证的会话的 cookie 应使用 HttpOnly 标志进行标记,以帮助减轻 XSS 攻击,因此必须由服务器创建并与响应一起发送,而不是在客户端创建。
抛开那一点建议不谈,你的假设基本上是正确的。如果 cookie 上没有设置过期时间,那么它就是一个会话 cookie,只要浏览器打开并且sessionid 有效,它就会一直存在。如果服务器定期使经过身份验证的会话过期,则 cookie 将不再附加到服务器上的会话,因此基本上为空。
对于您的第二个问题,如果您希望指定用户在需要重新身份验证之前登录的最长时间,通常使用滚动到期来完成,其中到期时间随着每个请求更新为从现在开始的 x 分钟,因此活动用户会话不会被强制过期,只有用户在过去 x 分钟内没有提出新请求的空闲会话。执行此操作的最安全方法是将 cookie 的值与服务器上按时到期的会话绑定,该会话不会被用户干扰。cookie 的过期时间是不够的,因为它可以由客户端更改。如果需要在客户端存储一个会话过期,需要在cookie的值中进行加密,所以再次需要在服务器端创建,而不是通过JavaScript,
最后,关于您的第三个问题,在会话到期之前的适当时间是多少?这完全取决于您的应用程序。金融应用程序的超时时间通常很短,只有五分钟或十分钟。许多应用程序具有更传统的默认时间,即 20 或 30 分钟。如果您的应用程序的工作流程需要在页面上花费大量时间而不刷新,则可能需要更长的时间。我不知道它在任何情况下都非常重要,除非您的应用程序有特定的安全需求。