Skip to content
Usuario

Arquitectura

MedSync se despliega como una aplicacion web: el usuario entra al frontend, el frontend llama a la API, la API consulta MySQL y se apoya en SMTP/storage cuando un flujo lo necesita.

Para autenticacion basada en cookies, la parte mas importante es esta: el browser no guarda tokens legibles. Las credenciales de sesion viajan en cookies HttpOnly; el frontend solo guarda estado de UI/runtime; y el backend decide si la sesion sigue viva.

ComponenteTecnologia observadaResponsabilidad
BrowserNavegador modernoRenderiza frontend, conserva cookies y ejecuta flujos clinicos.
FrontendVue 2 + Vue CLI, Vuetify, axiosUI de login, Super Admin, dashboard, pacientes, documentos y flujos clinicos.
Backend APINode.js + Express + Sequelize + MySQLAuth, sesiones, tenants, usuarios, pacientes, documentos, tratamientos, prescripciones y Super Admin.
Base de datosMySQL via mysql2 y sequelizePersistencia de tenants, usuarios, sesiones, refresh tokens, permisos y datos de negocio/clinicos.
SMTPNodemailer SMTPRecuperacion de password y correos transaccionales de firma/documentos si aplica.
StorageAWS S3/Cloudinary segun variables configuradasArchivos, imagenes, firmas, fotos, rayos X y perfiles cuando esos flujos esten activos.
Reverse proxy / LBNo hay config real en repoTermina TLS, enruta dominios, aplica limites/timeouts y protege headers.
ObservabilidadNo hay stack real definidoDebe recolectar logs backend, proxy, auth, CSRF, CORS, DB y alertas.
BackupsNo hay sistema real definidoRequisito infra antes de produccion.
flowchart LR
U[Browser] --> F[Frontend Vue app]
F --> RP[Reverse proxy / Load balancer]
RP --> API[Backend API Express]
API --> DB[(MySQL DB)]
API --> SMTP[SMTP provider]
API --> STORAGE[Object storage]
API --> LOGS[Logs / Monitoring]
DB --> BACKUP[(Encrypted backups)]
1. Browser carga https://app.<dominio>.
2. Frontend Vue pide CSRF y luego llama a https://api.<dominio>.
3. Browser adjunta cookies de autenticacion en requests a la API.
4. Backend valida cookie access, sesion activa, CSRF, CORS, rol, permisos y tenant.
5. Backend consulta MySQL y responde sin exponer tokens.
6. Logs y metricas registran status/ruta/latencia sin secretos.
7. Backups protegen DB/storage para restore.
Browser -> GET /api/auth/csrf
Browser -> POST /api/auth/login con X-CSRF-Token
API -> valida usuario/password/tenant
API -> crea session + refresh token v2
API -> Set-Cookie access/refresh HttpOnly
Frontend -> GET /api/auth/session
Frontend -> guarda usuario/rol/permisos en runtime
FronteraRiesgoControl minimo
Browser a frontendXSS, storage persistente, recursos insegurosCSP futuro, build con cookies, no tokens en storage, assets servidos por HTTPS.
Frontend a APICSRF, CORS, cookies enviadas a origen incorrectowithCredentials, CORS allowlist exacta, X-CSRF-Token, TLS.
API a DBCredenciales DB filtradas, privilegios excesivosUsuario DB minimo, secreto en secret manager, red privada, backups cifrados.
API a SMTPCredenciales SMTP filtradas, abuso de correoSecretos rotables, sandbox QA, rate limit, monitoreo de envio.
API a storageExposicion de archivos clinicosBuckets privados, credenciales separadas, URLs temporales si aplica.
Proxy a APISpoofing de host/proto/IPEXPRESS_TRUST_PROXY controlado, headers forward correctos, allowlist de red.
Frontend: https://app.<dominio>
API: https://api.<dominio>
Docs: https://docs.<dominio> opcional

Con app.<dominio> y api.<dominio> bajo el mismo dominio raiz, el navegador los trata como same-site. En esa topologia, SameSite=Lax es el default recomendado para cookies de autenticacion porque reduce exposicion cross-site y conserva UX razonable.

SameSite=None; Secure solo debe usarse si frontend y API son cross-site reales, por ejemplo dominios raiz distintos. Si se usa None, CSRF y Origin/Referer son aun mas criticos.

Las cookies __Host-medsync_at, __Host-medsync_rt y __Host-medsync_csrf son recomendadas para production-like cuando se puede operar con cookies host-only:

  • Deben usar Secure.
  • Deben usar Path=/.
  • No pueden definir Domain.

No uses AUTH_COOKIE_DOMAIN con cookies __Host-. Si infraestructura exige compartir cookies entre hosts mediante Domain, se pierde la propiedad __Host-; esa decision debe quedar aprobada por seguridad y documentada.

Local HTTP puede usar cookies sin __Host- y AUTH_COOKIE_SECURE=false solo para desarrollo. Esa configuracion no prueba seguridad final.

Production-like debe usar HTTPS, cookies Secure, CORS exacto, CSRF activo, secretos fuertes y REQUIRE_ACTIVE_SESSION=true.

Para la validacion production-like previa a produccion, la arquitectura minima aceptable es:

  • https://app.<dominio> sirve el frontend.
  • https://api.<dominio> sirve la API.
  • API y frontend comparten raiz de dominio para usar SameSite=Lax.
  • Cookies auth usan Secure, HttpOnly, Path=/ y preferiblemente __Host-*.
  • CORS solo permite https://app.<dominio>.
  • CSRF solo permite https://app.<dominio>.
  • Logs, backups y rollback estan listos antes de exponer usuarios reales.