Como as sessões funcionam em Express.js com Node.js?

96

Usando Express.js , as sessões são extremamente simples. Estou curioso para saber como eles realmente funcionam.

Ele armazena algum cookie no cliente? Em caso afirmativo, onde posso encontrar esse cookie? Se necessário, como faço para decodificá-lo?

Eu basicamente quero ser capaz de ver se um usuário está logado, mesmo quando o usuário não está realmente no site no momento (como o Facebook sabe que você está logado quando você está em outros sites). Mas suponho que para entender que devo primeiro entender como funcionam as sessões.

foobar
fonte

Respostas:

43

Nunca usei Express.js, embora de acordo com sua documentação sobre o assunto pareça:

  • Os cookies são armazenados no cliente, com uma chave (que o servidor usará para recuperar os dados da sessão) e um hash (que o servidor usará para se certificar de que os dados do cookie não foram adulterados, então se você tentar e mudar um valor que o cookie será inválido)

  • Os dados da sessão, ao contrário de alguns frameworks (por exemplo, Play Framework !) São mantidos no servidor, então o cookie é mais como um espaço reservado para a sessão do que um detentor dos dados da sessão real.

  • A partir daqui , parece que os dados da sessão no servidor são, por padrão, mantidos na memória, embora isso possa ser alterado para qualquer forma de armazenamento que implemente a API apropriada.

Portanto, se você quiser verificar as coisas sem um reqobjeto de solicitação específico , como você disse, precisa apenas acessar esse mesmo armazenamento. Na parte inferior da primeira página de documentação, ele detalha os métodos necessários que o armazenamento precisa implementar, então, se você estiver familiarizado com a API de armazenamento, talvez possa executar um .getAll()se algo assim existir, fazer um loop pelos dados da sessão e ler o que quer que seja valores que você deseja.

Davin
fonte
166

Visão geral

Express.js usa um cookie para armazenar uma id de sessão (com uma assinatura de criptografia) no navegador do usuário e, em seguida, em solicitações subsequentes, usa o valor desse cookie para recuperar informações de sessão armazenadas no servidor. Este armazenamento do lado do servidor pode ser um armazenamento de memória (padrão) ou qualquer outro armazenamento que implemente os métodos necessários (como conectar-redis ).

Detalhes

Express.js / Connect cria uma string Base64 de 24 caracteres usando utils.uid(24)e a armazena em req.sessionID. Essa string é então usada como o valor em um cookie.

Lado do Cliente

Cookies assinados são sempre usados ​​para sessões, portanto, o valor do cookie terá o seguinte formato.

[sid].[signature]

Onde [sid] é o ID da sessão e [assinatura] é gerada assinando [sid] usando a chave secreta fornecida ao inicializar o middleware da sessão. A etapa de assinatura é feita para evitar adulteração. Deve ser computacionalmente inviável modificar [sid] e então recriar [assinatura] sem o conhecimento da chave secreta usada. O cookie de sessão ainda é vulnerável a roubo e reutilização, se nenhuma modificação de [sid] for necessária.

O nome deste cookie é

connect.sid

Lado do servidor

Se um manipulador ocorrer após o middleware cookieParsere, sessionele terá acesso à variável req.cookies. Ele contém um objeto JSON cujas chaves são as chaves do cookie e os valores são os valores do cookie. Isso conterá uma chave nomeada connect.side seu valor será o identificador de sessão assinado.

Aqui está um exemplo de como configurar uma rota que verificará a existência do cookie de sessão em cada solicitação e imprimirá seu valor no console.

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

Você também precisará certificar-se de que o roteador ( app.use(app.router)) está incluído após cookieParsere sessionna seção de configuração.

A seguir está um exemplo dos dados armazenados internamente por Express.js / Connect.

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

O usercampo é personalizado. Todo o resto faz parte do gerenciamento de sessão.

O exemplo é do Express 2.5.

Waylon Flinn
fonte
1
ao imprimir o valor do cookie com o console.log, ele fornece o cookie codificado (assinado). como faço para obter as informações reais?
vsync
O que você quer dizer com - "O cookie de sessão ainda é vulnerável a roubo e reutilização, se nenhuma modificação de [sid] for necessária."? já que o SID é gerado pelo expresso, nunca podemos alterá-lo certo?
Hrushikesh
2
@WebHrushi Eu estava pensando em um ataque Man-in-the-Middle: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn
Alguém pode me ajudar com estas perguntas: stackoverflow.com/questions/21982791/…
roundrobin
como faço para criar um token para qualquer session_id particular ??
aman verma,
9

Estou curioso para saber como eles realmente funcionam.

Tente olhar para esta resposta e outras coisas do wiki .

Ele armazena algum cookie no cliente?

Sim, geralmente é um cookie com ID de sessão atribuída, que deve ser assinado com um segredo para evitar falsificações.

Em caso afirmativo, onde posso encontrar esse cookie? Se necessário, como faço para decodificá-lo?

Você não deve mexer com um cookie de sessão no lado do cliente. Se você deseja trabalhar com sessões no lado do servidor, verifique express.js e documentos de conexão relacionados .

yojimbo87
fonte
Senhor, podemos conversar? Tenho algumas dúvidas em relação a tudo isso.
Suraj Jain
0

Além das respostas já excelentes, aqui estão 2 diagramas que criei para explicar as sessões Express, seu link com cookies e loja:

  • biscoito de chocolate: chocolate
  • biscoito de morango: morango
abernier
fonte