HTTP es el protocolo en el que se basa la Web. Fue inventado por Tim Berners-Lee entre los años 1989-1991. Inicialmente lo llamó: 'Mesh' (malla, en inglés), y posteriormente se renombró como World Wide Web (red mundial). Desarrollado sobre los protocolos existentes TCP e IP, está basado en cuatro bloques:
- Un formato de texto para representar documentos de hiper-texto: HyperText Markup Language (HTML).
- Un protocolo sencillo para el intercambio de esos documentos, del inglés: HypertText Transfer Protocol (HTTP) : protocolo de transferencia de hiper-texto.
- Un cliente que muestre (e incluso pueda editar) esos documentos. El primer navegador Web, llamado: WorldWideWeb.
- Un servidor para dar acceso a los documentos, una versión temprana: httpd (http daemon)
HTTP/0.9 (1991)
La versión del protocolo HTTP usada en aquel momento, era realmente muy sencilla, posteriormente pasó a HTTP/0.9, llamado protocolo de una sola línea debido a que consistía en un método GET seguido por la dirección del recurso a pedir.
GET /miPaginaWeb.html
Esta versión no usaba cabeceras HTTP, estado, ni códigos de error, y lo único que transportaba eran ficheros HTML.
HTTP/1.0 (1991-1995)
En esta versión hubo las siguientes novedades:
- Por cada petición se enviaba la versión del protocolo
- La respuesta devolvía el estado de la petición
- Las cabeceras HTTP se incluyeron en las peticiones y en las respuestas
- Se permitió la transmisión de meta-data
- Se añadió el content-type que permitió indicar el tipo de recurso solicitado
GET /mypage.html HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1) 200 OK Date: Tue, 15 Nov 1994 08:12:31 GMT Server: CERN/3.0 libwww/2.17 Content-Type: text/html <HTML> Hola, mundo! </HTML>
HTTP /1.1 (1995-1997)
La versión 1.1 se considero como protocolo estándar, y se añadió varias mejoras:
- Se podía reusar la conexión, evitando el uso abusivo de llamadas
- Se incorporo "Pipelining", un enrutamiento permitiendo realizar una segunda petición
- Las respuestas podrían ser divididas
- Administración en la caché
- Mediante la opción Host podíamos tener diferentes nombres de dominios en una misma IP
- Atributos Accept en el que puedes indicar el lenguaje, el tipo de codificación, entre otros.
Durante esta versión se crearon dos revisiones más del protocolo, una en 1999 y otra en 2014, haciendo que fuera estable durante más de 15 años.
HTTP/2
En el año 2012 aparecen los primeros borradores de esta versión y no fue oficial hasta Mayo de 2015. Las novedades de esta versión fueron:
- Pasa a ser un protocolo binario, por lo que no se puede manejar manualmente
- Se pueden realizar peticiones en paralelo
- Comprime cabeceras y elimina dulicidades
- Mecanismo server push que permite al servidor almacenar datos en la caché del cliente
Posteriormente, en el año 2016 se añadireron nuevas funcionalidades:
- Soporte a la cabecera Alt-Svc permitiendo el uso más inteligente de los mecanismos de cacheo de memoria de los CDN
- Cabecera Client-Hints permitiendo comunicar restricciones de hardware
- Prefijos de seguridad en la cabecera Cookie para evitar que sean alteradas
HTTP/3
Esta versión fue iniciada en Octubre de 2018, usando UDP en lugar de TCP para el protocolo de transporte subyacente. Actualmente no está activa en ningún navegador, aunque puede ser utilizada en navegadores como Chrome y Firefox.
Métodos de petición
Los métodos de petición (también conocidos como verbos de llamadas HTTP) permiten indicar la acción a realizar sobre el recurso del servidor.
- HEAD: realiza la misma petición que un GET pero sin el cuerpo de respuesta. Se suele usar para recuperar información en los meta-data sin tener que enviar todo el contenido.
- GET: realizar una petición de obtención de un recurso en el servidor. En este método se suelen pasar parámetros por querystring para indicar el recurso a obtener.
- POST: hace que los datos sean procesos por el recurso indicado. Los datos se incluirán en el cuerpo de la petición. Creación, actualización o ambas de recursos del servidor.
- PUT: sube, carga o realiza un upload un recurso especificado. Método usado para subir ficheros.
- DELETE: eliminación de un recurso
- TRACE: solicita al servidor que envíe en la sección del cuerpo la data que recibe del mensaje solicitante. Suele usarse para trazabilidad.
- OPTIONS: devuelve los métodos permitidos para una url concreta.
Códigos de estado
Los códigos de estado son un grupo de tres dígitos que nos permite saber el estado que se encuentra la petición o respuesta. Estos códigos se agrupan por el primer digito, siendo asi:
- 1xx mensajes con fines informativos
- 2xx con estados que indican que la petición o respuesta se han realizado correctamente
- 3xx indican redirecciones
- 4xx códigos de error cometidos por parte del cliente
- 5xx suelen ser problemas que se producen en servidor
Transmisiones seguras
A finales de 1994 se creo una capa adicional llamada SSL sobre la se transmitían las peticiones de manera más segura. Gracias a la versión 2.0 y sucesivas se permitió la creación del comercio electrónico en la Web (e-commerce) encriptando la transmisión. SSL se estableció como estandar y posteriormente fue llamado protocolo TLS.
HTTP en aplicaciones
Cerca del año 2000 se creo un formato de HTTP llamado REST (Representational State Transfer) con el que iba a ser muy usado en aplicaciones a partir del año 2010. Esto permitiría que las aplicaciones pudieran recuperar y modificar datos, sin tener que actualizar las páginas webs.
Posteriormente se vio la necesidad de implementar ciertos aspectos en la seguridad del protocolo. Se crearon documentos como:
- CORS (Cross-Origin Resource Sharing) por el cual no se puede realizar una petición a otro dominio sin su permiso
- CSP (Content Security Policy) ayuda a prevenir ataques como el XSS (Cross Site Scripting)
- Cabecera X-Frame-Options que indica si la página podía ser renderizada por el navegador en una etiqueta <frame>, <iframe> u <object>
- Cabecera Upgrade-Insecure-Request que hace que el navegador navegue de manera automática de un protocolo http a https