# 11: Taxonomia Técnica de Dados Pessoais
> Mapa pragmático das **12 categorias canônicas** de dados pessoais que um app pode coletar. Pra dev marcar checkbox no inventário público + detectar no código + escolher base legal. Baseado em Apple App Privacy Details, Google Play Data Safety, Mozilla Lean Data, LGPD arts. 5º e 11.
## Como usar esta referência
Pra cada categoria, leia: **(a)** o que cai aqui, **(b)** como detectar no código (palavras-chave pra `rg`), **(c)** sensibilidade típica, **(d)** base legal default, **(e)** riscos, **(f)** como declarar, **(g)** como minimizar.
A skill cruza essa taxonomia com o código do projeto pra gerar o **inventário público** (ver `references/12-transparencia-radical.md`).
---
## 1. Dados de identidade e contato
**O que cai aqui:** nome, nome social, e-mail, telefone, endereço, CEP, CPF, RG, CNH, passaporte, data de nascimento, foto de perfil, login social.
**Detecção:**
- Schema: `name`, `email`, `phone`, `cpf`, `tax_id`, `birth_date`, `avatar_url`
- Form: ``, `inputmode="numeric"`, máscara CPF, `react-input-mask`, `brazilian-values`
- APIs: ViaCEP, Serpro Datavalid, Receita Federal CNPJ
- Login social: `next-auth` providers, Firebase Auth, Supabase Auth, Clerk
**Login social, granularidade:**
| Provider | Sempre exposto | Sob escopo extra | Risco |
|---|---|---|---|
| Google (OIDC) | `sub`, `email`, `name`, `picture`, `locale` | calendar, contacts, drive | Acesso a Gmail é high-risk |
| Apple Sign In | `sub`, `email` (real ou relay), `name` (só 1º login!) | - | Mais privacy-friendly |
| Facebook | `id`, `name`, `email` | friends, posts, location | `user_friends` raramente aprovado |
| GitHub | `id`, `login`, `avatar_url`, `email` | `repo`, organizations | Token de repo é poderoso |
| LinkedIn | `id`, `name`, `email`, `profile_url` | conexões, currículo | Dado profissional sensível em contexto |
- **Sensibilidade:** média. CPF merece atenção (não logar, não expor em URL).
- **Base legal:** execução de contrato (art. 7º V) pra essencial; consentimento (art. 7º I) pra opcionais.
- **Riscos:** spam, phishing, fraude com CPF, golpe de identidade.
- **Declarar:** "Identificação cadastral, nome, e-mail, telefone, CPF. Necessários pra emissão de NF / autenticação / atendimento."
- **Minimizar:** não pedir CPF se não emite NF; usar Apple Sign In relay; aceitar nome social; não expor e-mail em URL pública (use slug separado).
---
## 2. Dados de autenticação
**O que cai aqui:** senha (hash+salt), tokens (session, refresh, JWT, API key), 2FA TOTP, backup codes, magic links, biometria, passkeys.
**Detecção:**
- Tabelas: `users.password_hash`, `sessions`, `refresh_tokens`, `api_keys`, `totp_secrets`, `webauthn_credentials`, `recovery_codes`
- Libs: `bcrypt`, `argon2`, `scrypt`, `jose`, `jsonwebtoken`, `otplib`, `speakeasy`, `@simplewebauthn/server`
- Web: `navigator.credentials.create({publicKey})`, `.get`
- Mobile: `LocalAuthentication` (Expo), `BiometricPrompt`, `LAContext`
**Biometria, distinção crítica:**
- **Touch ID / Face ID nativos** NÃO expõem template ao app, só retornam `success`. **Não é coleta de biometria** legalmente; só "uso de biometria do dispositivo".
- **WebAuthn / Passkey** guarda chave pública; privado fica no Secure Enclave. **Não é biometria** legalmente.
- **App que captura foto pra liveness/KYC** (Caixa Tem, Open Finance), aí **SIM** coleta biometria **sensível** (LGPD art. 11), exige consentimento específico.
- **Sensibilidade:** crítica. Vazamento de hash+salt = brute-force offline; TOTP secret = bypass do 2FA.
- **Base legal:** execução de contrato + segurança (art. 7º X, proteção do crédito).
- **Riscos:** account takeover, lateral movement, fraude.
- **Declarar:** "Credenciais, armazenadas com hash criptográfico (argon2id). Tokens de sessão expiram em X."
- **Minimizar:** argon2id ou bcrypt cost ≥12; rotacionar refresh tokens; TTL curto; 2FA obrigatório em conta sensível; preferir passkey a senha.
---
## 3. Dados financeiros
**O que cai aqui:** PAN (número do cartão), CVV, validade, conta+agência, chave PIX, histórico de transações, valores, contrapartes, renda, score, perfil de consumo.
**Detecção:**
- Gateways: `stripe`, `mercadopago`, `pagar.me`, `iugu`, `asaas`, `pagseguro`
- Tabelas: `transactions`, `invoices`, `subscriptions`, `payment_methods`, `pix_keys`, `bank_accounts`
- Open Finance: Belvo, Pluggy, OAuth BCB
- Score: Serasa, Boa Vista, Quod APIs
**Regra de ouro PCI-DSS:** **NUNCA armazenar PAN+CVV.** Usa tokenização do gateway, guarda só `tok_visa_xxxx`, `last4`, `brand`, `exp_month`. Tocar em PAN cru = PCI-DSS Level 1-4 com auditoria anual.
- **Sensibilidade:** alta. Alvo preferido de incidente.
- **Base legal:** execução de contrato + obrigação legal (fiscal, 5 anos).
- **Riscos:** fraude, clonagem, golpe, perfilamento abusivo, score sem revisão = art. 20 LGPD.
- **Declarar:** "Pagamentos processados pelo [gateway, link política]. Armazenamos apenas últimos 4 dígitos e tipo de cartão. Histórico por 5 anos (Decreto 7.212/2010)."
- **Minimizar:** tokenização sempre; não logar webhook payload (vem com PAN); separar banco fiscal do operacional; agregar histórico antigo.
---
## 4. Identificadores de dispositivo e técnicos
A categoria mais sub-declarada por devs brasileiros. **Tudo aqui é PII** sob LGPD se permite re-identificação.
### 4.1 Rede
- IP (v4, v6), `req.headers['x-forwarded-for']`, `req.ip`
- ASN/ISP, derivável via MaxMind, IPinfo
### 4.2 User-Agent e Client Hints
- `User-Agent`, `Accept-Language`, `Sec-CH-UA`, `Sec-CH-UA-Platform`, `DNT`, `Sec-GPC`
### 4.3 IDs persistentes
- Web: cookie `_ga`, `_fbp`, `_gcl_au`, qualquer cookie persistente
- iOS: **IDFA** (App Tracking Transparency exige opt-in desde iOS 14.5), **IDFV** (por vendor, sem opt-in)
- Android: **AAID** (`com.google.android.gms.ads.identifier`), Android ID (`Settings.Secure.ANDROID_ID`)
- Push: APNs token, FCM token, OneSignal player ID
- MAC: bloqueado em iOS/Android modernos
### 4.4 Fingerprint passivo (browser)
- Canvas fingerprint (`canvas.toDataURL()`)
- WebGL renderer/vendor (`gl.getParameter(gl.RENDERER)`)
- AudioContext fingerprint (`OfflineAudioContext` + FFT)
- Fontes instaladas (medindo `offsetWidth`)
- Plugins, MIME types
- `screen.width/height`, `devicePixelRatio`, `colorDepth`
- `Intl.DateTimeFormat().resolvedOptions().timeZone`
- `navigator.language(s)`, `navigator.hardwareConcurrency`, `navigator.deviceMemory`
- `navigator.connection.effectiveType` (Network Information API)
- Battery API (deprecada), Permissions API state
**Detecção de libs:** `@fingerprintjs/fingerprintjs`, `clientjs`, `fingerprint2`, qualquer `canvas.toDataURL` sem motivo claro.
### 4.5 Storage persistente
- `localStorage`, `sessionStorage`, IndexedDB, Cache API, cookies, BroadcastChannel, Service Worker
- **Sensibilidade:** média individualmente, **alta combinada**. EFF Panopticlick, fingerprint identifica 1 em 286 mil.
- **Base legal:** legítimo interesse (analytics próprio essencial), consentimento (3rd party).
- **Riscos:** tracking cross-site sem opt-in, re-identificação pós-logout, perfilamento sem ciência.
- **Declarar:** "Identificadores técnicos: IP, user-agent, ID de dispositivo. Usados pra segurança e analytics agregado. Retidos por 90 dias em logs brutos, depois agregados."
- **Minimizar:** **truncar IP** (zerar último octeto /24 IPv4, /64 IPv6); IDFV em vez de IDFA; respeitar `Sec-GPC` e `DNT`; **NÃO** rodar FingerprintJS sem consentimento (App Store rejeita).
---
## 5. Geolocalização
**O que cai aqui:**
- GPS preciso (lat/lng < 100m)
- Geo aproximado (cidade, via IP)
- WiFi BSSIDs triangulados
- Bluetooth beacons (iBeacon, Eddystone)
- Declarada (CEP, cidade no cadastro)
- **Histórico de localizações**, sensível por inferência: revela casa, trabalho, médico, religião
**Detecção:**
- Web: `navigator.geolocation.getCurrentPosition`, `watchPosition`
- iOS: `CLLocationManager`, `requestWhenInUseAuthorization`, `requestAlwaysAuthorization` (**red flag**)
- Android: `FusedLocationProviderClient`, `ACCESS_FINE_LOCATION`, `ACCESS_BACKGROUND_LOCATION` (**red flag**)
- Server: MaxMind GeoIP, IPinfo, ipapi
- **Sensibilidade:** alta. Histórico de geo é **dado sensível por inferência** (templo = religião; hospital = saúde; sede de partido = política). ANPD/MPF já trataram como tal (caso Serasa, Hariexpress).
- **Base legal:** **consentimento específico** (art. 7º I + permissão SO). NUNCA legítimo interesse pra geo precisa contínua.
- **Riscos:** stalking, doxxing, dedução de hábitos íntimos, sequestro express.
- **Declarar:** "Localização precisa (GPS), apenas quando você toca em 'usar localização'. Não armazenada. Aproximada por IP, exibir conteúdo regional, X dias."
- **Minimizar:** pedir só quando essencial; preferir `requestWhenInUseAuthorization`; arredondar coordenadas (2 casas decimais ≈ 1km); NUNCA background location se não for app de delivery; oferecer CEP manual como alternativa.
---
## 6. Mídia e arquivos
**O que cai aqui:** fotos, vídeos, áudios, PDFs, planilhas, qualquer upload.
**Detecção:**
- ``, `accept="image/*"`
- Libs: `react-dropzone`, `multer`, `formidable`, `busboy`, `@uploadthing/react`
- Storage: S3, R2, Supabase Storage, Vercel Blob, Firebase Storage
**EXIF, o trap silencioso:** foto de celular traz `GPSLatitude/Longitude`, `Make`, `Model`, `Software`, `DateTimeOriginal`, `LensModel`. PDFs guardam `Author`, `Creator`, `Producer`, às vezes versões anteriores (bug histórico).
- **Sensibilidade:** variável. Selfie + EXIF = casa do titular. PDF com revisão = vazamento corporativo.
- **Base legal:** execução de contrato (fotolog), consentimento (perfil opcional).
- **Riscos:** doxxing por EXIF, vazamento de revisões PDF, deepfake, malware em PDF/SVG.
- **Declarar:** "Arquivos enviados, armazenados em [provider, região]. Metadados de localização (EXIF) removidos no upload."
- **Minimizar:** strip EXIF (`sharp().rotate().toBuffer()` já remove); redimensionar (não guarde 4K se exibe 800px); validar MIME server-side; sanitizar SVG (`DOMPurify`); antivírus (ClamAV em queue).
---
## 7. Conteúdo do usuário (UGC)
**O que cai aqui:** texto livre (posts, comentários, DMs, bios, reviews), reações, follows, listas, coleções.
**Detecção:** `