// docs / baas security / clerk hardening
Checklist de segurança Clerk: 20 itens
O Clerk gere auth, sessões e organizações para a sua app — o que significa que uma integração Clerk mal configurada é um bypass de auth, um vetor de fixação de sessão ou um caminho de vazamento entre orgs. Este checklist é uma auditoria de 20 itens através de chaves, configuração de sessão, webhooks, organizações, templates JWT e monitorização contínua. Ferramentas de codificação com IA fazem o cabeamento do Clerk rapidamente com padrões sensatos; esta lista apanha os itens que deixam na mesa.
Para contexto sobre porque é que configurações incorretas em nível de auth são um ponto fraco das ferramentas de IA, veja Porque é que ferramentas de codificação com IA deixam lacunas de segurança. Para o checklist paralelo no Auth0, veja Checklist de segurança Auth0.
Chaves de ambiente e allowlist de origem
O Clerk emite duas chaves distintas por projeto. Misturá-las ou vazá-las é o primeiro modo de falha.
- Use a chave publicável (
pk_live_*em produção,pk_test_*em dev) no navegador; use a chave secreta (sk_live_*/sk_test_*) apenas no servidor. A chave publicável é segura emNEXT_PUBLIC_CLERK_PUBLISHABLE_KEY; a chave secreta nunca pode carregar um prefixo env público e nunca pode aparecer num componente cliente. - Verifique que a app de produção usa
pk_live_*, nãopk_test_*. Instâncias de teste permitem endereços de e-mail não verificados e MFA desabilitado — publicar modo de teste em produção é um bypass de auth. - Configure as origens permitidas no painel do Clerk. Settings → Domains → Allowed origins deve listar o seu domínio de produção exatamente. Listas de origens vazias ou com wildcard deixam atacantes criar frontends Clerk falsos que falam com o seu backend.
- Rotacione a chave secreta em qualquer saída ou vazamento suspeito. Painel → API Keys → Reset. Chave antiga é invalidada; republique o código do lado do servidor com o novo valor antes de rotacionar.
Configuração de sessão
Expiração de sessão e timeouts de inatividade são a diferença entre uma sessão roubada ser um incidente de 10 minutos ou de 30 dias.
- Defina timeout de inatividade de sessão em 30 minutos ou menos para apps SaaS que lidam com dados sensíveis. Painel → Sessions → Inactivity timeout. Apps de nível bancário devem usar 5-10 minutos; SaaS padrão 30-60 minutos; apps de consumo 1-7 dias. Padrão é 7 dias.
- Habilite revogação de sessão em mudança de palavra-passe, mudança de e-mail e inscrição em MFA. Painel → Sessions → Revoke on. São eventos de segurança iniciados pelo utilizador; sessões existentes noutros dispositivos devem ser eliminadas.
- Verifique sessões do lado do servidor em cada rota protegida, não apenas no sign-in. No Next.js:
const { userId } = await auth();num componente de servidor / rota de API lê o JWT do cookie e valida-o. Nunca confie numa verificação só de cookie. - Defina
SameSite=Lax(padrão) ouStrictno cookie de sessão. Verifique em DevTools → Application → Cookies.SameSite=Noneé um vetor CSRF — nunca use a menos que tenha explicitamente configurado uma auth entre domínios.
Verificação de webhooks
Webhooks do Clerk disparam em eventos de ciclo de vida de utilizador (criado, atualizado, eliminado, session.ended). São o mecanismo de sincronização para a sua base de dados — e um webhook forjado é uma primitiva de escrita em base de dados.
- Verifique a assinatura Svix em cada webhook. Webhooks do Clerk são assinados pelo Svix. Use
new Webhook(secret).verify(body, headers). Rejeite com401se a verificação falhar. - Armazene o segredo do webhook numa variável de ambiente, nunca no código. O segredo é rotacionado a cada regeneração no painel — o seu deploy deve lê-lo do env, não de uma constante.
- Idempotência em cada handler. Entregas de webhook podem repetir-se. Use o cabeçalho
svix-idcomo chave primária numa tabelawebhook_eventspara deduplicar. Envolva a mudança de estado e o insert de idempotência na mesma transação. - Em
user.deleted, elimine ou anonimize PII em 24 horas. RGPD / CCPA exigem. Audite o caminho de eliminação: que tabelas contêm os dados deste utilizador? Use FK ON DELETE CASCADE onde puder.
Organizações e permissões
Se usa Clerk Organizations, a fronteira de org é o seu isolamento de tenant. Cada consulta do lado do servidor deve filtrar por ela.
- Em cada rota de API, leia tanto
userIdquantoorgIddeauth()e filtre consultas de base de dados por ambos.WHERE org_id = $orgId AND user_id = $userId. Nunca confie numorg_iddo corpo do pedido. - <strong>Use Clerk role checks for privileged operations, not boolean checks against the user object.</strong> <code>has({ role: 'org:admin' })</code> reads the role from the verified JWT. A user can spoof a boolean on a stale client object; they cannot spoof a JWT claim.
- Teste isolamento entre orgs com duas contas de org reais. Crie Org A, popule dados, entre na Org B noutro navegador, tente ler os dados da Org A via API. A resposta deve ser
403ou404.
Templates JWT e integrações externas
Templates JWT empurram identidade Clerk para Supabase, Firebase e outros serviços downstream. Templates mal configurados partilham claims demais ou expõem dados que não queria.
- Para cada template JWT, liste cada claim e confirme que é necessário. Painel → JWT Templates. Um template que envia
emailephonepara o Supabase expõe PII a qualquer um que ler o JWT no navegador. - Defina expiração curta em templates JWT usados para chamadas downstream do lado do cliente. 60 segundos para pedidos de API downstream é o padrão. JWTs de vida mais longa são roubados e reproduzidos.
- Verifique o claim de audiência (
aud) no lado recetor. Supabase, Firebase, etc. devem verificar queaudcorresponde ao identificador de serviço esperado. Sem isto, um JWT emitido para o serviço A pode autenticar-se ao serviço B.
Monitorização operacional
Auth é a fonte de logs de maior sinal que tem. Observe-a.
- Alerte em picos de logins falhos por IP / por conta. Uma taxa de falha 50× a normal é um ataque de credential stuffing. O Clerk emite estes eventos para webhooks; encaminhe para o seu SIEM.
- Revisão trimestral da deriva de configurações de sessão e instância. Padrões mudam à medida que o Clerk atualiza; "configurações antigas" tornam-se silenciosamente erradas com o tempo. Compare a exportação JSON do painel com a sua última cópia conhecida-boa.
Próximos passos
Execute um varrimento do FixVibe contra a sua URL de produção — a verificação baas.clerk-auth0 sinaliza chaves publicáveis do Clerk, chaves de teste em produção e chaves secretas no bundle. Para o checklist equivalente no Auth0, veja Checklist de segurança Auth0. Para a visão geral sobre fornecedores BaaS, leia Scanner de configurações incorretas de BaaS.
