DEV Community

Lucas Pereira de Souza
Lucas Pereira de Souza

Posted on

Sessões e cookies no Node.js

logotech

## Como o Express.js Gerencia Sessões: Um Guia Completo

O Express.js, um framework web popular para Node.js, não possui um mecanismo nativo para gerenciar sessões. Em vez disso, ele se baseia em middleware para lidar com essa funcionalidade. Este post detalha como o Express.js trabalha com sessões, abordando o armazenamento de IDs de sessão em cookies e as importantes medidas de segurança.

1. O Papel do Middleware de Sessão

Para utilizar sessões no Express.js, você precisa instalar e configurar um middleware específico. Os mais comuns são:

  • express-session: Uma opção popular e flexível, permitindo várias opções de armazenamento (memória, arquivos, bancos de dados).
  • cookie-session: Uma alternativa que armazena os dados da sessão diretamente no cookie do navegador (adequado para dados pequenos).

Instalação (exemplo com express-session):

npm install express-session
Enter fullscreen mode Exit fullscreen mode

2. Configurando o Middleware

Depois de instalado, o middleware precisa ser configurado e adicionado à sua aplicação. A configuração geralmente ocorre antes de você definir suas rotas.

const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({
  secret: 'seuSegredoAqui', // Chave secreta para assinar o cookie. MUITO IMPORTANTE!
  resave: false,             // Impede que a sessão seja salva se não houver alterações.
  saveUninitialized: true,    // Salva novas sessões não modificadas.
  cookie: {
    // Configurações do cookie (abordaremos em detalhes na seção de segurança)
    // httpOnly: true,  // Habilitado por padrão no exemplo abaixo
    // secure: true    // Habilitado somente em produção, se HTTPS estiver configurado
    maxAge: 1000 * 60 * 60 * 24 // Tempo de vida da sessão (1 dia)
  }
}));

// Suas rotas e outros middlewares aqui
Enter fullscreen mode Exit fullscreen mode

3. Armazenando IDs de Sessão no Cookie

O coração do gerenciamento de sessão é o ID da sessão (session ID). O middleware, como o express-session, gera um ID único para cada sessão e armazena-o no cookie do navegador do usuário.

  • Como Funciona: Quando o usuário faz a primeira requisição, o servidor gera um ID de sessão, cria uma sessão no armazenamento configurado (ex: memória, banco de dados) e envia o ID da sessão no cookie de resposta. Nas requisições subsequentes, o navegador envia o cookie (incluindo o ID da sessão) de volta ao servidor. O servidor usa esse ID para identificar e recuperar os dados da sessão correspondente.
  • Exemplo: Após o middleware express-session ser configurado, você pode acessar a sessão do usuário dentro de suas rotas através do objeto req.session:
app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++
    res.send(`Você visitou esta página ${req.session.views} vezes`)
  } else {
    req.session.views = 1
    res.send('Bem-vindo à primeira vez!')
  }
});
Enter fullscreen mode Exit fullscreen mode

4. Medidas de Segurança Cruciais

Proteger as sessões é fundamental para a segurança da sua aplicação. Aqui estão algumas medidas importantes:

  • httpOnly: Esta configuração, normalmente ativada por padrão, define o cookie como httpOnly. Isso impede que scripts do lado do cliente (JavaScript) acessem o cookie de sessão, mitigando ataques de Cross-Site Scripting (XSS). No exemplo de configuração acima, é ativado por padrão.
  • secure: Quando definida como true, o cookie só será enviado através de conexões HTTPS (criptografadas). Isso é essencial em produção para evitar que o ID da sessão seja interceptado. IMPORTANTE: Configure corretamente o HTTPS no seu servidor e ajuste a configuração secure: true no cookie. No exemplo de configuração, isso seria configurado no objeto cookie.
  • secret: Use uma chave secreta (secret) forte e única para assinar o cookie. Isso impede que um invasor crie cookies de sessão falsificados. Nunca use a mesma chave secreta em ambientes diferentes (desenvolvimento, teste, produção).
  • Tempo de Excecução da Sessão: Defina um tempo de vida (TTL - Time to Live) apropriado para a sessão (usando maxAge no objeto cookie). Sessões longas aumentam o risco de ataques. Considere implementar a renovação da sessão para reduzir o risco.
  • Validação da Entrada: Valide sempre a entrada do usuário para evitar ataques de injeção e outras vulnerabilidades.
  • Armazenamento Seguro: Escolha um método de armazenamento de sessão seguro (por exemplo, um banco de dados). Evite armazenar informações confidenciais diretamente no cookie (se você estiver usando cookie-session, por exemplo).
  • Renovação da Sessão (Rolling Sessions): Para maior segurança, você pode implementar a renovação da sessão. A cada requisição, a data de expiração da sessão é atualizada, mantendo a sessão ativa enquanto o usuário estiver interagindo com o aplicativo.
  • Proteção contra Cross-Site Request Forgery (CSRF): Embora o Express.js não ofereça proteção CSRF nativamente, você pode usar middleware dedicado, como o csurf, para mitigar ataques CSRF.

Conclusão

O gerenciamento de sessões no Express.js é flexível e poderoso. Ao entender como ele funciona e, principalmente, implementar medidas de segurança adequadas, você pode criar aplicações web seguras e que ofereçam uma ótima experiência ao usuário. Lembre-se sempre de manter suas dependências atualizadas e de revisar regularmente as configurações de segurança da sua aplicação.

Top comments (0)