# 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:** `