0

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

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

我正在考虑一些事情:

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

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

4

1 回答 1

0

好的,存储会话需要 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 或仅在内存中提及要将会话存储在何处。

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

app.use(express.csrf())

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

于 2013-10-17T18:39:37.727 回答