¿Las cookies HTTP son específicas del puerto?

Tengo dos servicios HTTP ejecutándose en una máquina. Solo quiero saber si comparten sus cookies o si el navegador distingue entre los dos sockets de servidor.

La especificación actual de cookies es RFC 6265 , que reemplaza RFC 2109 y RFC 2965 (ambas RFC ahora están marcadas como “Históricas”) y formaliza la syntax para usos de cookies en el mundo real. Establece claramente:

  1. Introducción

Por razones históricas, las cookies contienen una serie de infelicidades de seguridad y privacidad. Por ejemplo, un servidor puede indicar que una cookie determinada está destinada a conexiones “seguras”, pero el atributo de seguridad no proporciona integridad en presencia de un atacante de red activo. Del mismo modo, las cookies para un host determinado se comparten en todos los puertos de ese host, aunque la política habitual de “mismo origen” utilizada por los navegadores web aísla el contenido recuperado a través de diferentes puertos.

Y también:

8.5. Confidencialidad débil

Las cookies no proporcionan aislamiento por puerto . Si una cookie es legible por un servicio que se ejecuta en un puerto, la cookie también es legible por un servicio que se ejecuta en otro puerto del mismo servidor. Si un servicio puede escribir una cookie en un puerto, un servicio que se ejecuta en otro puerto del mismo servidor también puede escribir en la cookie. Por este motivo, los servidores NO DEBEN ejecutar servicios mutuamente desconfiados en diferentes puertos del mismo host y usar cookies para almacenar información sensible a la seguridad.

De acuerdo con RFC2965 3.3.1 (que pueden ser seguidos o no por los navegadores), a menos que el puerto se especifique explícitamente a través del parámetro de port del encabezado Set-Cookie , las cookies pueden enviarse o no a cualquier puerto.

El Manual de seguridad del navegador de Google dice: de forma predeterminada, el scope del cookie está limitado a todas las URL del nombre de host actual, y no está vinculado a la información del puerto o protocolo. y algunas líneas más adelante No hay forma de limitar las cookies a un solo nombre DNS […] solo de la misma manera, no hay forma de limitarlos a un puerto específico. (Además, tenga en cuenta que IE no tiene en cuenta los números de puerto en su política de origen idéntico).

Por lo tanto, no parece seguro confiar en un comportamiento bien definido aquí.

Esta es una pregunta muy antigua, pero pensé que agregaría una solución que utilicé.

Tengo dos servicios en ejecución en mi computadora portátil (uno en el puerto 3000 y el otro en 4000). Cuando saltaba entre ( http://localhost:3000 y http://localhost:4000 ), Chrome pasaba la misma cookie, cada servicio no entendía la cookie y generaba una nueva.

Descubrí que si accedía a http://localhost:3000 y http://127.0.0.1:4000 , el problema desaparecía, ya que Chrome conservaba una cookie para localhost y otra para 127.0.0.1.

Nuevamente, a nadie le puede importar en este punto, pero fue fácil y útil para mi situación.

Esta es una gran área gris en SOP de cookies (Política de Mismo Origen).

Teóricamente, puede especificar el número de puerto en el dominio y la cookie no se compartirá. En la práctica, esto no funciona con varios navegadores y se encontrará con otros problemas. Por lo tanto, esto solo es factible si sus sitios no son para el público en general y usted puede controlar qué navegadores usar.

El mejor enfoque es obtener 2 nombres de dominio para la misma IP y no depender de los números de puerto para las cookies.

Una forma alternativa de evitar el problema es hacer que el nombre de la cookie de sesión esté relacionado con el puerto. Por ejemplo:

  • mysession8080 para el servidor que se ejecuta en el puerto 8080
  • mysession8000 para el servidor que se ejecuta en el puerto 8000

Su código podría acceder a la configuración del servidor web para averiguar qué puerto utiliza su servidor y nombrar la cookie en consecuencia.

Tenga en cuenta que su aplicación recibirá ambas cookies y deberá solicitar la que corresponde a su puerto.

No es necesario tener el número de puerto exacto en el nombre de la cookie, pero esto es más conveniente.

En general, el nombre de la cookie podría codificar cualquier otro parámetro específico de la instancia del servidor que utilice, de modo que pueda decodificarse mediante el contexto correcto.

En IE 8, las cookies (verificadas solo contra el host local) se comparten entre los puertos. En FF 10, no lo son.

He publicado esta respuesta para que los lectores tengan al menos una opción concreta para probar cada escenario.

Estaba experimentando un problema similar al ejecutar (y al intentar depurar) dos aplicaciones diferentes de Django en la misma máquina.

Los estaba ejecutando con estos comandos:

 ./manage.py runserver 8000 ./manage.py runserver 8001 

Cuando inicié sesión en el primero y luego en el segundo siempre me desconecté del primero y viceversa.

Añadí esto en mi / etc / hosts

 127.0.0.1 app1 127.0.0.1 app2 

Luego comencé las dos aplicaciones con estos comandos:

 ./manage.py runserver app1:8000 ./manage.py runserver app2:8001 

Problema resuelto 🙂

Es opcional

El puerto puede especificarse para que las cookies puedan ser específicas del puerto. No es necesario, el servidor / aplicación web debe cuidar esto.

Fuente: Artículo de la Wikipedia alemana , RFC2109 , Capítulo 4.3.1