APIs REST sao a espinha dorsal das aplicacoes modernas e tambem o principal alvo de ataques. Implementar autenticacao e autorizacao corretas e critico. Este guia cobre OAuth 2.0 e JWT na pratica com exemplos reais e armadilhas comuns.
JWT: como funciona e onde falha
JSON Web Tokens sao compostos por tres partes separadas por ponto: Header (algoritmo e tipo), Payload (dados e claims) e Signature (assinatura criptografica). O header e payload sao codificados em Base64URL e nao sao criptografados. Qualquer pessoa pode decodificar e ler o conteudo de um JWT.
A assinatura garante apenas integridade, nao confidencialidade. O servidor usa uma chave secreta (HMAC) ou par de chaves (RSA/ECDSA) para assinar o token. Na validacao, o servidor recalcula a assinatura e compara com a recebida.
Erros criticos com JWT que voce deve evitar: usar algoritmo none que desabilita a verificacao de assinatura. Usar chaves secretas fracas ou previsiveis para HMAC. Nao validar a claim de expiracao (exp) permitindo tokens eternos. Armazenar dados sensiveis no payload que pode ser decodificado por qualquer pessoa. Nao implementar revogacao de tokens que impede invalidar sessoes comprometidas.
Implementacao segura de JWT
Use RS256 (RSA) em vez de HS256 (HMAC) para cenarios com multiplos servicos. Com RS256, apenas o servico de autenticacao tem a chave privada para assinar tokens. Os demais servicos validam com a chave publica sem acesso a chave de assinatura.
Defina tempos de expiracao curtos: access tokens com no maximo 15 minutos e refresh tokens com 7 a 30 dias. Implemente rotacao de refresh tokens: a cada uso do refresh token, gere um novo par de tokens e invalide o anterior. Isso limita a janela de exposicao se um token for comprometido.
Armazene tokens de forma segura: access tokens em memoria (variavel JavaScript), refresh tokens em httpOnly cookies com flags Secure e SameSite. Nunca armazene em localStorage ou sessionStorage pois sao acessiveis via JavaScript e vulneraveis a XSS.
OAuth 2.0 para APIs
OAuth 2.0 e um framework de autorizacao que permite que aplicacoes de terceiros acessem recursos em nome do usuario sem expor suas credenciais. Os quatro fluxos principais:
Authorization Code: o mais seguro para aplicacoes web e mobile. O usuario e redirecionado para o provedor de identidade, autentica-se e autoriza o acesso. O provedor retorna um codigo temporario que a aplicacao troca por tokens no backend. Use sempre com PKCE (Proof Key for Code Exchange) para prevenir ataques de interceptacao.
Client Credentials: para comunicacao servidor-a-servidor sem usuario envolvido. A aplicacao se autentica diretamente com client_id e client_secret para obter um access token. Adequado para microservicos e integrações entre sistemas.
Device Authorization: para dispositivos com limitacoes de input como Smart TVs e IoT. O dispositivo exibe um codigo que o usuario digita em outro device para autorizar.
Resource Owner Password Credentials: o usuario fornece username e senha diretamente a aplicacao. Deve ser evitado em quase todos os cenarios pois expoe credenciais a aplicacao.
Rate Limiting e protecao contra abusos
Rate limiting impede que atacantes ou usuarios mal intencionados sobrecarreguem sua API. Implemente em multiplas camadas: global (limite total de requisicoes por segundo para toda a API), por IP (limite por endereco IP para evitar ataques de forca bruta), por usuario (limite por token autenticado para evitar abusos), por endpoint (limites diferentes para endpoints sensiveis como login e registro).
Use headers padrao para comunicar limites: X-RateLimit-Limit indica o limite total, X-RateLimit-Remaining indica requisicoes restantes e X-RateLimit-Reset indica quando o limite sera resetado. Retorne status 429 Too Many Requests quando o limite for atingido.
Validacao de input em APIs
Valide todo input no servidor independente de validacao no cliente. Use schemas de validacao com bibliotecas como Joi, Zod ou Yup. Defina tipos, formatos, tamanhos minimos e maximos para cada campo. Rejeite requisicoes com campos inesperados para prevenir mass assignment.
Sanitize dados de saida: nunca retorne campos internos como hashes de senha, IDs de sessao ou metadados do sistema. Use DTOs (Data Transfer Objects) para controlar exatamente quais campos sao retornados em cada endpoint.
Tem um projeto em mente?
Somos especialistas em transformar ideias em produtos digitais. Apps, sites, automações e IA — vamos construir juntos.