Arquitetura de Segurança
tupynambalucas.dev implementa uma estratégia de segurança em múltiplas camadas para proteger os dados da comunidade e garantir a integridade dos ciclos de compartilhamento. Nossa abordagem combina protocolos padrão da indústria com proteção especializada contra bots e mitigação de força bruta.
1. Proteção contra Bots (Cloudflare Turnstile)
Para evitar registros e tentativas de login automatizados, utilizamos o Cloudflare Turnstile. Ao contrário dos CAPTCHAs tradicionais, o Turnstile oferece uma experiência de verificação focada na privacidade e não intrusiva.
1.1. Integração no Lado do Cliente (React 19)
A AuthFeature utiliza o componente @marsidev/react-turnstile no Modo Gerenciado (Managed Mode).
- Modo Gerenciado: Exibe uma caixa de seleção inteligente que verifica se o usuário é humano.
- Gerenciamento de Estado: O botão de envio permanece desativado até que um
turnstileTokenválido seja emitido pelo widget. - Isolamento: Cada formulário (Login/Registrar) mantém sua própria instância do Turnstile por meio de chaves exclusivas do React, garantindo uma nova validação na alternância de modo.
1.2. Validação no Lado do Servidor (Fastify 5)
A API não confia apenas no estado do lado do cliente.
- Verificação: O
AuthServicerealiza uma requisição POST segura parahttps://challenges.cloudflare.com/turnstile/v0/siteverify. - Validação de IP: O endereço IP do cliente é enviado ao Cloudflare para detectar redes de bots baseadas em proxies.
- DTOs Obrigatórios: O
LoginDTOSchemae oRegisterDTOSchemano@tupynambalucas-hub/coreexigem estritamente oturnstileToken.
2. Mitigação de Força Bruta
Protegemos nossos endpoints de autenticação contra ataques de dicionário e adivinhação automatizada por meio de dois mecanismos principais.
2.1. Limitação de Taxa (Rate Limiting)
Utilizando o @fastify/rate-limit, aplicamos limites específicos do contexto a rotas sensíveis.
- Política Global: Um limite base de 100 requisições por minuto por IP para uso geral da API.
- Política Estrita de Autenticação: As rotas
/api/auth/logine/api/auth/registersão limitadas a 5 tentativas por minuto por IP. - Código de Retorno: Exceder esses limites aciona uma resposta
429 (Too Many Requests).
2.2. Lógica de Bloqueio de Conta
Para evitar ataques direcionados a contas de usuários específicas:
- Tentativas Máximas: Após 5 tentativas consecutivas com falha, a conta é bloqueada.
- Duração do Bloqueio: A conta permanece inacessível por 15 minutos (
lockUntil). - Persistência: O estado de bloqueio é armazenado diretamente no modelo
Userdo Mongoose (loginAttempts,lockUntil).
3. Proteção de Dados e Ofuscação
3.1. Prevenção de Enumeração de Usuários
A API foi projetada para vazar o mínimo de informações possível sobre o estado do sistema para usuários não autenticados.
- Erros Genéricos: Tanto "Usuário Não Encontrado" quanto "Senha Inválida" retornam um código de erro unificado
INVALID_CREDENTIALS. - Tempo de Resposta Uniforme: Comparações criptográficas (Bcrypt) são executadas mesmo que o identificador do usuário não exista, evitando ataques de temporização (timing attacks).
3.2. Comunicação Segura
- JWT (HS256): Todas as requisições autenticadas exigem um JSON Web Token assinado com um segredo simétrico forte.
- Proteção CSRF: O
@fastify/csrf-protectionestá ativado, exigindo um cabeçalhoCSRF-Tokenpara todas as requisições de alteração de estado (POST, PUT, DELETE). - Cookies HTTP-Only: Os tokens de sessão são armazenados em cookies assinados e HTTP-only para mitigar o roubo de tokens baseado em XSS.
4. Requisitos de Ambiente
As seguintes chaves de segurança são obrigatórias para o funcionamento da stack da Instância. Cada variável reside no arquivo env pertencente à aplicação responsável, seguindo o princípio de isolamento de Contexto Delimitado (Bounded Context) do projeto.
4.1. API (instance/apps/api/.env.*)
| Variável | Propósito | Ambientes |
|---|---|---|
TURNSTILE_SECRET_KEY | Verificação do token do Cloudflare Turnstile no lado do servidor. | dev, prod, staging |
JWT_SECRET | Assinatura e verificação de JSON Web Tokens. | dev, prod, staging |
SESSION_SECRET | Criptografia de cookies de sessão assinados HTTP-only. | dev, prod, staging |
MONGO_URI | String de conexão do MongoDB. O dev usa o Replica Set local; prod/staging usam o MongoDB Atlas (mongodb+srv://). | dev, prod, staging |
4.2. Web (instance/apps/web/.env.* / Docker ARG)
| Variável | Propósito | Método de Injeção |
|---|---|---|
VITE_TURNSTILE_SITE_KEY | Chave pública do site para renderizar o widget do Turnstile. | Dev local: lida de .env.dev pelo Vite (--mode dev). Produção: injetada como ARG do Docker durante a compilação da imagem — gravada estaticamente no bundle JS. |
Importante: VITE_TURNSTILE_SITE_KEY é uma chave pública (segura para ser incorporada em bundles do cliente). A TURNSTILE_SECRET_KEY é privada e só deve existir no ambiente da API, nunca no aplicativo Web ou commitada no controle de versão.
Última Atualização: Junho de 2026