Visão Geral
O AssessIQ aplica múltiplas camadas de segurança para proteger dados de usuários, sessões e endpoints.Autenticação
Login via POST
Credenciais enviadas no corpo da requisição (JSON), nunca via URL ou query params.
Bcrypt
Senhas armazenadas com bcrypt (cost factor 10). Nunca armazenadas em texto plano.
Sessão JWT
Cookie
next-auth.session-token com flags HttpOnly e Secure. Inacessível via JavaScript.2FA
Suporte a autenticação de dois fatores via e-mail OTP ou TOTP.
Revogação de Sessão
Toda sessão carrega umsessionVersion validado a cada request. Ao alterar senha, revogar sessão ou atualizar permissões, o sessionVersion é incrementado e todas as sessões ativas são invalidadas imediatamente.
Headers HTTP de Segurança
Adicionados globalmente vianext.config.ts, aplicados em todas as rotas (/(.*)):
| Header | Valor | Proteção |
|---|---|---|
X-Frame-Options | SAMEORIGIN | Anti-clickjacking |
X-Content-Type-Options | nosniff | Anti-MIME sniffing |
Strict-Transport-Security | max-age=31536000; includeSubDomains; preload | Força HTTPS por 1 ano |
Referrer-Policy | strict-origin-when-cross-origin | Limita dados no Referer |
Permissions-Policy | camera=(), microphone=(), geolocation=() | Desativa APIs de browser |
X-XSS-Protection | 1; mode=block | Anti-XSS em browsers legados |
Content-Security-Policy | Whitelist de origens — inclui vercel.live, *.vercel.live, *.pusher.com, va.vercel-scripts.com, fonts.gstatic.com | Anti-XSS e injeção de scripts |
A CSP é gerenciada exclusivamente via
next.config.ts. Não adicione headers de CSP no vercel.json — isso sobrescreve a configuração completa com uma versão incompleta.Rate Limiting
Implementado com Upstash Redis + sliding window:| Endpoint | Limite | Janela |
|---|---|---|
/api/auth/check-credentials | 5 tentativas | 10 minutos por IP |
/api/users/forgot-password | 5 tentativas | 10 minutos por IP e por e-mail |
| API geral | 100 req | 1 minuto por IP |
| Submissões | 20 req | 1 hora por IP |
| Upload | 10 req | 1 hora por IP |
| Export | 5 req | 1 hora por IP |
| 2 req | 1 minuto por IP | |
| Search | 30 req | 1 minuto por IP |
Se o Redis estiver indisponível, o rate limiting falha aberto (fail-open) — requisições são permitidas e o erro é registrado nos logs. Isso evita bloqueio de logins legítimos por falha de infraestrutura Redis.
CSRF
Proteção via double-submit cookie:- Cookie
csrf-tokendefinido em cada resposta (SameSite=Lax, Secure=true) - Header
X-CSRF-Tokenobrigatório em requisiçõesPOST/PUT/PATCH/DELETE - Verificado no
proxy.tsantes de qualquer handler de rota - Rotas
/api/auth/*(NextAuth) e/api/mobile/*(JWT Bearer) são isentas de CSRF - Se
CSRF_SECRETnão estiver configurada, a proteção é desabilitada com log de erro crítico (não causa crash)
CORS
- Origens permitidas configuradas via variável de ambiente
ALLOWED_ORIGINS - Requisições de origens não listadas são bloqueadas com
403 - Sempre inclui a própria origem do servidor (same-origin)
Logs e PII
- Emails não são logados em produção para evitar exposição de dados pessoais
- Logs de erro identificam usuários apenas por
uid=(ID interno) - Sentry captura erros sem PII em campos sensíveis
Política de Senhas
- Mínimo de 8 caracteres
- Armazenamento com bcrypt
DEFAULT_DEV_PASSWORDbloqueado em produção — usuários sem senha devem redefinir via “esqueci minha senha”- Tokens de redefinição de senha: armazenados como SHA-256 no banco; expiram em 30 minutos
Proteção de Dados
- Campos sensíveis (CPF, dados médicos) criptografados na camada do Prisma via
prisma-encryption-extension - Backups exportados com timestamp e controle de acesso por role
- Soft delete: dados nunca apagados permanentemente sem ação explícita de
SUPER_ADMIN
Checklist de Deploy Seguro
Variáveis de ambiente
Configure
NEXTAUTH_SECRET, DATABASE_URL, REDIS_URL, ALLOWED_ORIGINS e ENCRYPTION_KEY com valores fortes.