Cookies HTTP con PHP

Dado el siguiente código:

if (!isset($_COOKIE['test'])) {
    setcookie('test', 'Hello world!');
} else {
    echo 'Cookie value: '.$_COOKIE['test'];
}

¿Qué nuevo campo de cabecera HTTP de los siguientes aparecerá en la petición del navegador cuando el servidor ya haya enviado la cookie?

  1. Cookie
  2. cookie
  3. setcookie
  4. Set-Cookie

Respuesta

1. Cookie

Explicación

Para entender cómo funcionan las cookies primero hay que entender bien cómo funciona el protocolo HTTP. HTTP es algo así como una jugada de ping pong entre un navegador y un servidor que se juega justo después de otra jugada de ping pong.

Muñecas rusas

Figura 1. HTTP es como una jugada de ping pong dentro de otra jugada de ping pong: TCP/IP

O dicho de otra forma, HTTP es un protocolo a nivel de aplicación que funciona sobre TCP/IP.

Conexión TCP

Figura 2. Primero de todo, cliente y servidor se conectan por medio de TCP/IP

Justo a continuación, cuando las dos máquinas ya están conectadas, pueden comenzar a hablar en HTTP como en el siguiente ejemplo (tomado de Wikipedia).

Para obtener el recurso http://www.example.com/index.html

  • Se abre una conexión al host www.example.com
  • Se envía un mensaje como el siguiente:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: nombre-cliente
...

La respuesta del servidor está formada por encabezados seguidos del recurso que se pide, en caso de un documento HTML:

Date: Fri, 31 Dec 2003 23:59:59 GMT
Content-Type: text/html
Content-Length: 1221

<html>
<body>
<h1>Página principal de tuHost</h1>
...
</body>
</html>

No obstante hay un pequeño problema: HTTP es un protocolo sin estado. Esto significa que en cada solicitud PHP solo puede acceder a la información que hay en la cabecera correspondiente.

¿Cómo puede, pues, un servidor web hacer el seguimiento de la comunicación que lleva a cabo con un navegador determinado? Las cookies solucionan este problema. Se trata de pequeños paquetes de información que se almacenan en el navegador web.

Cuando el agente de usuario (el navegador) se comunica por primera vez con un servidor que maneja cookies, este último le envía una cookie con cierta información. A partir de ese momento, el navegador reenvía dicha cookie al servidor en cada solicitud que realiza.

Por cierto, la función:

setcookie('test', 'Hello world');

Equivale a:

header("Set-Cookie: test=Hello+world%21");

En todo caso, el servidor envía esta cabecera HTTP:

HTTP/1.1 200 OK
Date: Mon, 23 Jun 2014 17:35:58 GMT
Server: Apache/2.4.4 (Win64) PHP/5.4.12
X-Powered-By: PHP/5.4.12
Set-Cookie: test=Hello+world%21
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

Luego, cuando el agente de usuario (el navegador web) ya tiene instalada la cookie que le envió el servidor, su cabecera HTTP de solicitud será esta:

GET /http/cookie.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: test=Hello+world%21
Connection: keep-alive

HTTP cookie exchange

Figura 3. Establecimiento de una cookie

Fíjate que la cabecera de petición ya incorpora el nuevo campo cuyo valor está en codificación URL, o URL-encoded:

Cookie: test=Hello+world%21