Express -Session-会话ID和Connect.SID之间的区别



session idconnect.sid

之间有什么区别

例如:

console.log('session id =', req.sessionID)

结果:

session id = CCw2pSpdPf8NRKLQpFH-nlFztEzps24Q 

和:

console.log('req.headers =', req.headers)

结果:

req.headers = {                                                                                                                                         20:51:34
  host: 'localhost:3000',
  connection: 'keep-alive',
  'cache-control': 'max-age=0',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ' +
    '(KHTML, like Gecko) Chrome/73.0.3683.75 ' +
    'Safari/537.36',
  dnt: '1',
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
  cookie: 'connect.sid=s%3ACCw2pSpdPf8NRKLQpFH-nlFztEzps24Q.P04Tx%2FNboFGXvR34HOjpbeh4ogWy58zs%2Bpyde%2FkuUVs',
  'if-none-match': 'W/"2f-u+/xADzzu5HL7bySP/YXVKZBlPc"'
}

CCw2pSpdPf8NRKLQpFH-nlFztEzps24Qconnect.sid

不同

如何在中间件中使用它们来验证用户?

会话标识特定客户端。一般的想法是,会话对象和您将其放入会话对象中的任何数据都持续在服务器上。当用户向您的服务器提出请求时,他们会呈现会话cookie,您的会话基础架构查找并获取适当的会话对象。然后,您的请求处理程序可以使用该会话对象以及您想要的任何数据。

会话对象中的数据本地存储在您的服务器上,因此它是安全的,并且客户端不能混乱。

如何在中间件中使用它们来验证用户?

对于身份验证,通常会在会话对象中创建某些状态,以表示用户是否已正确身份验证。如果没有,您要求他们提供证书。如果是这样,您允许请求继续。

这是中间件的一些伪代码。

app.get("/login", (req, res) => {
   // handle login page
   res.sendFile("login.html");
});
app.post("/login", (req, res) => {
   // check auth credentials from the login form
   if (credentials good) {
       req.session.authenticated = true;
       res.redirect("/someOtherPage.html");
   } else {
       req.session.authenticated = false;
       res.redirect("/login.html");
   }
});
// middleware to allow access of already authenticated
app.use((req, res, next) => {
   // check if session already authenticated
   if (req.session.authenticated) {
       next();
   } else {
       res.redirect("/login.html");
   }
});
// route that relies on previous middleware to prove authentication
app.get("/somethingElse", (req, res) => {
   // do something for this authenticated route
});

会话ID和Connect.SID之间有什么区别?

cookie具有名称和值。默认情况下,Express会话的Cookie名称为connect.sid。Cookie的值是Expressession用作会话存储的索引的加密密钥。

会话ID是每个会话对象的内部唯一ID。它用于会话商店的内部实现。您实际上不必担心这些是什么。它们在内部用于各种客房目的。

因此,connect.sid包含发送给客户端的cookie值,并且客户端将其放回服务器。它故意用加密遮盖了它,并且很难伪造或猜测,以使客户无法猜测会话值。会话ID仅在服务器上使用,并且确实需要这些类型的保护措施。

connect.sid's:' + session_id + '.' + hash(session_id, secret)

Express-Session软件包使用Cookie-Signature软件包将签名Hash值附加到connect.sid Cookie中存储的会话ID。因此,connect.sid的第二部分是会话ID和服务器端秘密的哈希值。

在此处查看当前的实现:cookie-signature中的setCookie函数。

最新更新