Segurança em APIs RESTFul: o elo fraco que ninguém quer falar
83% dos vazamentos de dados em APIs acontecem por configurações incorretas, não por ataques sofisticados.
Deixa eu repetir: não são hackers geniais quebrando criptografia.
São endpoints desprotegidos, tokens expostos e validações esquecidas.
E o mais frustrante?
Toda falha poderia ter sido evitada com boas práticas básicas.
Se você desenvolve APIs, este é o artigo mais importante da série.
O inimigo invisível: a pressa
No início, toda API nasce simples:
- Alguns endpoints
- Um token básico
- "Depois eu arrumo a segurança"
Esse "depois" raramente chega.
E quando chega, já é tarde demais.
A segurança não é um recurso opcional — é pré-requisito.
É a diferença entre um sistema confiável e um incidente de R$ 2 milhões.
Checklist: os 7 pilares da segurança em APIs
1️⃣ Autenticação e Autorização
O problema:
Tokens JWT sem expiração, segredos hardcoded, permissões genéricas demais.
A solução:
// ❌ ERRADO
const token = jwt.sign({ userId: 123 }, 'secret123');
// ✅ CORRETO
const token = jwt.sign(
{ userId: 123, scope: ['read:orders'] },
process.env.JWT_SECRET,
{ expiresIn: '15m', algorithm: 'RS256' }
);
Regras de ouro:
- Use OAuth 2.1 ou JWT com rotação automática
- Nunca armazene segredos no código (use variáveis de ambiente)
- Implemente refresh tokens com expiração curta
2️⃣ Rate Limiting
O problema:
Endpoints sem limite permitem força bruta, scraping e ataques de negação de serviço.
A solução:
// Express + express-rate-limit
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutos
max: 100, // 100 requisições
standardHeaders: true,
legacyHeaders: false,
message: 'Muitas requisições. Tente novamente em 15 minutos.'
});
app.use('/api/', apiLimiter);
Benefício: Protege contra bots, reduz custos de infraestrutura, melhora UX.
3️⃣ Validação de Entrada
O problema:
Toda entrada é potencialmente maliciosa até provar o contrário.
A solução:
// Usando Zod para validação
const userSchema = z.object({
email: z.string().email().max(255),
age: z.number().int().min(18).max(120),
role: z.enum(['user', 'admin'])
});
app.post('/users', (req, res) => {
try {
const validated = userSchema.parse(req.body);
// Processa dados validados
} catch (error) {
return res.status(400).json({ error: error.errors });
}
});
Nunca confie no cliente. SQL Injection, XSS e Command Injection começam com validação fraca.
4️⃣ HTTPS sempre. Sempre. SEMPRE.
O problema:
"Ah, é só uma API interna, não precisa de HTTPS."
A realidade:
Todo tráfego HTTP pode ser interceptado. Sem exceções.
A solução:
- Use Let's Encrypt (grátis) ou Cloudflare
- Force HTTPS com redirecionamento automático
- Configure HSTS (HTTP Strict Transport Security)
# Nginx config
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
5️⃣ CORS configurado corretamente
O problema:
// ❌ NUNCA FAÇA ISSO
app.use(cors({ origin: '*' }));
A solução:
// ✅ CORRETO
app.use(cors({
origin: [
'https://meuapp.com',
'https://app.meuapp.com'
],
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
6️⃣ Respostas de erro seguras
O problema:
// ❌ Expondo estrutura interna
{
"error": "MongoError: duplicate key error collection: users.email",
"stack": "at Connection._executeCommand (/app/node_modules/mongodb/...)"
}
A solução:
// ✅ Genérico para o cliente
{
"error": {
"code": "RESOURCE_CONFLICT",
"message": "Este email já está em uso"
}
}
Log completo apenas internamente. Nunca exponha stack traces, queries ou estrutura de banco.
7️⃣ Logging e monitoramento
O que registrar:
- Tentativas de autenticação (sucesso e falha)
- Mudanças em recursos críticos
- Rate limit hits
- Requisições com payloads suspeitos
Ferramentas essenciais:
- OWASP ZAP (pentesting automatizado)
- Datadog/New Relic (monitoramento em tempo real)
- Sentry (rastreamento de erros)
Falhas reais que derrubaram empresas
Caso 1: Twitter (2022)
- Endpoint administrativo sem autenticação reforçada
- Resultado: 5.4 milhões de contas expostas
Caso 2: T-Mobile (2021)
- Tokens em logs públicos do CloudWatch
- Resultado: Dados de 50 milhões de clientes vazados
Caso 3: Startup de fintech brasileira
- CORS configurado como
* - Resultado: Ataque XSS que drenou contas de usuários
Cada uma dessas falhas poderia ser evitada com as práticas acima.
Segurança não é obstáculo: é credibilidade
Muitos devs tratam segurança como "algo que atrasa o deploy".
Mas segurança não é freio — é confiança.
É a diferença entre:
- Uma startup que cresce
- E uma que fecha por vazamento de dados
Empresas como Stripe, Auth0 e Plaid cresceram não só pela tecnologia — mas porque os desenvolvedores confiam nelas.
E confiança é o ativo mais valioso de qualquer API.
Autoavaliação: sua API está segura?
Responda honestamente:
- Meus tokens JWT têm expiração curta?
- Tenho rate limiting em todos os endpoints públicos?
- Valido e sanitizo TODA entrada do usuário?
- Uso HTTPS em produção (e staging)?
- Meu CORS está configurado com domínios específicos?
- Logs de erro não expõem estrutura interna?
- Monitoro tentativas de acesso suspeitas?
Menos de 7 "sim"?
Você tem trabalho pela frente.
7 de 7?
Parabéns. Você está nos 20% que levam segurança a sério.
E a sua API?
Me conta nos comentários:
Qual desses 7 pilares você implementa consistentemente?
E qual você sabe que deveria melhorar (mas ainda não priorizou)?
Sem julgamentos. Segurança é uma jornada, não um destino. 🛡️
📅 Próxima semana:
Vamos mudar completamente o ângulo e olhar APIs como produto digital, explorando como empresas monetizam integrações e transformam endpoints em linhas de receita.



