Geração Dinâmica de Cards Open Graph Multi-Tenant

O módulo de Cards Open Graph Dinâmicos resolve a apresentação institucional de parceiros white-label ao compartilhar URLs da aplicação em plataformas de mensageria (WhatsApp, Telegram, Slack) e redes sociais (LinkedIn, Twitter/X, Facebook).

1. Contexto do Problema e Incompatibilidade de Crawlers

Scrapers de redes sociais e mensageiros operam como clientes HTTP estáticos (Headless Link Scrapers, ex.: facebookexternalhit/1.1, WhatsApp/2.x). Eles: 1. Não executam JavaScript: A injeção de metatags deve ocorrer estritamente durante o Server-Side Rendering (SSR) do Nuxt 4. 2. Rejeitam SVGs para Previews: O WhatsApp e o Facebook descartam silenciosamente qualquer imagem declarada em og:image cujo formato seja .svg. A imagem deve ser rasterizada em PNG, JPEG ou WebP. 3. Exigem URLs Canônicas Absolutas: Caminhos relativos (/api/og) não são resolvidos por crawlers.

2. Topologia da Solução no Nitro BFF

Diagram

3. Controles Estritos de Segurança (SecOps & Anti-SSRF)

A recuperação de assets de terceiros pelo servidor backend introduz vetores de risco que são neutralizados pelas seguintes salvaguardas:

Vetor de Risco Mitigação Arquitetural Implementada

SSRF para Redes Privadas

Validação mandatória de IP pós-resolução DNS antes da abertura de socket TCP, bloqueando 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, ::1 e metadados de nuvem.

DNS Rebinding

O socket conecta-se estritamente ao endereço IP previamente validado, sem reexecutar resolução de DNS.

Bypass por Redirecionamento

redirect: 'manual' (zero redirects automáticos sem inspeção explícita do cabeçalho Location).

Host-Header Poisoning

Ignora ?domain= incondicionalmente em ambiente de produção (import.meta.dev === false). O host é normalizado e validado contra RFC 1123.

Estouro de Memória (DoS)

Limite estrito de 2 MB de payload para logos e conferência de magic bytes binários (\x89PNG, \xFF\xD8\xFF).

4. Cache em Camadas e Isolamento Multi-Tenant

  1. Vercel Edge CDN:

    • Diretiva: Cache-Control: public, s-maxage=86400, stale-while-revalidate=604800.

    • Cabeçalho Vary: Host, Accept-Encoding garante que o cache na CDN seja fatiado pelo domínio do parceiro, impedindo que um tenant visualize o card de outro.

  2. Nitro Runtime In-Memory Cache:

    • Armazenamento temporário de buffers PNG e Data URIs indexados por chave determinística og:${cleanHost}:${versionHash}.

  3. Budget Operacional de Tamanho:

    • Garantia de PNG com tamanho inferior a 300 KB para máxima velocidade de entrega em redes móveis.