Front End

27 mar, 2026

Segurança no Front-end: o que quase ninguém leva a sério

Publicidade

Segurança em front-end é aquele tipo de assunto ignorado… até o dia que vira incidente.

E quando vira, não é bug pequeno. É vazamento de dados, sequestro de sessão e execução de código malicioso.

E o pior: muitas dessas falhas nascem no próprio front-end.

Se você quer atuar em nível sênior, precisa entender isso de verdade.

O erro mais comum: “segurança é só backend”

Não é.

O front-end é a porta de entrada.

Se ele permite comportamento inseguro, o backend sofre.

XSS (Cross-Site Scripting): o clássico que continua atual

XSS acontece quando você executa código vindo do usuário.

Exemplo real vulnerável

function Comment({ text }) {
  return (
    <div dangerouslySetInnerHTML={{ __html: text }} />
  );
}

Se alguém enviar:

<script>alert('hackeado')</script>

👉 esse script será executado no navegador de outros usuários

Versão segura

function Comment({ text }) {
  return <div>{text}</div>;
}

O React escapa automaticamente.

Caso você precise renderizar HTML

Use sanitização.

import DOMPurify from 'dompurify';

function SafeComment({ html }) {
  const clean = DOMPurify.sanitize(html);

  return <div dangerouslySetInnerHTML={{ __html: clean }} />;
}

Regra de ouro

👉 nunca confie em input do usuário
👉 nunca renderize HTML sem sanitizar

CSRF (Cross-Site Request Forgery): ataques invisíveis

Aqui o atacante não injeta código.

Ele engana o navegador do usuário.

Cenário clássico

Usuário logado no seu sistema.

Abre outro site malicioso.

Esse site faz:

<img src="https://seusistema.com/api/delete-account" />

Se sua API aceita cookies automaticamente…

👉 ação executada sem o usuário saber

Proteção contra CSRF

1. Usar tokens CSRF

// backend envia token
<meta name="csrf-token" content="abc123" />
// frontend envia junto
fetch('/api/action', {
  method: 'POST',
  headers: {
    'X-CSRF-Token': token,
  },
});

2. SameSite cookies

No backend:

Set-Cookie: session=abc; SameSite=Strict;

👉 impede envio automático em requisições cross-site

Clickjacking: o ataque invisível

Usuário acha que está clicando em algo…

Mas está clicando em outra coisa por trás.

Exemplo de ataque

Seu site é carregado dentro de um iframe invisível.

Usuário clica em “Play”…

👉 mas na verdade clicou em “Transferir dinheiro”.

Proteção

No backend:

X-Frame-Options: DENY

ou

Content-Security-Policy: frame-ancestors 'none';

Armazenamento de tokens: onde muita gente erra

Esse aqui é crítico.

❌ localStorage (perigoso)

localStorage.setItem('token', jwt);

Se houver XSS:

👉 token é roubado facilmente

❌ sessionStorage (mesmo problema)

Ainda vulnerável a XSS.

✅ Cookies HttpOnly (mais seguro)

No backend:

Set-Cookie: token=abc; HttpOnly; Secure; SameSite=Strict;

Agora:

  • JS não acessa o token
  • reduz impacto de XSS

Trade-off real

Cookies:

  • protegem contra XSS
  • exigem proteção contra CSRF

👉 segurança sempre é equilíbrio

SPA vs SSR: muda a superfície de ataque

Arquitetura impacta diretamente segurança.

SPA (Single Page Application)

Exemplo com React.

Riscos

  • token exposto no client
  • dependência forte de JS
  • maior superfície para XSS

Exemplo típico

fetch('/api/user', {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

👉 token precisa existir no front

SSR (Server-Side Rendering)

Exemplo com Next.js.

Vantagens

  • menos exposição de token
  • lógica sensível pode ficar no servidor

Exemplo

// server component
export async function getUser() {
  const res = await fetch('https://api', {
    headers: {
      cookie: 'session=abc',
    },
  });

  return res.json();
}

👉 token nunca chega ao client

Content Security Policy (CSP): defesa avançada

CSP reduz impacto de XSS.

Exemplo real

Content-Security-Policy:
  default-src 'self';
  script-src 'self';
  object-src 'none';

👉 impede execução de scripts externos maliciosos

Checklist prático (nível produção)

Se você quer subir o nível do seu front:

  • não usar dangerouslySetInnerHTML sem sanitizar
  • usar cookies HttpOnly para tokens
  • implementar proteção contra CSRF
  • bloquear iframes (clickjacking)
  • configurar CSP
  • validar e escapar inputs

O erro mais perigoso

Achar que “nunca vai acontecer”.

Segurança não falha de forma gradual.

Ela falha de uma vez.

E quando falha:

👉 o impacto é grande
👉 o custo é alto
👉 a confiança vai embora

Conclusão: segurança não é feature, é base

Você pode ter:

  • performance incrível
  • UI perfeita
  • arquitetura elegante

Mas sem segurança…

👉 tudo isso não importa

No fim:

👉 júnior foca em funcionalidade
👉 sênior protege o sistema