Saltar a contenido

C4 — Componentes

El nivel C4 Component descompone cada contenedor de la plataforma en sus unidades internas con responsabilidades definidas. Este documento ofrece una visión cruzada de los tres contenedores principales: Keycloak, Traefik y el microservicio Spring WebFlux, mostrando sus componentes y las relaciones entre ellos.

Diagrama general de componentes

flowchart TB
    subgraph Traefik["Traefik (Reverse Proxy)"]
        EP["EntryPoints\n:80 / :443"]
        Router["Routers\n(reglas host/path)"]
        MW["Middlewares\n(headers, rate-limit, redirect)"]
        TLS["TLS Termination"]
        CM["Certificate Manager\n(ACME / Let's Encrypt)"]
        EP --> Router
        Router --> MW
        MW --> TLS
        TLS --> CM
    end

    subgraph Keycloak["Keycloak 26.x (Identity Provider)"]
        AE["Authentication Engine\n(flujos, MFA, PKCE)"]
        TS["Token Service\n(issuer, signer, revocación)"]
        AA["Admin REST API\n(/admin/realms/*)"]
        US["User Storage\n(PostgreSQL adapter)"]
        IB["Identity Broker\n(SAML, OIDC externo)"]
        CR["Client Registry"]
        AE --> TS
        AE --> US
        AE --> CR
        AA --> AE
        AA --> CR
        IB --> AE
    end

    subgraph WebFlux["Spring WebFlux (Resource Server)"]
        RF["RouterFunctions\n(rutas reactivas)"]
        SFC["SecurityFilterChain\n(ReactiveSecurityConfig)"]
        JV["JWT Validator\n(ReactiveJwtDecoder)"]
        AM["AuthorizationManager"]
        BH["Business Handlers"]
        RF --> SFC
        SFC --> JV
        JV --> AM
        AM --> BH
    end

    Internet((Internet)) -->|HTTPS 443| EP
    MW -->|proxy HTTP| Keycloak
    MW -->|proxy HTTP| WebFlux
    JV -->|JWKS fetch| TS
    BH -->|R2DBC| DB[(PostgreSQL)]

Tabla de componentes por contenedor

Keycloak

Componente Responsabilidad Protocolo expuesto
Authentication Engine Ejecuta flujos OAuth 2.1/OIDC (Authorization Code, Client Credentials, Device Flow). Coordina MFA y PKCE. OIDC / OAuth 2.1
Token Service Genera, firma (RS256/ES256) y valida tokens. Gestiona revocación y sesiones activas. JWT / JWKS
Admin REST API Gestión programática de realms, clientes, usuarios y roles vía HTTP. REST / JSON
User Storage Adaptador JDBC contra PostgreSQL. Persiste usuarios, credenciales y atributos de perfil. SQL (interna)
Identity Broker Federar autenticación con IDPs externos (SAML 2.0, OIDC de terceros). SAML 2.0 / OIDC
Client Registry Almacena configuración de clientes OAuth2: scopes, redirect URIs, secretos, tipo de acceso. Interna (BD)

Traefik

Componente Responsabilidad Clave de configuración
EntryPoints Escucha en puertos 80 y 443. Punto de entrada único para todo el tráfico externo. entryPoints.web, entryPoints.websecure
Routers Aplica reglas de routing por Host y PathPrefix. Selecciona el servicio destino correcto. rule: Host(...)
Middlewares Añade security headers, redirect HTTP→HTTPS, rate limiting por IP/ruta. headers, redirectScheme, rateLimit
TLS Termination Descifra TLS en el edge. Las comunicaciones internas son HTTP plano en la red Docker privada. tls: certResolver
Certificate Manager Gestiona certificados ACME (Let's Encrypt). Renueva automáticamente antes de la expiración. certificatesResolvers.letsencrypt

Spring WebFlux

Componente Responsabilidad Tipo
RouterFunctions Define rutas HTTP de forma funcional sin anotaciones de controlador. RouterFunction<ServerResponse>
Business Handlers Implementa la lógica de aplicación. Recibe ServerRequest, retorna Mono<ServerResponse>. HandlerFunction<ServerResponse>
SecurityFilterChain Configura la cadena de filtros reactiva. Declara rutas públicas y rutas con scope requerido. SecurityWebFilterChain
JWT Validator Descarga y cachea JWKS desde Keycloak. Valida firma, expiración, issuer y audience. ReactiveJwtDecoder
AuthorizationManager Evalúa scopes y roles del JWT contra cada ruta protegida. ReactiveAuthorizationManager

Flujo de petición autenticada entre componentes

sequenceDiagram
    actor Cliente
    participant EP as Traefik EntryPoint
    participant SFC as Spring SecurityFilterChain
    participant JV as JWT Validator
    participant TS as Keycloak Token Service
    participant BH as Business Handler

    Cliente->>EP: GET /api/recurso Bearer: <token>
    EP->>SFC: Forward (HTTP interno)
    SFC->>JV: Extraer y validar JWT
    JV->>TS: GET /.well-known/jwks.json (cacheado 5 min)
    TS-->>JV: Claves públicas RSA
    JV-->>SFC: Claims validados: sub, scope, exp
    SFC->>BH: Ejecutar con SecurityContext poblado
    BH-->>Cliente: 200 OK payload

Principios de diseño aplicados

  • Sin estado en el gateway: Traefik no almacena sesiones; la identidad viaja completamente en el JWT firmado.
  • Validación local del token: Spring WebFlux valida el JWT con clave pública JWKS; no llama a Keycloak por cada petición.
  • Rotación automática de claves: Keycloak rota claves de firma periódicamente; ReactiveJwtDecoder refresca JWKS al detectar un kid desconocido.
  • Defensa en capas: Traefik aplica rate limiting antes de que la petición llegue a la aplicación, reduciendo la superficie de ataque.