Skip to content
Usuario

Reverse Proxy, TLS y Dominios

No hay configuracion real de Nginx, Caddy, Apache, Docker o load balancer en los repos inspeccionados. Esta pagina define requisitos y un ejemplo de referencia, no una configuracion final.

Frontend: https://app.<dominio>
API: https://api.<dominio>
Docs: https://docs.<dominio> opcional

app.<dominio> y api.<dominio> son same-site si comparten dominio raiz. En esa topologia, SameSite=Lax es recomendado. Si el frontend y la API viven en dominios raiz distintos, se vuelve cross-site y se necesita SameSite=None; Secure con CSRF y Origin/Referer estrictos.

Produccion debe cumplir:

  • Certificado TLS valido para app.<dominio> y api.<dominio>.
  • Renovacion automatizada y monitoreada.
  • Redireccion HTTP -> HTTPS.
  • AUTH_COOKIE_SECURE=true.
  • HSTS despues de validar dominios y rollback.
  • No mezclar contenido HTTP en el frontend.
  • API no expuesta por HTTP publico.

Antes de activar HSTS, confirma que:

  • Certificados se renuevan.
  • No hay subdominios dependientes de HTTP.
  • Rollback DNS/proxy esta documentado.
  • Soporte sabe que el navegador recordara HTTPS.

El proxy debe preservar o fijar:

HeaderMotivo
HostRuteo y auditoria.
X-Forwarded-HostDiagnostico detras de proxy.
X-Forwarded-ProtoSaber si la request original fue HTTPS.
X-Forwarded-ForIP cliente para logs/rate limit.
X-Real-IPAlternativa de IP cliente si el proxy la usa.

Configura EXPRESS_TRUST_PROXY de forma estricta si el backend depende de IP/proto proxy. No uses true amplio sin entender la cadena de proxies.

No cachear:

  • /api/auth/*
  • Cualquier endpoint con cookies auth.
  • Respuestas con datos clinicos/personales.
  • Errores de auth 401, 403, 429.

Puede cachearse con cuidado:

  • Assets estaticos con hash del frontend.
  • Docs publicas si no contienen secretos.

No registrar:

  • Header Cookie completo.
  • Header Authorization.
  • Body de login/reset/password.
  • CSRF token completo.
  • Tokens publicos completos de firma.

Registrar de forma segura:

  • Metodo.
  • Ruta sanitizada.
  • Status.
  • Latencia.
  • Origin.
  • IP normalizada.
  • User agent.
  • Request ID si existe.
ControlRecomendacion inicial
Body sizeAlinear con backend; src/index.js usa limites altos (50mb y 90mb). Reducir por ruta si se puede.
Request timeoutDefinir por tipo: auth corto, uploads mas largo.
Keep-aliveControlado por proxy.
CompressionUsar para assets/texto; no comprimir respuestas sensibles si hay riesgo de side channel.
Rate limitAplicar especialmente a auth, OTP, reset y public signature.

Este ejemplo no fue encontrado en repo. Adaptalo al proveedor real y revisalo antes de usar.

server {
listen 80;
server_name app.<dominio> api.<dominio>;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name api.<dominio>;
ssl_certificate /etc/letsencrypt/live/api.<dominio>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.<dominio>/privkey.pem;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://127.0.0.1:3009;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
client_max_body_size 50m;
}
}
server {
listen 443 ssl http2;
server_name app.<dominio>;
root /var/www/medsync-front/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location = /index.html {
add_header Cache-Control "no-store";
}
}
  • DNS apunta a la infraestructura correcta.
  • TLS A/AAAA y SNI funcionan.
  • HTTP redirige a HTTPS.
  • Certificado cubre nombres reales.
  • Proxy no registra cookies completas.
  • api.<dominio> responde preflight CORS permitido.
  • Origen no permitido no recibe Access-Control-Allow-Credentials.
  • app.<dominio> carga assets y fallback SPA.
  • No hay mixed content.
  • EXPRESS_TRUST_PROXY coincide con topologia real.