Toys R Us Cloudflare Server Startup
Estrategia de Caching · toysrus.es · Marzo 2026

Estrategia de Caching
toysrus.es

Análisis técnico de cacheabilidad de páginas de producto y categoría
sobre SAP Commerce Cloud (Hybris) + Cloudflare CDN

~julio.arguello · Server Startup · Marzo 2026
01

El problema

0%
Cache Hit (HTML)
~180ms
Origin TTFB
DYNAMIC
CF-Cache-Status
Hybris responde Cache-Control: no-cache, no-store + Set-Cookie en TODAS las páginas.
Cloudflare no cachea nada → cada request va directo al origen.
Pero el contenido del producto es 100% idéntico entre sesiones.
Solo cambian tokens de seguridad (CSRF) y nonces de Cloudflare.
Nota: >180 ms es un buen TTFB; cacheado en edge: <30 ms. El valor principal está en el traffic offloading.
02
Reto 1

Detectar sesiones
anónimas vs autenticadas

Solo se pueden cachear responses de sesiones anónimas.
Si está logado, el HTML puede contener datos personalizados.

02

Cookies de autenticación

Cookie Auth Fiabilidad Contenido
acceleratorSecureGUID Máxima Token anti-CSRF de sesión Hybris
toysrusstorefrontRememberMe Muy alta Email (Base64) + timestamp + hash
JSESSIONID ⚠️ Insuficiente Existe en ambos estados
Criterio: Logada identificada como anónima → CRÍTICO. Anónima como logada → solo cache miss.
⚠️ Pendiente de validación: Debe ser refrendado por el equipo Hybris.
# Cloudflare expression — solo cachear anónimos
NOT (http.cookie contains "acceleratorSecureGUID"
 OR  http.cookie contains "toysrusstorefrontRememberMe")
02

Navegación pública vs privada

🔓 Anónimo

Homepage pública

Header: "MI CUENTA"

🔐 Autenticado

Homepage privada

Header: "JULIO"

03
Reto 2

Headers que
bloquean cache

Hybris emite triple bloqueo en cada response:
Cache-Control + Set-Cookie + Pragma

03

Triple bloqueo + solución

# ❌ Triple bloqueo
Cache-Control: no-cache, no-store,
               max-age=0, must-revalidate
Pragma: no-cache
Expires: 0

# ❌ Set-Cookie en CADA response
Set-Cookie: anonymous-consents=...;
Set-Cookie: JSESSIONID=Y6-{uuid};
Set-Cookie: ROUTE=.accstorefront-{pod};

# ❌ Cloudflare no cachea
CF-Cache-Status: DYNAMIC

Solución Cloudflare

Cache Rule
Edge TTL override → ignora no-store
Transform Rule #1
Stripear Set-Cookie en paths cacheados
Transform Rule #2
Eliminar Vary: User-Agent
Edge TTL de CF sobreescribe Cache-Control del origen — documentado oficialmente.
04
Reto 3

Política de
Invalidación

Los TTL y la estrategia de purgado determinan cuánto tiempo puede un cliente ver contenido desactualizado.
Es una decisión de negocio, no solo técnica.

04

Política de invalidación

Tipo de página TTL sugerido Purgado Justificación
Home 5 – 15 min Purge on publish Rotación frecuente de banners y promos
PDP (producto) 1 – 4 h Purge on stock/price change Precio y stock son los datos más sensibles
Grid (categoría) 30 min – 2 h Purge on catalog update Nuevo producto o cambio de orden afecta la grid
Estáticos (CSS/JS/img) 30 días+ Versionado (hash) Inmutables si el nombre cambia con cada deploy
⚠️ El TTL es un trade-off: más TTL = más ahorro y velocidad, pero mayor ventana de contenido stale.
Purgado selectivo: Cloudflare permite purge por URL, tag o prefijo.
⚠️ Caché distribuida: Cada data center mantiene su propia caché de forma independiente.
05
🔴 Reto principal

CSRFToken
incrustado en HTML

Hybris inyecta tokens CSRF en <input hidden> dentro de forms.
Si cacheamos: todos reciben el mismo token → acciones rotas.

04

Impacto por tipo de página

PDP (ficha producto)

8
CSRFToken inputs

add-to-cart, wishlist, pickup, notify

Grid (categoría)

45
CSRFToken inputs

add-to-cart × producto, wishlist × prod.
96 forms en total

Si cacheamos: CSRFToken compartido → Hybris rechaza POST → add-to-cart roto
Positivo: Solo cambian CSRFToken + CF nonce. Contenido (precios, stock) idéntico al 100%.
05

Solución recomendada

✓ Recomendada

Lazy CSRF (Hybris)

Endpoint AJAX en Hybris + JS que actualiza tokens

Solución limpia y estándar
~20 líneas controller Spring
Funciona con 100% de forms
Requiere cambio en Hybris
Alternativa

Worker + HTMLRewriter

CF Worker reescribe tokens en streaming

No toca Hybris
Token siempre fresco
Mayor complejidad operativa
Coste Workers (por request)
No recomendada

Desactivar CSRF

Quitar CSRF Hybris + WAF como compensación

HTML 100% cacheable
Vulnerable a CSRF attacks
NO viable en checkout
Recomendación: Endpoint /ajax/csrf-token en Hybris + snippet JS client-side. Solución más segura y mantenible.
05

Flujo: Lazy CSRF

👤 Request
☁️ CF Edge
Cache HIT
📄 HTML (stale CSRF)
⚡ JS fetch
/ajax/csrf-token
✅ Forms OK
// Snippet JS (inyectable vía Cloudflare o Hybris template)
document.addEventListener('DOMContentLoaded', () => {
  fetch('/ajax/csrf-token', { credentials: 'include' })
    .then(r => r.json())
    .then(({ token }) => {
      document.querySelectorAll('input[name="CSRFToken"]')
        .forEach(el => el.value = token);
    });
});

// Controller Hybris (~20 líneas)
@Controller
public class CsrfTokenController {
    @GetMapping("/ajax/csrf-token")
    @ResponseBody
    public Map<String, String> getToken(HttpServletRequest req) {
        CsrfToken csrf = (CsrfToken) req.getAttribute("_csrf");
        return Map.of("token", csrf.getToken());
    }
}
06

Arquitectura

👤 Anónimo → CACHE

  • Sin acceleratorSecureGUID
  • Edge Cache con TTL 1h
  • Strip Set-Cookie en response
  • JS pide CSRF fresco al load
  • TTFB: ~20ms

🔐 Logado → BYPASS

  • Cookie de autenticación presente
  • Proxy directo a Hybris
  • HTML con datos personalizados
  • CSRF nativo de sesión
  • TTFB: ~180ms
✅ Paths cacheables: /*/p/* (PDP) · /*/c/* (grids) · / (home)
🚫 Excluidos del cache: /checkout/* · /my-account/* · /login · /cart
08

Roadmap

Fase Acción Responsable Dificultad Riesgo
FASE 0 PoC Cache Rules + Strip Set-Cookie + Skip auth Server Startup Baja Medio
FASE 1a Endpoint CSRF /ajax/csrf-token Equipo Hybris Media Alto
FASE 1b Snippet JS para refresh de tokens post-cache Equipo Hybris Media Alto
FASE 2 Monitoring: Cache Analytics + alertas hit ratio Server Startup Media Bajo
Fase 0 ejecutable en ~1 día. Proporciona datos reales del cache hit ratio.
09

Propuesta económica

PoC — Fase 0 · Cortesía Server Startup
~2 J
esfuerzo estimado, incluido sin coste
› Configuración de Cache Rules en Cloudflare
› Configuración de Transform Rules (Strip Set-Cookie, Vary)
› Bypass de usuarios autenticados
› Validación funcional básica
Esta actuación no está incluida en el contrato de suscripción.
Server Startup = 0 desarrollo. Solo configuración.
09

Consideraciones

⚠️ Análisis NO vinculante

Este análisis se basa en la observación del comportamiento actual del storefront de toysrus.es en el momento de la prueba. Durante la ejecución de la Prueba de Concepto podrían aparecer impedimentos no detectados, por ejemplo:
› Contenido dinámico no identificado
› Diferencias entre entornos
› Interacciones con tracking/terceros
› Formularios CSRF no analizados
› Impacto transversal del CSRF
Metodología: curl sin cookies + navegador automatizado, comparando headers y HTML en sesiones independientes.

¿Preguntas?

Análisis técnico con grabaciones de navegador,
diffs de HTTP/HTML, y configuración Cloudflare detallada.

~julio.arguello · Server Startup
[email protected]
navegar · F fullscreen