Muitos aplicativos feitos em React Native deixam a segurança de lado. O resultado? Apps cheios de falhas básicas, que podem ser exploradas facilmente. Trabalhando com apps reais, encontrei problemas que vão do simples descuido à prática arriscada:
- Uso de AsyncStorage para informações confidenciais - Guardar API Keys ou tokens de autenticação no AsyncStorage é como anotar sua senha num post-it e deixar na tela. AsyncStorage não foi feito para segredos.
- Exposição de dados desnecessários no client - Muitos apps carregam dados que o usuário não precisa ver, aumentando a superfície de ataque.
- console.log revelando informações sensíveis - Logs de tokens, dados de requisição ou erros da API nunca devem ir para produção.
- Desativar HTTPS para endpoints HTTP - Sem HTTPS, qualquer invasor pode interceptar o tráfego e roubar informações.
- Tokens e chaves sem expiração - Um token que nunca expira é como uma chave que abre sua casa para sempre. Se vazado, o invasor terá acesso indefinido.
- Excesso de lógica no client - Regras críticas de negócio no client podem ser manipuladas. Quem decide se uma ação é válida deve ser sempre o servidor.
- Validações incorretas de inputs - O client nunca deve ser o responsável final pela validação. Sem validação no servidor, qualquer payload manipulado pode causar problemas.
E por aí vai...
Por que isso acontece?
Na maioria das vezes, não é questão de má-fé ou falta de vontade. Um dos problemas é pressa de entrega ou o famoso "depois a gente vê". A consequência é que o client se torna uma bomba-relógio: pequenas falhas se acumulam e, mais cedo ou mais tarde, podem ser exploradas, causando danos ao usuário e à empresa.
Nesse artigo, pretendo abordar algumas boas práticas e perguntas que já vi cair em entrevistas para segurança em aplicativos RN. Mesmo sendo híbrido, ainda podemos usar métodos nativos para reforçar a segurança.
Checklist essencial de segurança em React Native
Para não deixar seu app vulnerável, preste atenção a esses pontos:
- Armazenamento seguro: use Keychain (iOS) ou Keystore (Android), nunca AsyncStorage para segredos.
- Comunicação segura: HTTPS obrigatório, com validação de certificados.
- Logs limpos: nunca exponha dados sensíveis em
console.log. - Menos dados no client: carregue apenas o necessário. Dados críticos ficam no servidor.
- Tokens e chaves: sempre com expiração e mecanismo de revogação.
- Regras de negócio no servidor: o client envia requisições, mas não decide resultados críticos. É essencial manter o menor número de regras de negócio no lado do client.
- Validações no mobile: devem ser feitas no client para melhorar a experiência do usuário, mas o servidor deve ser sempre a autoridade final.
- Proteções adicionais: ofuscação de código, checagem de integridade e proteção contra engenharia reversa.
Assuntos avançados que caem em entrevistas
Se você quer se preparar para entrevistas em fintechs, bancos ou apps sensíveis, vale conhecer:
- OWASP Top 10: as dez falhas mais comuns em apps, incluindo mobile.
- SAST (Static Application Security Testing): análise de código sem rodar o app para identificar falhas.
- DAST (Dynamic Application Security Testing): testes com o app em execução simulando ataques reais.
- DexGuard / ixGuard: proteção de código contra engenharia reversa. DexGuard é para Android, ixGuard para iOS.
- SonarQube / SonarCloud: ferramentas que identificam problemas de segurança e qualidade no código.
- Segurança de comunicação e criptografia: Criptografia de dados sensíveis em trânsito e em repouso.
Conclusão
Segurança em React Native não é opcional. Ela deve estar presente em todas as etapas de desenvolvimento.
Um app inseguro não é apenas um bug: é um risco real para usuários e empresas. Se você quer trabalhar em fintechs, bancos ou qualquer app que lide com dados sensíveis, dominar essas práticas é obrigatório e você vai se tornar um excelente desenvolvedor mobile.
