2015-09-01 50 views
1

我正在构建运行.12.7的node.js后端。该后端将每秒处理数千个HTTP POST,并且每个POST需要首先进行身份验证。单核上的多核或多节点实例上的node.js集群模块

实现每个POST的身份验证的最快方法是,在针对第一次尝试对用户进行身份验证之后生成会话密钥,并且将使用存储在内存中的数组中的此会话密钥对所有后续尝试进行身份验证。会话密钥将在10分钟后过期。

由于数组查找是同步的(需要5到40毫秒),我将需要增加处理连接的实例或工作者的数量。

我正在考虑这两个选项是:节点的

  1. 运行多个实例单核机器上,并设置负载均衡粘性使每一个客户端发送一个POST它去到相同的服务器时间。这是为了确保我能够根据存储在内存中的会话密钥来验证客户端。
  2. 使用群集模块来启动多核心机器上的工作人员。这样做的好处是可以更容易维护,因为我不需要运行多个单一实例。

当我在nodejs.org上查找Cluster时,它显示“Stability:2 - Unstable”。我正在阅读,因为这不是生产准备。但看看每个人似乎都建议使用群集的博客。

有没有人在生产环境中实施了集群?有什么其他的选择我应该看看?

在此先感谢

+0

FWIW'cluster'在最新的io.js(本文的3.2.0)中被标记为[** Stable **](https://iojs.org/api/cluster.html),因此它将在node.js 4.0中。 – mscdex

+0

谢谢! MSCDEX。我访问了你分享的链接,这看起来不错。我将开始研究这一个。 – Pankaj

回答

0

您可能会考虑像亚马逊这样的HMAC使用HMAC,而不是什么。这使您可以验证请求是否经过授权,但无需为了进行验证而保留会话。

基本上,你把所有的请求数据和散列在一起,只有授权方和服务器知道的密钥。然后你拿这个散列并发送你的请求。服务器获取这些数据,重新哈希,如果匹配,则允许请求。例如,这里的原始请求:

POST /something 
X-Key: thekey 

现在,我们一起来讨论解决这个所有的秘密,并把它作为另一个标题:

X-Hash: sha1('POST /something' + 'X-Key: thekey' + secret); 

请求现在可以明确的,并秘密发送由于散列函数是单向的,因此无法恢复。服务器将接收该数据并使用它查找thekey的秘密重新哈希。如果计算的散列值与X-Hash的值相匹配,那么它知道只有拥有授权密钥和秘密的人才可以提出(或签署)该请求,我们应该继续。

这个计划有一个大缺陷......它允许重播攻击。有两种方法可以解决这个问题。最简单且通常有效的方法是为请求添加到期日期。

POST /something?expires=2015-09-01T11:45:00Z 

由于每个签名的请求都会有自己的哈希,别人不能简单地更改有效期,而不无效的请求。该请求只能在到期之前重播。

防止重放攻击,但更难以实现的更可靠的方法是使用随机数。基本上,您将一些数据添加到请求中,然后将其存储在数据集中,并承诺永不再使用。理想情况下,它是一个随机数。

POST /something?nonce=oijwioj3wdlkjfoj234234ojwefoij 

如果有人试图重播这一请求,服务器看到这个现时已使用通过检查随机数的数据库,然后拒绝该请求。

这就是HMAC。现在,您可能注意到这并不能直接解决您的问题,因为您至少需要一种方法来查找关键/秘密。这是你可以创造性的地方。

您可以基于另一个键以编程方式生成键。也许最初分发这个会话密钥的服务器具有某种主密钥,为此它派生出其他密钥和秘密。也许通过使用我们的主密钥对X-Key中的客户指定的密钥进行散列,我们得到secret。这意味着如果您需要撤销主密钥(因此所有密钥/密钥),您都必须更改密钥,但在您的情况下,这可能是可以接受的。也许我们每个请求旋转键,并有一个到期日期。有很多方法可以处理这种情况,但这取决于您的具体要求。

关键是要构建一个系统,根本不需要查找来验证请求是否经过授权。如果请求包含足够的信息,这是可能的。您所需要的只是请求中的签名,只能由授权方进行计算。我想你会发现这很适用于你的问题。

+0

布拉德 - 谢谢! 我喜欢你使用哈希的方法。这将是一个更加优雅的解决方案,并允许在我的节点实例之间实现更平等的连接。 我接受你的答案。我试图upvote,但因为我是一个新手,我没有足够的分数来投票你的解决方案。 – Pankaj

+0

@Pankaj也可以查看:https://github.com/cmawhorter/hmmac – Brad

+0

感谢Brad。这个说它仍然是实验性的。 我的服务器将node.js和我的客户将是iOS和Android设备。您是否知道我可以在客户端和服务器中使用任何hmac生成器库? – Pankaj

相关问题