DEV Community

Lucas Pereira de Souza
Lucas Pereira de Souza

Posted on

Sessões e cookies no Node.js

logotech

## Express e Sessões: Um Guia Detalhado

O Express.js, um framework Node.js amplamente utilizado, oferece flexibilidade para gerenciar sessões de usuário, permitindo o rastreamento de informações e estado entre requisições. Este artigo explora o funcionamento das sessões no Express, incluindo o armazenamento de IDs em cookies e as melhores práticas de segurança.

O que são Sessões e por que são Importantes?

Sessões são um mecanismo essencial para manter o estado do usuário em aplicações web. Elas permitem armazenar dados específicos do usuário, como informações de login, preferências, dados de carrinho de compras, etc., permitindo uma experiência mais personalizada e interativa. Sem sessões, a cada nova requisição, o servidor \"esqueceria" as informações do usuário, tornando a navegação ineficiente.

Como o Express Lida com Sessões

O Express em si não possui um sistema de gerenciamento de sessões embutido. Ele delega essa responsabilidade a middleware externos. A biblioteca mais popular e recomendada para gerenciamento de sessões é o express-session.

Usando express-session

Primeiramente, instale o express-session com o comando:

npm install express-session
Enter fullscreen mode Exit fullscreen mode

Em seguida, integre-o à sua aplicação Express:

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

app.use(session({
  secret: 'seuSegredoAqui', // String secreta para assinar o cookie
  resave: false,             // Evita salvar a sessão se não houver modificações
  saveUninitialized: true,   // Salva sessões novas e não inicializadas
  cookie: {
    httpOnly: true,        // Segurança: Impede acesso ao cookie via JavaScript
    secure: process.env.NODE_ENV === 'production', // Segurança: Envia o cookie apenas via HTTPS
    maxAge: 60 * 60 * 1000 // Tempo de expiração da sessão (1 hora)
  }
}));

// Acessando dados da sessão em rotas
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!');
  }
});

app.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});
Enter fullscreen mode Exit fullscreen mode

Armazenando IDs de Sessão em Cookies

Por padrão, o express-session armazena o ID da sessão no cookie do navegador. Este ID, uma string única, identifica a sessão do usuário no servidor. O navegador envia este ID a cada requisição, permitindo que o servidor recupere os dados da sessão.

Configurações Importantes do Cookie

As opções de configuração do cookie no middleware session são cruciais para a segurança:

  • secret: Obrigatório. Uma string secreta e complexa usada para assinar o cookie. Protege contra falsificação.
  • resave: Normalmente, defina como false.
  • saveUninitialized: Normalmente, defina como true.
  • cookie: Um objeto com as seguintes opções:
    • httpOnly: true: ESSENCIAL. Impede o acesso ao cookie via JavaScript, protegendo contra ataques XSS.
    • secure: true: ESSENCIAL para HTTPS. Garante que o cookie seja enviado apenas em conexões HTTPS. Defina como false se não estiver usando HTTPS em desenvolvimento, mas sempre true em produção.
    • maxAge: Define a duração da sessão em milissegundos.
    • domain: Define o domínio para o qual o cookie é válido.
    • path: Define o caminho para o qual o cookie é válido.
    • sameSite: Controla como o cookie é enviado em requisições de diferentes origens (e.g., strict, lax).

Medidas de Segurança Essenciais

Implementar as configurações de segurança corretas é fundamental para proteger sua aplicação:

  • httpOnly: true: Protege contra ataques XSS, impedindo o acesso ao cookie por scripts maliciosos.
  • secure: true: Garante que o cookie seja transmitido apenas por HTTPS, evitando interceptação em redes não seguras. USE HTTPS EM PRODUÇÃO.
  • secret forte: Utilize uma string secreta complexa e aleatória. Não utilize segredos facilmente adivinháveis.

Armazenamento da Sessão (Store)

O exemplo acima utiliza o armazenamento padrão em memória. Embora conveniente para desenvolvimento, não é adequado para produção. Em produção, você deve usar um armazenamento persistente, como:

  • connect-redis: Armazena sessões no Redis.
  • connect-mongodb-session: Armazena sessões no MongoDB.
  • Outros bancos de dados (PostgreSQL, MySQL, etc.) utilizando bibliotecas apropriadas.

Isso garante que as sessões sejam preservadas mesmo após reinicializações do servidor.

Conclusão

Gerenciar sessões de forma segura e eficaz é crucial para qualquer aplicação web. Entender como o Express lida com sessões, as configurações do cookie (especialmente httpOnly e secure) e a importância do armazenamento persistente em produção são passos fundamentais para criar aplicações web seguras e com uma ótima experiência para o usuário. Mantenha suas dependências atualizadas e siga as melhores práticas de segurança.

Top comments (0)