Dominando a Autenticação Moderna: Cookies, Sessões, JWT e Passport.js

Por stayfrosty1995, Especialista em Segurança Cibernética e Desenvolvimento de Software


Introdução

A autenticação é a base de qualquer sistema digital seguro, garantindo que usuários e serviços sejam realmente quem dizem ser. Com o avanço das ameaças cibernéticas, os mecanismos de autenticação também evoluíram. Neste artigo, vamos explorar quatro tecnologias essenciais: Cookies, Sessões, JSON Web Tokens (JWT) e Passport.js. Veremos como funcionam, suas vantagens e quando utilizar cada uma delas.


1. Cookies: O Clássico Mecanismo do Lado do Cliente

Cookies são pequenos pedaços de dados armazenados no navegador do usuário, utilizados para manter interações com estado entre o cliente e o servidor.

Como Funcionam

  1. O servidor envia um cabeçalho Set-Cookie na resposta HTTP.
  2. O navegador armazena o cookie localmente.
  3. Nas próximas requisições, o navegador envia o cookie automaticamente.

Características Principais:

  • Cookies de Sessão: Temporários, são apagados quando o navegador fecha.
  • Cookies Persistentes: Mantidos até uma data definida.
  • Bandeiras de Segurança: Secure, HttpOnly e SameSite ajudam a mitigar riscos.

Exemplo de Código (Node.js/Express)

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

app.use(cookieParser());

app.get('/login', (req, res) => {
  res.cookie('user', 'john_doe', { httpOnly: true, secure: true, sameSite: 'strict' });
  res.send('Login realizado!');
});

app.get('/dashboard', (req, res) => {
  const user = req.cookies.user;
  res.send(`Bem-vindo, ${user}!`);
});

app.listen(3000);

2. Sessões: Gerenciamento de Estado no Lado do Servidor

Sessões armazenam dados do usuário no servidor, vinculados a um cliente por meio de um ID de sessão, geralmente mantido em um cookie.

Como Funcionam

  1. O servidor cria um ID de sessão durante o login.
  2. Esse ID é enviado ao cliente e armazenado.
  3. Em requisições subsequentes, o cliente envia o ID, permitindo que o servidor recupere os dados associados.

Características Principais:

  • Centralização dos dados da sessão no servidor.
  • Possibilidade de controlar a expiração e revogar o acesso conforme necessário.

Exemplo de Código (Node.js/Express com express-session)

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

app.use(session({
  secret: 'segredoSuperSecreto',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true, httpOnly: true, maxAge: 60000 }
}));

app.get('/login', (req, res) => {
  req.session.user = 'john_doe';
  res.send('Login realizado!');
});

app.get('/dashboard', (req, res) => {
  res.send(`Bem-vindo, ${req.session.user}!`);
});

app.listen(3000);

3. JSON Web Tokens (JWT): Tokens Estateless para Aplicações Modernas

JWT é um formato de token compacto e autocontido que codifica informações (claims) para transmissão segura.

Estrutura

  • Header: Indica o algoritmo e o tipo de token.
  • Payload: Contém as claims (ex: user_id, exp).
  • Signature: Garante a integridade do token.

Como Funcionam

  1. Após a autenticação, o servidor gera um JWT assinado.
  2. O cliente armazena o token (por exemplo, no localStorage) e o envia em requisições usando o cabeçalho Authorization.
  3. O servidor valida o token e processa as informações contidas.

Exemplo de Código (Node.js com jsonwebtoken)

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

const SECRET_KEY = 'chaveSuperSecreta';

app.get('/login', (req, res) => {
  const token = jwt.sign({ user: 'john_doe' }, SECRET_KEY, { expiresIn: '1h' });
  res.json({ token });
});

app.get('/dashboard', (req, res) => {
  const token = req.headers.authorization?.split(' ')[1];
  try {
    const decoded = jwt.verify(token, SECRET_KEY);
    res.send(`Bem-vindo, ${decoded.user}!`);
  } catch {
    res.status(401).send('Token inválido.');
  }
});

app.listen(3000);

4. Passport.js: Autenticação Modular e Flexível

Passport.js é uma biblioteca de autenticação para Node.js que suporta diversas estratégias, como Local, OAuth e JWT.

Como Funciona

  1. O usuário se autentica usando uma estratégia configurada.
  2. O Passport valida as credenciais e, conforme a estratégia, pode criar uma sessão ou gerar um token.
  3. A integração com o Express torna a autenticação modular e de fácil gerenciamento.

Exemplo de Código (Node.js com Passport.js e JWT)

const express = require('express');
const passport = require('passport');
const jwt = require('jsonwebtoken');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const app = express();

const SECRET_KEY = 'chaveSuperSecreta';
const opts = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: SECRET_KEY
};

passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
  jwt_payload.user === 'john_doe' ? done(null, jwt_payload) : done(null, false);
}));

app.use(passport.initialize());

app.get('/login', (req, res) => {
  const token = jwt.sign({ user: 'john_doe' }, SECRET_KEY, { expiresIn: '1h' });
  res.json({ token });
});

app.get('/dashboard', passport.authenticate('jwt', { session: false }), (req, res) => {
  res.send(`Bem-vindo, ${req.user.user}!`);
});

app.listen(3000);

Conclusão

A escolha do mecanismo de autenticação depende das necessidades da aplicação:

  • Aplicações Web Tradicionais: Cookies e sessões.
  • APIs e SPAs: JWT.
  • Soluções Modulares e Flexíveis: Passport.js.

Compreender essas ferramentas permite criar sistemas de autenticação robustos, escaláveis e seguros.


Leitura Recomendada:

Faça uma doação: https://ko-fi.com/millenialperson1995