Node.js 管理会话的另一种方法

Node.js 管理会话的另一种方法,node.js,session,express,Node.js,Session,Express,我正在以一种无cookie的方式管理我的项目(expressjs)中的会话,将所有会话数据保存在服务器端,并在客户端(以前由服务器生成)使用令牌在每个请求上验证会话 在用户登录时将创建一个新的令牌,并将其隐藏在页面中的某个位置,然后,在每个请求中,该令牌将被写入请求头和已验证的服务器端。此时,服务器将在会话存储区(比如redis)中搜索令牌,并在找到令牌时获取会话数据,否则将以会话过期的消息进行响应 为此,我正在考虑一些事情: Redis密钥是在用户登录时创建的,过期时间已确定 每次在redi

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

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

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

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

我的问题是,这是否可以被认为是一种安全的工作方式,,以及我是否遗漏了什么。谢谢

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

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

 app.use(express.session({cookie: { path: '/', httpOnly: true}, secret:'password'}));
不过,您应该使用一些加密来防止对cookie的窃听。为此,请使用
secure:true
。您还可以提到使用redis、mongo或仅在内存中存储会话的位置

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

app.use(express.csrf())

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

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