guias
Segurança

LGPD para Devs

O mínimo que todo desenvolvedor brasileiro precisa saber sobre LGPD.

A Lei Geral de Proteção de Dados (Lei 13.709/2018) se aplica a todo app que coleta dados de brasileiros. Este guia cobre o que você precisa implementar.

O que é dado pessoal?

Qualquer informação que identifica ou pode identificar uma pessoa:

  • Nome, email, telefone, CPF
  • Endereço IP
  • Cookies de identificação
  • Dados de localização
  • Fotos e biometria

Se seu app coleta email de usuários, a LGPD se aplica a você.

O mínimo que você precisa

1. Página de Política de Privacidade

Todo app precisa de uma política de privacidade acessível. Ela deve explicar:

  • Quais dados você coleta
  • Por que coleta
  • Como usa
  • Com quem compartilha
  • Como o usuário pode deletar seus dados

2. Consentimento

O usuário precisa concordar antes de você coletar dados:

// ❌ Coletar sem perguntar
<form onSubmit={handleSubmit}>
  <input name="email" />
  <button>Enviar</button>
</form>
 
// ✅ Com checkbox de consentimento
<form onSubmit={handleSubmit}>
  <input name="email" />
  <label>
    <input type="checkbox" required name="consent" />
    Li e aceito a <a href="/privacidade">Política de Privacidade</a>
  </label>
  <button>Enviar</button>
</form>

Salve o consentimento com timestamp:

await db.user.create({
  data: {
    email,
    consentAt: new Date(),
    consentVersion: "1.0",
  },
});

3. Direito de exclusão

O usuário tem direito de pedir que seus dados sejam deletados. Implemente uma forma de fazer isso:

// API para deletar conta
export async function DELETE(req: Request) {
  const session = await getServerSession();
  if (!session) return Response.json({ error: "Não autorizado" }, { status: 401 });
 
  // Deletar todos os dados do usuário
  await db.post.deleteMany({ where: { authorId: session.user.id } });
  await db.user.delete({ where: { id: session.user.id } });
 
  return Response.json({ message: "Conta e dados excluídos" });
}

4. Direito de acesso

O usuário pode pedir uma cópia dos seus dados:

// API para exportar dados
export async function GET(req: Request) {
  const session = await getServerSession();
  if (!session) return Response.json({ error: "Não autorizado" }, { status: 401 });
 
  const user = await db.user.findUnique({
    where: { id: session.user.id },
    include: { posts: true, comments: true },
  });
 
  return Response.json(user);
}

Cookies

Se você usa cookies (analytics, sessão, etc.), precisa informar o usuário:

"use client"
import { useState, useEffect } from "react"
 
export function CookieBanner() {
  const [show, setShow] = useState(false)
 
  useEffect(() => {
    if (!localStorage.getItem("cookie-consent")) {
      setShow(true)
    }
  }, [])
 
  function accept() {
    localStorage.setItem("cookie-consent", "true")
    setShow(false)
    // Inicializar analytics aqui
  }
 
  if (!show) return null
 
  return (
    <div className="cookie-banner">
      <p>Usamos cookies para melhorar sua experiência.</p>
      <a href="/privacidade">Saiba mais</a>
      <button onClick={accept}>Aceitar</button>
    </div>
  )
}

Nota: Cookies essenciais (sessão, autenticação) não precisam de consentimento. Apenas cookies de tracking/analytics.

Analytics respeitando privacidade

Alternativas ao Google Analytics que respeitam a LGPD:

  • Plausible — Sem cookies, LGPD-compliant por padrão
  • Umami — Open-source, sem cookies
  • Vercel Analytics — Privacy-friendly
// Plausible — sem banner de cookies necessário
<script defer data-domain="meuapp.com" src="https://plausible.io/js/script.js" />

Armazenamento seguro

Criptografar dados sensíveis

import { createCipheriv, createDecipheriv, randomBytes } from "crypto";
 
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY!; // 32 bytes
const ALGORITHM = "aes-256-gcm";
 
export function encrypt(text: string): string {
  const iv = randomBytes(16);
  const cipher = createCipheriv(ALGORITHM, Buffer.from(ENCRYPTION_KEY, "hex"), iv);
  let encrypted = cipher.update(text, "utf8", "hex");
  encrypted += cipher.final("hex");
  const tag = cipher.getAuthTag().toString("hex");
  return `${iv.toString("hex")}:${tag}:${encrypted}`;
}
# Gerar chave de criptografia
openssl rand -hex 32
 
veloz env set ENCRYPTION_KEY=a1b2c3...

Dados que devem ser criptografados

  • CPF, RG, documentos
  • Dados bancários
  • Dados de saúde
  • Endereço completo

Dados que NÃO precisam ser criptografados

  • Nome de exibição
  • Email (mas deve ser protegido)
  • Preferências do app

Retenção de dados

Não guarde dados para sempre. Defina políticas de retenção:

// Cron job para limpar dados antigos
async function cleanOldData() {
  const oneYearAgo = new Date();
  oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);
 
  // Deletar contas inativas há mais de 1 ano
  await db.user.deleteMany({
    where: { lastLoginAt: { lt: oneYearAgo } },
  });
 
  // Deletar logs antigos
  await db.log.deleteMany({
    where: { createdAt: { lt: oneYearAgo } },
  });
}

Checklist LGPD

  • Política de Privacidade publicada e acessível
  • Consentimento antes de coletar dados (checkbox + timestamp)
  • Funcionalidade de deletar conta e dados
  • Funcionalidade de exportar dados do usuário
  • Banner de cookies (se usar analytics com cookies)
  • Dados sensíveis criptografados
  • Política de retenção definida
  • Dados armazenados no Brasil ou com base legal para transferência

A Veloz e a LGPD

A Veloz facilita a compliance:

  • Servidores no Brasil — Dados ficam em território nacional
  • Criptografia — TLS 1.3 em trânsito, AES-256 em repouso
  • Política de dados — Exclusão completa em até 30 dias
  • DPO designadodpo@onveloz.com

Veja: Política de Privacidade e Política de Dados

Próximos passos