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:
Banner de cookies (se usar analytics)
"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 designado — dpo@onveloz.com
Veja: Política de Privacidade e Política de Dados
Próximos passos
- Variáveis de Ambiente Seguras — Proteger secrets
- Autenticação Segura — Login correto
- Proteção de API — Rate limiting e validação