【问题标题】:express-session - the difference between session id and connect.sid?express-session - 会话 id 和 connect.sid 之间的区别?
【发布时间】:2019-11-05 16:39:25
【问题描述】:

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 不同

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

【问题讨论】:

    标签: node.js express sessionid sid


    【解决方案1】:

    会话标识特定的客户端。一般的想法是会话对象和您放入会话对象的任何数据都保留在服务器上。当用户向您的服务器发出请求时,他们会显示您的会话基础结构查找的会话 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
    });
    

    session id和connect.sid有什么区别?

    cookie 具有名称和值。默认情况下,快速会话的 cookie 名称为 connect.sid。 cookie 的值是 express-session 用作会话存储索引的加密密钥。

    会话 ID 是每个会话对象的内部唯一 ID。它用于会话存储的内部实现。你真的不需要担心这些是什么。它们在内部用于各种管理目的。

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

    【讨论】:

    • 感谢您的回答。 So connect.sid contains the cookie value that is sent to the client and that the client presents back to the server. 那么我们如何才能知道或验证发送回服务器的 cookie 是服务器发送给客户端的正确 cookie?
    • @laukok - 请重新阅读我的回答。 Express session 将 cookie 与服务器端 session 对象连接起来,并为您处理所有 cookie 内容(这是它所做的事情之一)。如果 cookie 不匹配任何已知会话,它会创建一个新的空会话对象。验证时将数据放入会话对象中。当客户端连接时,您检查他们的会话对象。如果它是空的,它必须是一个尚未验证任何东西的新的。如果其中包含您的数据表明您之前已对其进行了验证,那很好。这就是你所要做的。检查会话对象。
    猜你喜欢
    • 2016-04-14
    • 2017-06-20
    • 2021-10-11
    • 2010-09-26
    • 2021-01-11
    • 2013-04-08
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多