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
- O servidor envia um cabeçalho
Set-Cookie
na resposta HTTP. - O navegador armazena o cookie localmente.
- 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
eSameSite
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
- O servidor cria um ID de sessão durante o login.
- Esse ID é enviado ao cliente e armazenado.
- 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
- Após a autenticação, o servidor gera um JWT assinado.
- O cliente armazena o token (por exemplo, no localStorage) e o envia em requisições usando o cabeçalho
Authorization
. - 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
- O usuário se autentica usando uma estratégia configurada.
- O Passport valida as credenciais e, conforme a estratégia, pode criar uma sessão ou gerar um token.
- 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