1. 401 vs 403
401 Unauthorized: falta autenticação válida (token/sessão). 403 Forbidden: identidade conhecida (ou anônima), mas sem permissão para a ação.
2. Onde investigar
- Roles/ACL no backend (admin vs user)
- Regras de WAF / Cloudflare / mod_security
- Permissões de filesystem do user do Nginx
- Bloqueio por referer / hotlink
namei -l /var/www/app/public
ps aux | grep nginx
# logs da app: “permission denied” / “forbidden”
3. Checklist de API
- Token válido mas escopo insuficiente?
- Recurso de outro tenant (IDOR)?
- Método HTTP permitido na rota?
O caso que confunde todo mundo: 403 num recurso público
403 em página que deveria ser pública geralmente não é bug de permissão de usuário — é regra de WAF/CDN (Cloudflare, AWS WAF) bloqueando por IP, user-agent ou geolocalização antes mesmo de chegar no seu backend. Teste com curl -A "Mozilla/5.0..." de outra rede antes de mexer em código de autorização.
- Se o mesmo usuário funciona em uma rota e recebe 403 em outra, o problema é granularidade de permissão (RBAC), não autenticação
- Nginx/Apache com
.htaccessou regra de IP mal configurada também devolve 403 direto do servidor web, sem nem acionar a aplicação