11 — Privacidad y seguridad — RELE
1. Alcance
Vertical slice L2 con datos de consumo doméstico, identidad de usuario y CUPS de demo. Documento de decisiones de producto/seguridad, no dictamen legal.
2. Datos tratados
| Dato | Categoría | Dónde | Quién accede |
|---|
| email, name | PII | User | self; advisor ve resident en list |
| passwordHash | secreto | User | nadie vía API |
| JWT | credencial | cliente + server | portador |
| address, cups | identificador hogar | Home | resident + advisor en scope |
| period, kwh, costEur | consumo / económico | Reading | scope por rol |
| notes, advisorNote | contenido libre | Reading | scope por rol |
3. Roles y autorización
| Acción | RESIDENT | ADVISOR |
|---|
| Ver propias lecturas | Sí | — |
| Ver todas (demo) | No | Sí |
| Crear lectura | Sí | No (403) |
| Patch status | No (403) | Sí |
| Ver lectura ajena | No (403) | Sí |
Autoridad: NestJS JwtAuthGuard + checks en ReadingsService.
UI: oculta botones; no sustituye al server.
4. Autenticación
| Aspecto | Implementación |
|---|
| Método | Email + password |
| Hash | bcrypt (seed y login) |
| Token | JWT Bearer accessToken |
| Storage cliente | localStorage keys rele_token, rele_user |
| Transporte | HTTPS en producción (requerido al desplegar) |
Riesgos localStorage [SUPUESTO de amenaza]
| Riesgo | Mitigación v1 | L2+ |
|---|
| XSS roba token | No HTML user raw; Angular escape default | CSP, httpOnly cookie |
| Token largo | Secret fuerte en env | Expiry corto + refresh |
5. Superficie API
| Endpoint | Auth | Notas |
|---|
| POST /api/auth/login | Público | Rate limit futuro |
| GET/POST/PATCH readings* | JWT | Validación DTO |
- Prefijo
/api.
ValidationPipe whitelist + transform.
- CORS
origin: true en dev; restringir en prod.
6. Secretos y configuración
| Secreto | Ubicación correcta |
|---|
DATABASE_URL | .env local / secret host |
JWT_SECRET | .env / secret host |
| Passwords demo | Solo docs de demo, no prod real |
Nunca commitear .env con credenciales Neon reales en repos públicos sin rotación.
7. Privacidad por diseño (v1)
| Principio | Aplicación |
|---|
| Minimización | No DNI, no IBAN, no geolocalización |
| Limitación finalidad | Lecturas y revisión; no ads |
| Transparencia demo | Cuentas demo visibles en login |
| Separación roles | 403 cross-action |
8. CUPS y datos energéticos
El CUPS identifica el punto de suministro. En demo es ficticio/seed.
| Buena práctica | v1 |
|---|
| No exponer listados públicos de CUPS | JWT required |
| No loguear bodies con PII en prod | console mínimo |
| Soft-delete | No; hard data en demo |
9. Amenazas y mitigaciones
| Amenaza | Impacto | Mitigación |
|---|
| Credenciales débiles demo | Alto en prod real | Solo entorno demo; password123 documentado |
| IDOR lectura | Medio | check residentId en get |
| Escalada rol en JWT | Alto | role firmado en token; no confiar en body |
| Spam create | Medio | JWT + validación; rate limit L2+ |
| Inyección | Medio | Prisma parametrizado |
10. Cumplimiento (orientación, no legal advice)
| Tema | Nota |
|---|
| RGPD | Base demo; en producto real: base legal, derechos ARCO, DPA con Neon |
| Cookies | v1 localStorage no cookie banner; reevaluar si analytics |
| Menores | No target |
11. Logging y auditoría
| Evento | v1 | Futuro |
|---|
| Login fail | HTTP 401 | contador / alert |
| Patch status | DB updatedAt + advisorId | audit log |
| Export | No | CSV con authz |
12. Checklist seguridad cierre
13. Incidente demo (procedimiento mínimo)
- Rotar
JWT_SECRET y forzar re-login.
- Rotar password hashes de seed.
- Revisar Neon access.
- Documentar en registry si aplica.