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一个新的会话。