Como Proteger Sua API de Acesso Não Autorizado

As APIs lidam com 71% de todo o tráfego web atualmente, mas 78% dos ataques são bem-sucedidos após a autenticação. Se você está confiando apenas em chaves de API ou autenticação básica, sua API permanece vulnerável a acessos não autorizados, vazamentos de dados e interrupções de serviço.
Este artigo aborda as práticas essenciais de segurança que todo desenvolvedor precisa conhecer: métodos adequados de autenticação (JWT, OAuth 2.0), controles de autorização (RBAC), limitação de taxa, validação de entrada, criptografia e implementação de gateway de API. Você aprenderá como construir defesas em camadas que trabalham juntas para prevenir acessos não autorizados—mesmo quando invasores possuem credenciais válidas.
Pontos-Chave
- Implemente JWT ou OAuth 2.0 para autenticação robusta além de simples chaves de API
- Use Controle de Acesso Baseado em Funções (RBAC) para gerenciar permissões de forma eficiente
- Aplique limitação de taxa para prevenir abuso e ataques DoS
- Valide todos os dados de entrada contra esquemas rigorosos para bloquear ataques de injeção
- Imponha criptografia HTTPS/TLS para todos os endpoints da API
- Implante um gateway de API para gerenciamento centralizado de segurança
Autenticação: Sua Primeira Linha de Defesa
Autenticação JWT para Segurança Stateless
JSON Web Tokens (JWT) fornecem autenticação stateless ideal para sistemas distribuídos e microsserviços. Diferentemente da autenticação baseada em sessão, os JWTs contêm todas as informações necessárias dentro do próprio token.
// Generate JWT with proper security claims
const jwt = require('jsonwebtoken');
function generateToken(user) {
return jwt.sign(
{
sub: user.id,
scope: user.permissions,
exp: Math.floor(Date.now() / 1000) + (15 * 60) // 15 minutes
},
process.env.JWT_SECRET,
{ algorithm: 'HS256' }
);
}
Práticas críticas de segurança JWT:
- Defina tempos de expiração curtos (15-30 minutos)
- Use segredos fortes e gerados aleatoriamente
- Valide o algoritmo explicitamente para prevenir ataques de confusão de algoritmo
- Implemente rotação de refresh token para sessões de longa duração
OAuth 2.0 para Acesso de Terceiros
OAuth 2.0 se destaca quando você precisa de autorização delegada—permitindo que aplicações de terceiros acessem sua API sem compartilhar credenciais. Use OAuth 2.0 com a extensão PKCE (Proof Key for Code Exchange) para aplicativos móveis e SPAs para prevenir interceptação de código de autorização.
Autorização: Controlando o Que os Usuários Podem Fazer
Implemente Controle de Acesso Baseado em Funções (RBAC)
Autenticação verifica identidade; autorização determina permissões. RBAC atribui permissões a funções em vez de usuários individuais, simplificando o gerenciamento de acesso.
const permissions = {
admin: ['read', 'write', 'delete'],
editor: ['read', 'write'],
viewer: ['read']
};
function authorize(requiredPermission) {
return (req, res, next) => {
const userPermissions = permissions[req.user.role];
if (!userPermissions?.includes(requiredPermission)) {
return res.status(403).json({ error: 'Insufficient permissions' });
}
next();
};
}
Aplique o princípio do menor privilégio—conceda apenas o acesso mínimo necessário para cada função.
Discover how at OpenReplay.com.
Limitação de Taxa: Prevenindo Abuso e Ataques DoS
A limitação de taxa protege contra ataques de força bruta, tentativas de DoS e esgotamento de recursos. Implemente limites escalonados baseados em funções de usuário ou níveis de assinatura.
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 100, // requests per window
standardHeaders: true, // Return rate limit info in headers
handler: (req, res) => {
res.status(429).json({
error: 'Too many requests',
retryAfter: req.rateLimit.resetTime
});
}
});
Para sistemas distribuídos, use Redis para compartilhar contadores de limite de taxa entre instâncias.
Validação de Entrada: Bloqueando Ataques de Injeção
Nunca confie em entrada do cliente. Valide todos os dados recebidos contra esquemas rigorosos para prevenir ataques de injeção SQL, XSS e injeção de comando.
const Ajv = require('ajv');
const ajv = new Ajv();
const userSchema = {
type: 'object',
properties: {
email: { type: 'string', format: 'email' },
age: { type: 'integer', minimum: 18, maximum: 120 }
},
required: ['email'],
additionalProperties: false // Prevent mass assignment
};
const validate = ajv.compile(userSchema);
if (!validate(req.body)) {
return res.status(400).json({ errors: validate.errors });
}
Criptografia: Protegendo Dados em Trânsito
Sempre Use HTTPS/TLS
Imponha HTTPS para todos os endpoints da API—sem exceções. Use TLS 1.3 quando possível e implemente cabeçalhos HTTP Strict Transport Security (HSTS) para prevenir ataques de downgrade.
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
Segurança de Gateway de API: Proteção Centralizada
Um gateway de API como Kong, AWS API Gateway ou Tyk fornece um ponto único de controle para políticas de segurança. Os gateways lidam com:
- Autenticação e autorização
- Limitação de taxa e throttling
- Transformação de requisição/resposta
- Logging e monitoramento
- Proteção contra DDoS
Esta abordagem centralizada simplifica o gerenciamento de segurança e garante aplicação consistente de políticas em todos os endpoints.
Armadilhas Comuns de Segurança a Evitar
Nunca armazene segredos em código frontend. Chaves de API, tokens e credenciais em JavaScript client-side são visíveis para qualquer pessoa que inspecione o código.
Não confie apenas em CORS para segurança. CORS previne navegadores de fazer requisições não autorizadas, mas não protege contra chamadas diretas à API de ferramentas como Postman ou curl.
Evite expor serviços internos diretamente. Sempre roteie tráfego externo através de um gateway de API ou proxy reverso que imponha políticas de segurança.
Não use tokens de longa duração sem rotação. Implemente mecanismos de refresh de token e invalide tokens ao fazer logout ou em atividade suspeita.
Construindo Segurança de API em Camadas
Nenhuma medida de segurança única fornece proteção completa. Segurança efetiva de API requer múltiplas camadas trabalhando juntas:
- Autenticação verifica identidade
- Autorização controla acesso
- Limitação de taxa previne abuso
- Validação de entrada bloqueia dados maliciosos
- Criptografia protege dados em trânsito
- Gateways de API centralizam controles de segurança
Cada camada compensa potenciais fraquezas nas outras. Quando um invasor ultrapassa uma defesa, a próxima camada o detém.
Conclusão
Proteger sua API de acesso não autorizado requer mais do que apenas adicionar autenticação. Ao implementar autenticação JWT ou OAuth 2.0, autorização RBAC, limitação de taxa, validação de entrada, criptografia HTTPS e segurança de gateway de API, você cria um sistema de defesa robusto que protege contra ameaças externas e riscos internos.
Comece com o básico—HTTPS, autenticação e limitação de taxa—depois adicione progressivamente camadas baseadas no seu perfil de risco. Lembre-se: segurança não é uma implementação única, mas um processo contínuo que evolui com sua API e o cenário de ameaças.
Perguntas Frequentes
Autenticação verifica quem é um usuário checando credenciais como senhas ou tokens. Autorização determina o que aquele usuário autenticado pode fazer verificando suas permissões. Ambas são essenciais, mas servem propósitos diferentes na segurança de API.
Tokens JWT devem expirar entre 15 a 30 minutos para aplicações de alta segurança. Tempos de expiração mais curtos limitam danos se os tokens forem comprometidos. Use refresh tokens que duram mais tempo mas podem ser revogados para manter sessões de usuário sem re-autenticação frequente.
Sim, limites de taxa excessivamente restritivos podem bloquear usuários legítimos durante picos de tráfego. Implemente limites escalonados baseados em funções de usuário ou níveis de assinatura. Monitore padrões de uso para definir limiares apropriados e forneça mensagens de erro claras com informações de retry quando os limites forem atingidos.
Não, HTTPS apenas criptografa dados em trânsito entre cliente e servidor. Você ainda precisa de autenticação, autorização, validação de entrada e limitação de taxa. HTTPS é essencial, mas representa apenas uma camada em uma estratégia abrangente de segurança de API.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.