.. _cookies: Cookies ======= Ya se ha dicho que |HTTP| es un protocolo sin estado, esto es, que cada conexión es independiente de las que se ha producido antes. Sin embargo, estamos acostumbrados a que al identificarnos en la página de un banco o de un foro, la aplicación web recuerde quienes somos durante toda la sesión. Para posibilitar este concepto de *estado* los desarrolladores del antiguo `Netscape Navigator `_ crearon las *cookies*. Las *cookies* funcionan de la siguiente manera: Establecimiento --------------- Al conectar a un sitio y pedir un recurso, la respuesta con el recurso puede contener\ [#]_ uno o varios campos `Set-Cookie `_, cada uno de ellos establece una cookie diferente. La sintaxis de este campo es la siguiente:: Set-Cookie: =; Max-Age=; Domain=; Path= La única parte obligatoria es ``=`` que es la que establece el nombre y valor de la *cookie*. Una *cookie* no es más que esto: un nombre al que se le asigna un valor. Por ejemplo, un foro que permitiera a los usuarios escoger un determinado estilo de visualización podría enviar una *cookie* así:: Set-Cookie: estilo=clasico que significaría que el usuario prefiere el estilo "*clasico*". ``Max-Age`` establece en segundo el tiempo máximo de vigencia de la *cookie* en segundos, después del cual el navegador la considerará caducada y la borrará. Un valor de **0** provoca el efecto de borrar la cookie previamente almacenada en el *navegador*. También se puede asignar un valor negativo (típicamente **-1**) para expresar que la *cookie* es de sesión, es decir, que el navegador debe desecharla al cerrarse. En vez de ``Max-Age``, puede usarse ``Expires`` que indica la fecha y hora de caducidad de la *cookie*. De hecho, los navegadores antiguos como :abbr:`IE8 (Internet Explorer versión 8)`, sólo entienden ``Expires``. Cuando ``Set-Cookie`` no incluye ni ``Expires`` ni ``Max-Age``, la *cookie* es de sesión. ``Domain`` sirve para indicar el sitio en el que la *cookie* tiene valor. Si no se incluye, el cliente entenderá que es aplicable en el sitio que está visitando. Lo habitual es que este campo no se incluya, ya que no tiene demasiado sentido pedir al navegador que en un sitio almacene información para otro. De hecho, las *cookies* que obran así, se denominan *cookies de terceros* y no suelen tener buenas intenciones, por lo que los navegadores suelen estar configurados para rechazarlas. ``Path`` es la ruta debajo de la cual tiene validez la *cookie*, es decir, si su valor es :kbd:`/`, la *cookie* será válida en todo el dominio que indique ``Domain``. En cambio, si su valor es :kbd:`/docs`, tendrá validez en todas las páginas del dominio cuya ruta empiece por este directorio, pero no, por ejemplo, en la página principal. .. note:: ``Set-Cookie`` puede contener otras partes como ``Secure`` o ``HttpOnly``. Uso --- Cuando se ordena a un navegador realizar una conexión para obtener un recurso *web*, este consulta las *cookies* que tiene almacenadas y escoge aquellas pertinentes, es decir, aquellas que se corresponden con el dominio del recurso y cuta ruta esta contenida en la ruta del recurso. Por ejemplo, si el recurso es:: http://www.example.net/docs/subdocs/documento.html se escogerían todas las *cookies* del dominio *www.example.net* y aquellas cuya ruta fuera :file:`/`, :file:`/docs` o :file:`/docs/subdocs`. Con todas las cookies seleccionadas, se forma el campo `Cookie `_:: Cookie: nombre1=valor1, nombre2=valor2, nombre3=valor3 que se envía en la cabecera de petición. .. rubric:: Notas al pie .. [#] La directiva europea 2009/136/CE, traspuesta por el artículo 4 del `Real Decreto-ley 13/2002 `_ que modifica el artículo 22.2 del `Real Decreto-Ley 24/2002 `_, de 11 de julio, obliga a que si el uso de la *cookie* no es estrictamente necesario para llevar a cabo la comunicación, el comunicante deba dar su consentimiento expreso de aceptación.