> ## Documentation Index
> Fetch the complete documentation index at: https://docs.assessiq.digital/llms.txt
> Use this file to discover all available pages before exploring further.

# Segurança

> Práticas de segurança implementadas na plataforma AssessIQ.

## Visão Geral

O AssessIQ aplica múltiplas camadas de segurança para proteger dados de usuários, sessões e endpoints.

***

## Autenticação

<CardGroup cols={2}>
  <Card title="Login via POST" icon="lock">
    Credenciais enviadas no **corpo da requisição** (JSON), nunca via URL ou query params.
  </Card>

  <Card title="Bcrypt" icon="shield-check">
    Senhas armazenadas com bcrypt (cost factor 10). Nunca armazenadas em texto plano.
  </Card>

  <Card title="Sessão JWT" icon="key">
    Cookie `next-auth.session-token` com flags **HttpOnly** e **Secure**. Inacessível via JavaScript.
  </Card>

  <Card title="2FA" icon="mobile">
    Suporte a autenticação de dois fatores via e-mail OTP ou TOTP.
  </Card>
</CardGroup>

### Revogação de Sessão

Toda sessão carrega um `sessionVersion` 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 via `next.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 |

<Note>
  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.
</Note>

***

## 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                  |
| Email                         | 2 req        | 1 minuto por IP                |
| Search                        | 30 req       | 1 minuto por IP                |

<Note>
  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.
</Note>

***

## CSRF

Proteção via **double-submit cookie**:

* Cookie `csrf-token` definido em cada resposta (SameSite=Lax, Secure=true)
* Header `X-CSRF-Token` obrigatório em requisições `POST/PUT/PATCH/DELETE`
* Verificado no `proxy.ts` **antes** de qualquer handler de rota
* Rotas `/api/auth/*` (NextAuth) e `/api/mobile/*` (JWT Bearer) são isentas de CSRF
* Se `CSRF_SECRET` nã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_PASSWORD` **bloqueado 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

<Steps>
  <Step title="Variáveis de ambiente">
    Configure `NEXTAUTH_SECRET`, `DATABASE_URL`, `REDIS_URL`, `ALLOWED_ORIGINS` e `ENCRYPTION_KEY` com valores fortes.
  </Step>

  <Step title="HTTPS obrigatório">
    Garanta que o domínio usa TLS. O header HSTS reforça isso após o primeiro acesso.
  </Step>

  <Step title="Revise ALLOWED_ORIGINS">
    Liste apenas os domínios efetivamente utilizados. Evite `*`.
  </Step>

  <Step title="2FA para admins">
    Ative 2FA para todas as contas com role `ADMIN` e `SUPER_ADMIN`.
  </Step>

  <Step title="Rotação de segredos">
    Rotacione `NEXTAUTH_SECRET` e `ENCRYPTION_KEY` periodicamente. Isso invalida todas as sessões ativas.
  </Step>
</Steps>
