管理会话的另一种方式

时间:2013-10-17 17:27:53

标签: node.js session express

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

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

我正在考虑一些事情:

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

我的问题是如果这可以被视为一种安全的工作方式,并且如果我在这里缺少任何东西。谢谢

1 个答案:

答案 0 :(得分:0)

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

在快递会话(不是 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可能会随着时间的推移而改变。