【问题标题】:A different way to manage sessions管理会话的不同方式
【发布时间】:2013-10-18 02:39:37
【问题描述】:

我正在以无 cookie 的方式管理我的项目 (expressjs) 中的会话,保留所有会话数据服务器端并在客户端使用令牌(之前由服务器生成)来验证每个请求的会话.

将在用户登录时创建一个新令牌并隐藏在页面中的某个位置,然后,在每次请求时,该令牌将被写入请求标头并经过验证的服务器端。此时服务器将在会话存储中搜索令牌,比方说 redis,如果找到令牌则获取会话数据,否则响应会话过期消息。

为此我正在考虑一些事情:

  • Redis 密钥是在用户登录时创建的,具有确定的过期时间。
  • 每次在 redis 中找到会话数据时,我都必须“触摸”键 所以过期时间会被推迟。
  • 令牌将与客户端的 IP 地址一起验证,因此不能被其他人使用。

我的问题是这是否可以被认为是一种安全的工作方式,以及我在这里是否缺少任何东西。谢谢

【问题讨论】:

  • 您所做的与使用带有 redis 会话存储的 cookie 几乎相同,只是您使用的是自定义标头而不是 cookie 标头。所以是的,这同样安全。
  • 定义“隐藏在页面的某处”。此外,听起来您正在尝试重新发明会话 cookie,另外一个缺点是您的浏览器可能对 cookie 采取的任何安全措施都被规避了。
  • 我的意思是把输入隐藏在某个地方,嗯,你说得对,但是浏览器可能采取的哪些安全措施可能会影响我的方法?考虑到我没有做奇怪的事情,比如从一个域转到另一个域
  • @RenzoCortez cookie 可以归类为httpOnly,这意味着它们无法被 JS 读取(因此,XSS 攻击)。隐藏的输入没有得到类似的保护。

标签: node.js session express


【解决方案1】:

好的,存储会话需要 cookie。 Express 是一种理想的方式。

在express session(不是cookiesession)中,它完全存储在服务器上,只向客户端发送一个密钥。整个会话被序列化为一个密钥,然后发送。我假设您希望用户不能篡改会话 cookie。您可以使用 httponly cookie 来防止篡改。它们仅由浏览器处理,用户无法访问。这可以防止 cookie 被盗或会话劫持。您可以通过以下方式启用 httponly cookie:

 app.use(express.session({cookie: { path: '/', httpOnly: true}, secret:'password'}));

您仍然应该使用一些加密来防止 cookie 被窃听。为此使用secure : true。您还可以使用 redis、mongo 或仅在内存中提及要将会话存储在何处。

您提到的请求令牌验证是一种通常用于防止跨站点请求伪造的技术。它不断动态更改令牌以防止用户获取令牌。您可以将它与csrf 中间件一起使用。

app.use(express.csrf())

IP 匹配将不起作用,因为用户的 IP 会随时间变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多