MonstruoGalletasDe todos los personajes de Barrio Sésamo, cuando era pequeño los que más me gustaban eran el Conde Draco (que contaba todo lo que se le ponía por delante) y sin duda Triki, el monstruo de las galletas. Triki se pasaba el día comiendo galletas de forma desmesurada, rompiéndolas en mil pedazos mientras lo hacía. Creo que se le salían de la boca más que las que era capaz de procesar. Era un personaje muy divertido.

Me he acordado de él hoy al pensar en escribir este post, ya que a algunos programadores web les pasa lo mismo que a Triki: procesan las cookies pero le sirven de bien poco o le hacen un flaco favor.

Más o menos todos los programadores web tienen una idea aproximada de qué son las cookies en un navegador web y para qué se utilizan. Pero hay algún concepto básico que todavía no es bien conocido y que me parece interesante aclarar, así que me he decidido a escribir un pequeño artículo sobre las cookies, cómo se usan y cómo funcionan por debajo.

Las cookies, como seguramente sabrás, son pares clave/valor que se almacenan es un archivo de texto plano en el lado cliente (en el navegador) y que guardan temporalmente información que es necesaria para nuestra aplicación. Para crearlas tenemos dos opciones:

  • Generarlas desde el lado servidor: en este caso se emplean métodos propios del lenguaje de servidor que estamos utilizando (por ejemplo en ASP.NET usando la colección HttpResponse.Cookies). Lo que ocurre realmente por debajo es que estamos usando cabeceras de tipo Set-Cookie para indicar al navegador que debe crear una nueva entrada en la cookie del dominio actual, y es éste el que se encarga de hacerlo.
  • Generarlas desde el lado cliente: usando JavaScript, de manera muy similar. En este caso se instruye directamente al navegador para crear el par clave/valor y almacenarlo en el archivo de cookies del dominio actual de la página. No se genera tráfico alguno con el servidor, siendo todo interacción de lado cliente.

El navegador almacena las cookies atándolas al dominio que las genera, y por cuestiones de privacidad no es posible leer desde un dominio las cookies de otro dominio.

Nota: Como sabrás, actualmente existen leyes en muchos países (y especialmente en la UE) que limitan el uso de las cookies para tratar de preservar la privacidad, y obligan a las páginas a avisar de que se están utilizando con fines de seguimiento. Pero, si son simples archivos de texto y si solo se pueden leer desde tu propio dominio ¿por qué tanto alarmismo por las cookies?.  El motivo es que muchos proveedores de publicidad (Google y sus empresas satélite sobre todo) trabajan en connivencia con las páginas en las que insertan publicidad para incluir un pequeño recurso embebido en todas ellas (llamado “beacon”) de manera que guardan cookies atadas siempre al mismo dominio. De ese modo, dado el poder que tienen, están presentes por toda Internet y por lo tanto van siguiendo tu pista en cada página que visitas. Dado que todos los “beacons” están en el mismo dominio pueden leerlo en todas las páginas y saber cuáles has visitado. Dependiendo del nivel de integración con el portal o medio de comunicación que visites pueden saber exactamente qué páginas has visitado, qué productos te interesan, y luego te venden publicidad mucho más enfocada. Así que sí: son peligrosas para tu privacidad, pero no porque te puedan introducir virus o sean peligrosas por si mismas, sino por el enorme tamaño y poder que tienen los señores de la publicidad on-line y el nivel de connivencia con los grandes medios y las grandes tiendas on-line. Si no me crees monitoriza la descarga de la página principal de un periódico cualquiera y alucinarás con la cantidad de tráfico “paralelo” que se genera sin que el usuario normal lo advierta :-(

Según la RFC 2965 que regula entre otras cosas a las cookies, éstas podrían teóricamente tener un tamaño cualquiera. Sin embargo todos los navegadores imponen un tamaño máximo que pueden ocupar y a partir del cual “se niegan” a almacenar nada más. Este tamaño varía de un navegador a otro, e incluso entre una versión y otra. También existen límites en lo que se refiere al número de cookies (es decir, pares clave/valor) que podemos almacenar por cada dominio.

Para estar dentro de la seguridad y no “pillarnos los dedos” no deberíamos superar las 4 Kb de tamaño y las 50 cookies por dominio. En cualquier caso llegar siquiera cerca de estos límites es algo que desaconsejo vehementemente por lo que veremos a continuación....

Otra cuestión interesante son las cookies de sesión. Éstas no se almacenan en ningún lado ya que sólo existen mientras dura la sesión abierta con el servidor web. De esta manera si cerramos el navegador, se pierden para siempre ya que no están almacenadas físicamente en ningún archivo, y sólo las mantiene en memoria el navegador mientras lo tenemos abierto.

¿Cómo se leen las cookies y por qué debería importarnos?

A la hora de leer las cookies tenemos, nuevamente, dos posibilidades:

  • Leerlas en el lado cliente: para lo cual, al igual que antes, se utiliza JavaScript. El mayor problema que tiene esto es que, por defecto, las cookies establecidas desde el servidor (la manera más habitual) se protegen con el modificador HttpOnly, para evitar precisamente que se puedan leer por JavaScript y por lo tanto se puedan explotar para robar sesiones. En este post lo explico con detalle.
  • Leerlas en el lado servidor: en este caso se utiliza algún método del lenguaje de servidor que estemos empleando. Por ejemplo, con ASP.NET se utiliza la colección HttpRequest.Cookies. Esta es la manera habitual de leer las cookies.

Dado que la manera común de leer las cookies es en el servidor -que es donde además son más útiles- hay que tener cuidado con qué almacenamos y para qué. El motivo es que las cookies que tengamos almacenadas en el cliente se envían en cada una de las peticiones que el navegador hacer al servidor.

Vamos a verlo... Por ejemplo, he capturado con Fiddler el contenido de una cookie enviada a Doubleclick (agencia de publicidad online perteneciente a Google y quizá la mayor del mundo) y que se envía en cada petición a ese dominio (esta está sacada de la página principal de El País):

CookieDoubleClick_1
Click para aumentar

Si lo vemos con más detalle:

CookieDoubleClick_2

Vemos que todas las cookies van en la petición, y que éstas no son más que un archivo de texto con una colección de parejas de clave/valor separadas por puntos y comas. Así, por ejemplo vemos que hay una clave llamada “id” con un valor (que probablemente me identifique de manera única en toda Internet ante esta empresa de publicidad). Pues esto se enviará por parte del navegador en todas las peticiones que se hagan al dominio pubads.g.doubleclick.net, que es el dominio que utilizan.

Fíjate bien en las implicaciones de que la información completa de nuestras cookies vaya incluida en las cabeceras de todas y cada una de las conexiones que lancemos a nuestro dominio desde el navegador, y el hecho de que esto será así no sólo para las páginas sino también para las imágenes, las hojas de estilo, los scripts y cualquier otro archivo que se solicite al servidor.

Por ello, si tenemos una cookie que ocupe, por ejemplo, 2 Kb, y una página que descargue 4 scripts, 12 imágenes y 3 hojas de estilo, estamos añadiendo un peso de (4 scripts + 12 imágenes + 3 css + 1 página)*2Kb = 40 Kb de manera innecesaria a esa página. Eso significa más tráfico consumido innecesariamente y un cierto retardo en la descarga de la página, que si es una conexión lenta puede ser significativo (medio segundo o más), y si es una conexión 3G en la que se pague por consumo puede aumentar la tarifa del usuario.

 

Aprende ASP.NET rápido, online, paso a paso, y ¡tutelado por mi! :-)
más información...

Conclusiones

Las cookies pueden ser muy útiles si las empleamos sabiamente, pero pueden ser un engorro innecesario y aumentar a lo tonto la cantidad de tráfico que existe entre el navegador y nuestro servidor. Así que:

  • Utiliza cookies solamente cuando sea necesario.
  • Emplea la menor cantidad de información posible, incluso si tienes que codificar de alguna manera los datos para que ocupen menos. Cuanto menor sea el tamaño de las cookies menos sobrecarga innecesaria añadirás a la conexión y más rápido cargarán las páginas y sus recursos. En cualquier caso procura que nunca sobrepasen unos pocos bytes.
  • Ten cuidado con el tamaño de las cookies que utilizas y de la cantidad de ellas que fijas, ya que existen límites en los navegadores.
  • Ojo con cookies asignadas a dominios de primer nivel solo y que puedan aparecer también en subdominios: si lo haces sin darte cuenta puedes estar recibiendo cookies innecesariamente incluso en subdominios del dominio principal, sin que las estés usando para nada.
  • Ponles fechas de caducidad apropiadas y no las dejes simplemente para que caduquen dentro de 120 años si no es necesario guardarlas para siempre. Una vez que una cookie caduca el navegador la elimina y ya no se enviará en las siguientes peticiones, así que una menos de la que preocuparse.

¡Espero que te sea útil!

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA