11 — Privacidad y seguridad — VOLTA
1. Contexto
VOLTA trata datos de contacto y preferencias de clase de visitantes (PII ligera) y credenciales del coach.
Alcance L1 demo: no es un DPIA formal; documenta decisiones de diseño y controles implementados.
2. Datos tratados
| Dato | Entidad | Sensibilidad | Base demo |
|---|
| Nombre completo | ClassRequest | PII | Consentimiento implícito al enviar form [DECISIÓN demo] |
| Email | ClassRequest / User | PII | Igual |
| Teléfono | ClassRequest | PII | Opcional |
| Preferencias clase/día/franja | ClassRequest | Baja | Necesarias al servicio |
| Notas | ClassRequest | Variable | Texto libre del visitante |
| Password | User | Secreto | Solo hash bcrypt |
| JWT | Cliente | Sesión | localStorage (demo) |
3. Superficies de exposición
| Superficie | Riesgo | Control v1 |
|---|
| POST /api/requests | Spam / PII entrada | Validación DTO; rate-limit futuro |
| GET /api/requests | Filtración lista PII | JwtAuthGuard obligatorio |
| GET /api/requests/:id | PII individual | JWT |
| PATCH status | Abuso de estado | JWT |
| Login | Fuerza bruta | bcrypt; rate-limit futuro |
| localStorage token | XSS robo sesión | App trusted demo; CSP futuro |
4. Controles de seguridad implementados
| Control | Estado |
|---|
| Passwords hasheados bcrypt | Sí |
JWT firmado con JWT_SECRET | Sí |
| Rutas coach protegidas | Sí |
| Create público solo POST | Sí |
| Password en respuestas | No (nunca) |
| HTTPS en producción | Recomendado (Neon + host) |
| CORS restringido prod | Configurar al desplegar |
5. Autorización
| Actor | Puede |
|---|
| Anónimo | POST request; ver páginas públicas |
| COACH autenticado | Listar, ver detalle, cambiar status |
| Sin rol MEMBER | No existe en v1 |
6. Privacidad (RGPD — orientación)
| Principio | Aplicación v1 |
|---|
| Minimización | Campos justos para contactar y preferir clase |
| Limitación finalidad | Gestión de plazas del club |
| Conservación | Demo seed; política de borrado no automatizada |
| Derechos ARCO/RGPD | Proceso manual fuera de app |
| Transparencia | Mejorable: enlace política L1+ |
| Consentimiento kids | Notas “hija 8 años” en seed = ejemplo; en prod se requeriría base legal parental [HIPÓTESIS legal] |
No se afirma cumplimiento RGPD certificado. Es un mapa de riesgos para el case.
7. Amenazas y mitigaciones
| Amenaza | Impacto | Mitigación |
|---|
| Enumeración de inbox sin auth | Alto | Guard JWT |
| Spam de solicitudes | Medio | Validación; captcha L1+ |
| Token en localStorage | Medio | Demo; HttpOnly cookie L2 |
| Secret débil JWT | Alto | Env no commitear |
| Notas con datos sensibles | Medio | Copy: evitar datos médicos |
| Credenciales demo públicas | Bajo (demo) | Documentadas a propósito |
8. Logging y secretos
| Regla |
|---|
| No loguear passwords ni tokens completos |
DATABASE_URL y JWT_SECRET solo en .env |
| Seed password solo en docs de demo |
9. Checklist de seguridad demo
| # | Check |
|---|
| S1 | GET /api/requests sin header → 401 |
| S2 | PATCH sin header → 401 |
| S3 | Login password incorrecto → 401 |
| S4 | Password no en JSON de user |
| S5 | .env no en git |
10. Evolución recomendada (no deuda L1)
- Rate limiting + captcha en POST público
- Consent checkbox + política de privacidad
- Rotación JWT / refresh
- Soft-delete y retención configurable
- Audit log de cambios de status