Como identificar recursos em APIs modernas sem cair em armadilhas

Avatar de Bernardo Lobato

Você já se pegou debugando uma API ou fuçando o banco de dados de um projeto novo e se deparou com aqueles IDs gigantes, cheios de letras, números e hífens?

E aí bate aquela pergunta clássica:

“Cadê o ID sequencial bonitinho e ordenado?”

Mais do que isso:
Será que esses IDs são performáticos mesmo?
Será que não vão explodir meus índices?
Isso é arquitetura… ou só modinha?

Se essas perguntas já passaram pela sua cabeça, esse artigo é pra você.

Hoje vamos falar sobre identificação de recursos em APIs modernas, com foco em duas estratégias muito comuns:

  • IDs sequenciais
  • UUIDs (ou UIDs)

Mais importante do que decorar vantagens e desvantagens é entender o impacto arquitetural dessa escolha — porque ela muda, de forma significativa, como seu sistema se comporta, escala e se protege.


O que é um ID, afinal?

Antes de comparar estratégias, vale alinhar o conceito.

Um ID (identificador) é um valor único usado para diferenciar um registro dos outros.
Em uma API, ele é essencial para:

  • Buscar recursos
  • Atualizar dados
  • Referenciar entidades com segurança e precisão

Uma boa analogia é pensar em um CPF ou RG: não importa quantas pessoas tenham o mesmo nome, aquele número identifica uma única pessoa.

Dentro de sistemas, existem várias formas de gerar esse identificador. Neste artigo, vamos focar nas duas mais comuns no dia a dia de quem desenvolve APIs.


IDs sequenciais: o clássico que todo mundo conhece

O ID sequencial é o velho conhecido de quem começou estudando bancos de dados relacionais.

Normalmente ele é:

  • Um número inteiro
  • Gerenciado pelo próprio banco
  • Gerado automaticamente com auto increment

Você insere um registro e pronto: o banco cuida de atribuir o próximo número disponível.

Por que eles são tão populares?

Porque têm vantagens muito claras:

  • 🚀 Alta performance
  • 📚 Índices extremamente eficientes
  • 📏 Ordenação natural
  • 🧠 Fáceis de entender
  • 💾 Leves em termos de armazenamento (4 a 8 bytes)

Em sistemas grandes, com milhões ou bilhões de registros, isso faz muita diferença.

Então… se eles são tão bons, por que não usar sempre?


Onde os IDs sequenciais começam a falhar

Muitas das qualidades dos IDs sequenciais se tornam problemas sérios quando entramos no mundo das APIs públicas e dos sistemas distribuídos.

1. Exposição de informação sensível

Imagine que você cria um usuário e recebe o ID 1234.
Só com isso já dá para inferir muita coisa.

Se a URL for algo como:

/users/1234

Um atacante pode simplesmente tentar:

/users/1235
/users/1236
/users/1237

Se a API estiver mal protegida, você acabou de facilitar:

  • ID Enumeration Attacks
  • Scraping massivo de dados
  • Vazamento de informações sensíveis

Mesmo que exista autenticação, esse padrão já entrega mais informação do que deveria.


2. Inteligência competitiva indesejada

Com IDs sequenciais, alguém consegue inferir:

  • Quantos usuários existem
  • Quantos pedidos foram feitos
  • Ritmo de crescimento do negócio

Isso pode parecer detalhe técnico, mas vira dado estratégico quando exposto.


3. Problemas em sistemas distribuídos

Agora pense em um cenário mais arquitetural.

Você tem:

  • Várias instâncias da API
  • Todas gravando no mesmo banco
  • Alto volume de requisições simultâneas

Nesse cenário, o banco precisa:

  • Coordenar quem pega qual ID
  • Criar locks
  • Sincronizar inserts concorrentes

Isso gera:

  • Gargalos
  • Perda de performance
  • Menos ganho real com escalabilidade horizontal

Ou seja: o banco vira o gargalo do sistema.


UUIDs: identificadores pensados para sistemas distribuídos

Os UUIDs existem desde a década de 80, mas foram padronizados para a internet com a RFC 4122 e evoluíram ao longo do tempo.

A ideia central é simples e poderosa:

Cada sistema pode gerar IDs sem precisar se coordenar com ninguém.

Características principais

  • 128 bits
  • Representação hexadecimal
  • Extremamente baixa chance de colisão
  • Geração local, inclusive offline

Isso muda completamente o jogo.


Por que UUIDs funcionam tão bem em APIs modernas?

Vamos revisitar alguns problemas dos IDs sequenciais.

🔹 Colisão em ambientes distribuídos? Praticamente inexistente

Cada instância gera seu próprio ID, sem depender do banco.

🔹 Geração offline

Perfeito para aplicações que precisam sincronizar dados depois.

🔹 Segurança por obscuridade (bem aplicada)

Não dá para “chutar” o próximo ID.

🔹 Ideal para logs, eventos e mensageria

Cada evento pode ser identificado globalmente, sem conflito.


Mas… UUIDs são todos iguais?

Não. Existem várias versões, cada uma com características diferentes.

UUID v1

  • Baseado em timestamp + MAC address
  • Ordenável
  • Problema: expõe informações sensíveis

UUID v2

  • Inclui ID de usuário e grupo do sistema operacional
  • Quase ninguém usa (com razão)

UUID v3 e v5 (determinísticos)

  • Baseados em namespace + hash
  • Úteis quando você quer gerar sempre o mesmo ID a partir dos mesmos dados
  • V3 usa MD5, V5 usa SHA-1

UUID v4 (o mais usado)

  • Totalmente aleatório
  • Fácil de gerar
  • Amplamente suportado
  • Problema: não é ordenável → impacta índices

UUID v7 (o novo queridinho)

  • Timestamp + aleatoriedade
  • Ordenável
  • Ótimo para bancos e eventos
  • Retrocompatível com versões anteriores

A v7 traz o famoso “melhor dos dois mundos”.


Então UUIDs são sempre melhores?

Não.

Eles também têm trade-offs importantes:

  • São maiores (128 bits)
  • Impactam índices se mal utilizados
  • URLs ficam menos amigáveis
  • Mais custo de storage
  • Nem todo cenário precisa dessa complexidade

Quando usar UUIDs?

  • APIs públicas
  • Sistemas distribuídos
  • Microsserviços
  • Identificação de eventos e logs
  • Sincronização entre sistemas
  • Geração de IDs offline
  • Quando segurança e escalabilidade importam

Quando IDs sequenciais ainda fazem sentido?

  • Sistemas pequenos e centralizados
  • Dados internos que não são expostos
  • Tabelas de domínio
  • Conjuntos de dados controlados
  • Quando slugs fazem mais sentido (SEO, URLs legíveis)

Conclusão: não existe ID perfeito

A escolha do identificador diz muito sobre o tipo de sistema que você está construindo.

IDs sequenciais são simples, rápidos e eficientes — até o momento em que começam a limitar segurança e escalabilidade.

UUIDs resolvem problemas reais de sistemas modernos, mas trazem novos desafios.

No fim das contas, o papel do arquiteto e do desenvolvedor é entender o domínio, o contexto e os trade-offs.

Não existe bala de prata.
Existe a escolha certa para o seu caso de uso.