connectJS会话 – 安全真实与虚假

使用Express / connectJS并玩弄会话。 ConnectJS 文档提供了一个简单的查看计数器,这对我很有用。

然而,它停止工作,如果我设置cookie选项“安全:真”,就像这样…

app.use(express.session({key:'NodeJS', secret:'cookie', cookie:{maxAge:3600000, secure:true}})); 

我所看到的是sessionID只在请求中发送,如果'secure:false'。 如果'安全:真',我得到一个新的sessID每个请求。

这失败了。

 Req header - SECURE:TRUE Cookie connect.sid=s%3AP2q10tK255KdVcizJMwETG69.IU2idEzOVaCxahdcRoEGhTkUBK%2B1Evxc0boj97nJgHg; connect.sess=s%3Aj%3A%7B%7D.opP3ZU2IoVMmmqws%2F5vFGB4s8FNXJ8R6RNZoF4KRNfU 

这工作。

 Req header - SECURE:FALSE Cookie connect.sid=s%3AP2q10tK255KdVcizJMwETG69.IU2idEzOVaCxahdcRoEGhTkUBK%2B1Evxc0boj97nJgHg; connect.sess=s%3Aj%3A%7B%7D.opP3ZU2IoVMmmqws%2F5vFGB4s8FNXJ8R6RNZoF4KRNfU; NodeJS=s%3ArBKqb-Wptr_IJMYW6VzJVu__.2Yc3GL32L%2BHuY4L5RxepdiEirtvbSlIeErWVIHXm4uc 

有人可以简单地解释一下这里发生了什么,或者指出我的好解释吗?

============= 跟进 ==============

会话选项“安全”使用http或https切换。

现在有两种types的会话pipe理:session和cookieSession。 下面是这些的输出:

SESSION

 app.use(express.cookieParser()); app.use(express.session({key:'NodeJS', secret:'cookie', cookie:{maxAge:3600000, secure:false}})); === req.sessionID === b1t73i-MjbyPfQaZHo7_0aGn ==== req.sessionStore === { sessions: { 'b1t73i-MjbyPfQaZHo7_0aGn': '{"cookie":{"originalMaxAge":3600000,"expires":"2013-08-12T19:13:37.169Z","secure":false,"httpOnly":true,"path":"/"},"views":1}' } generate: [Function], _events: { disconnect: [Function], connect: [Function] } } === req.session === { cookie: { path: '/', _expires: Mon Aug 12 2013 12:13:37 GMT-0700 (PDT), originalMaxAge: 3600000, httpOnly: true, secure: false }, views: 1 } ==== req.cookies === { NodeJS: 's:b1t73i-MjbyPfQaZHo7_0aGn.RDYYqfFjjAYFry9PmQW/fih+PPMTgNK6uwy5EW372CE', woot: 'woot' } === req.signedCookies === { swoot: 'swoot' } 

COOKIESESSION

 app.use(express.cookieParser()); app.use(express.cookieSession({key:'NodeJS', secret:'cookie', cookie:{maxAge:3600000, secure:false}})); === req.sessionID === undefined ==== req.sessionStore === undefined === req.session === { views: 1, cookie: { path: '/', _expires: Mon Aug 12 2013 12:20:16 GMT-0700 (PDT), originalMaxAge: 3600000, httpOnly: true, secure: false } } ==== req.cookies === { NodeJS: 's:j:{"views":1}.JtWQMoqzLEZBoGSxbxXfyqFJ2KIYyJG9GDSY4rxdVLQ', woot: 'woot' } === req.signedCookies === { swoot: 'swoot' } 

SESSION返回我可以使用的对象,但是我应该如何处理SESSIONCOOKIE?

在connect / express中,sessionID是req.sessionID 。 在这里看文档。

connect.sid是cookie签名,它是解密快速cookie的默认密钥。 如果您提供key选项,则将用于解密cookie。 当安全打开时,它不断更改connect.sid 。 这是https阻止cookie嗅探/窃取function。 connect.sid由会话ID本身加上一些散列组成。

更新:

如上所述,您可以从sid(从s:到)获取会话标识。 例如:

 sid : 's:b1t73i-MjbyPfQaZHo7_0aGn.RDYYqfFjjAYFry9PmQW/fih+PPMTgNK6uwy5EW372CE' sessionid : b1t73i-MjbyPfQaZHo7_0aGn 

您将看到sessionid是sessionstore中会话的关键。

会话也不同于cookiesession 。 在会话中,您的cookie存储用于解密和获取会话的sid密钥。 cookiesession表示仅cookie会话,服务器上没有存储会话。 cookie本身就是会话,用你的密钥encryption。 所以不要混淆。 你原来的问题与会议有关。 仅当会话数据较小且Cookie使用密钥签名时,cookiesession才有用。 看到这篇文章 。

什么是您的url端点? 它是http://还是https://? 使用cookies作为会话,如果cookie是“安全的”,那么除非它是https, 否则不会被发送到服务器。 服务器从来没有看到cookie,不能将连接关联到会话,从而创build一个新的会话。