HTTP/2

Protocolos Y Transporte Security Notes Jan 6, 2025 JAVASCRIPT

Definition

HTTP versión 2 - Revisión mayor de HTTP estandarizada en 2015. Introduce tramas binarias, multiplexación de múltiples flujos sobre una conexión única, compresión de encabezados (HPACK) y capacidades de server push para mejor rendimiento.

Diagrama

sequenceDiagram
    participant C as Cliente
    participant S as Servidor

    Note over C,S: Una conexión TCP con Multiplexación

    rect rgb(200, 230, 255)
        C->>S: Frame SETTINGS
        S-->>C: SETTINGS ACK

        par Stream 1 - HTML
            C->>S: HEADERS (GET /index.html) [Stream 1]
            S-->>C: HEADERS + DATA [Stream 1]
        and Stream 3 - CSS
            C->>S: HEADERS (GET /style.css) [Stream 3]
            S-->>C: HEADERS + DATA [Stream 3]
        and Stream 5 - JavaScript
            C->>S: HEADERS (GET /app.js) [Stream 5]
            S-->>C: HEADERS + DATA [Stream 5]
        end

        Note over C,S: Todos los streams multiplexados en UNA conexión

        rect rgb(255, 230, 200)
            Note over S,C: Server Push (proactivo)
            S-->>C: PUSH_PROMISE (font.woff2)
            S-->>C: DATA (font.woff2) [Stream 2]
        end
    end

    Note over C,S: HPACK comprime encabezados repetidos

Example

Una aplicación web cargando 50 recursos puede descargarlos todos sobre una única conexión HTTP/2 simultáneamente, eliminando el bloqueo de cabecera de línea y reduciendo latencia comparado con HTTP/1.1 que necesitaría múltiples conexiones.

Analogía

Como actualizar de enviar cartas una a la vez a usar un cable de fibra óptica dedicado donde múltiples conversaciones pueden ocurrir simultáneamente, todos los mensajes están en formato binario compacto, y el remitente puede enviar proactivamente cosas que predice que necesitarás.

Code Example


// Node.js HTTP/2 server
const http2 = require('http2');
const fs = require('fs');

const server = http2.createSecureServer({
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem')
});

server.on('stream', (stream, headers) => {
  stream.respond({
    'content-type': 'application/json',
    ':status': 200
  });
  stream.end(JSON.stringify({
    message: 'HTTP/2 response'
  }));
});

server.listen(443);

Notas de Seguridad

SECURITY NOTES

Requisitos Principales:

  • HTTP/2 requiere TLS en la mayoría de navegadores.
  • Cuidado con ataques de bomba HPACK vía compresión de encabezados.

Mejores Prácticas:

  • Implementa límites adecuados de priorización de flujos para prevenir agotamiento de recursos.
  • Monitorea ataques HTTP/2 Rapid Reset.
  • Valida nombres y valores de campos de encabezado para prevenir inyección de encabezados..

Standards & RFCs