会话密钥在Express web框架中的重要性

会议秘密的重要性使我很困惑。 我正在使用Express和Node进入Web开发,现在我试图实现一个简单的login。 以下代码取自Express中的会话示例。

// Required by session() middleware // pass the secret for signed cookies // (required by session()) app.use(express.cookieParser('keyboard cat')); // Populates req.session app.use(express.session()); 

它使用“键盘猫”作为会话密钥。 我查看过的关于会话秘密的许多事情都build议我将其改为自定义。 我现在有3个具体的问题。

  1. 为什么我在使用PHP之前没有看到这个?
  2. 什么是会议秘密正在使用?
  3. 比方说,我改变会话密钥。 我的代码是开源的。 在这种情况下不会改变这个有点多余? 我没有看到要求用户作为一个选项的自定义键。
  4. 我正在考虑生成一个随机的UUID来填写密钥。 这有问题吗? (在安全方面)

我认为在其他答案中漏掉了重点,那就是secret参数是否使会话pipe理更加安全。 在Security.StackExchange问​​题中讨论得很好: 为什么将会话ID直接存储在cookie中是不安全的?

我build议阅读它(不仅最高投票答案有关)。

试图总结一下:在会话ID是大的随机数的情况下,它不会有效地减less会话被猜测和劫持的机会,但是如果会话ID是自定义的,像增加ID那样会显着地有帮助,这是可能在ExpressJS

用户可以使用他们想要的任何会话ID。 也许有人觉得他们应该使用SQL数据库中的自动递增数字,这并不重要,因为我们通过签署价值来保护他们的不知情的决定,延长了密钥。

  1. 因为PHP不是Nodejs。 PHP中的会话pipe理与节点中的会话pipe理不同:节点永远不会死,不像PHP那样不断地被你的服务器守护进程(apache,IIS,你有什么)调用,要求产生一些内容,然后结束它的过程。 节点相当于Apache PHP。
  2. 它用于encryption会话cookie,以便您可以合理地(但不是100%)确定该cookie不是假的,并且该连接应该被视为具有express的较大会话的一部分。
  3. 这就是为什么你不把string放在你的源代码中。 你把它作为一个环境variables,并以process.env(“SESSION_SECRET”)的forms读取它,或者使用https://npmjs.org/package/habitat中的.env文件,并确保这些文件永远不会触及你的仓库(svn / git exclusion / ignore),以便您的机密数据保密。
  4. 在您的节点应用程序运行时,秘密是不可变的。 比UUID提出一个漫长而有趣的句子要好得多,通常比"I didn't think I needed a secret, but the voices in my head told me Express needed one"要短得多。

我如何使用会话:

.env文件(总是在我的.gitignore文件,所以它从来没有打我的公开回购):

 SECRET="This is my funky secret oh my god it has ninja turtles" 

app.js:

 var express = require('express'), env = (function(){ var Habitat = require("habitat"); Habitat.load(); return new Habitat(); }()), app = express(); app.use(express.compress()); // gzip all the things. If possible. app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.cookieSession({ key: "mysite.sid", // seeing this tells you nothing about the actual secret: secret: env.get("SESSION_SECRET"), cookie: { maxAge: 2678400000 // 31 days } })); app.use(express.csrf()); 

该CSRF位确保页面请求来自您自己的网站,而不是cURL请求或embedded其他人的网站。 http://expressjs.com/api.html#csrf了解更多信息。

我的困惑是在服务器端会话和客户端会话之间。 在今天之前,我并不知道客户端。 下面是一个清晰的解释。

为什么CherryPy会话不需要密钥?

考虑到服务器端模型,我很困惑在会话中需要encryption的地方。