¿Cuál es la diferencia entre las cookies del lado del servidor y las del lado del cliente?

120

¿Cuál es la diferencia entre crear cookies en el servidor y en el cliente? ¿Se denominan cookies del lado del servidor y cookies del lado del cliente? ¿Existe alguna forma de crear cookies que solo se puedan leer en el servidor o en el cliente?

Rahul
fuente
15
No existe tal cosa como 'cookie del lado del servidor' vs 'cookie del lado del cliente'. Solo hay cookies, pares de nombre / valor enviados en encabezados HTTP con solicitudes y respuestas.
Dan Grossman
1
Posiblemente haciendo referencia a variables de sesión, que contienen datos en el servidor. Por lo general, todavía hay un identificador de sesión que se mantiene como una cookie del lado del cliente.
AndrewR
Con toda probabilidad, la pregunta se refiere a las diferentes formas en que se codifican las cookies en el lado del servidor (es decir, la forma en que están codificadas en el encabezado de respuesta 'Cookie' y 'Set-Cookie') y en el lado del cliente (es decir, la forma en que están codificados en el encabezado de solicitud 'Cookie' - $ Path variable y todo ese jazz). Ver RFC 2109
Ophir Radnitz

Respuestas:

146

COOKIES HTTP

Las cookies son pares clave / valor que utilizan los sitios web para almacenar información de estado en el navegador. Supongamos que tiene un sitio web (ejemplo.com), cuando el navegador solicita una página web, el sitio web puede enviar cookies para almacenar información en el navegador.

Ejemplo de solicitud de navegador:

GET /index.html HTTP/1.1
Host: www.example.com

Respuesta de ejemplo del servidor:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: foo=10
Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
... rest  of the response

Aquí se almacenan en el navegador dos cookies foo = 10 y bar = 20. El segundo caducará el 30 de septiembre. En cada solicitud posterior, el navegador enviará las cookies de vuelta al servidor.

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*

SESIONES: Cookies del lado del servidor

Las cookies del lado del servidor se conocen como "sesiones". En este caso, el sitio web almacena una única cookie en el navegador que contiene un identificador de sesión único. La información de estado (foo = 10 y bar = 20 arriba) se almacena en el servidor y el identificador de sesión se usa para hacer coincidir la solicitud con los datos almacenados en el servidor.

Ejemplos de uso

Puede utilizar tanto sesiones como cookies para almacenar: datos de autenticación, preferencias del usuario, el contenido de un gráfico en un sitio web de comercio electrónico, etc ...

Pros y contras

A continuación, pros y contras de las soluciones. Estos son los primeros que me vienen a la mente, seguro que hay otros.

Ventajas de las cookies:

  • escalabilidad: todos los datos se almacenan en el navegador para que cada solicitud pueda pasar por un balanceador de carga a diferentes servidores web y usted tenga toda la información necesaria para completar la solicitud;
  • se puede acceder a ellos a través de javascript en el navegador;
  • al no estar en el servidor, sobrevivirán a los reinicios del servidor;
  • RESTful: las solicitudes no dependen del estado del servidor

Contras de las cookies:

Ventajas de la sesión:

  • generalmente más fácil de usar, en PHP probablemente no hay mucha diferencia.
  • almacenamiento ilimitado

Contras de la sesión:

  • más difícil de escalar
  • en los reinicios del servidor web puede perder todas las sesiones o no dependiendo de la implementación
  • no DESCANSO
Filippo
fuente
pros de la sesión secure:?
user2167582
1
¿Por qué sesiones más seguras? Si envía la cookie de sesión a través de http, puede ser secuestrada. Si el sitio usa https, la seguridad debe ser la misma siempre que use cookies seguras (cifradas, firmadas, etc.)
filippo
1
Desventajas de las cookies: hace que cada solicitud sea más grande, lo que puede afectar el rendimiento. No sé los números, pero como la gente usa dominios sin cookies para cosas, asumo que no es trivial.
maniexx
5
Respuesta en gran medida engañosa: las sesiones no son cookies. en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session Puede tener variables de sesión, dependiendo de la forma en que se implemente la gestión de sesiones en el servidor. Por lo general, tiene una o más cookies que están relacionadas con la gestión de la sesión, manteniendo el identificador de la sesión. Además, REST y RESTful no tienen nada que ver con las cookies o la gestión de sesiones: las implementaciones REST y RESTful pueden tener sesiones y cookies.
Zlatin Zlatev
2
Consulte stackoverflow.com/questions/35054840/… No estaba diciendo que las sesiones no se implementan normalmente con cookies, pero que hay otras opciones para la gestión de sesiones, por lo que es incorrecto hablar de variables de sesión como cookies del lado del servidor. También me refería a JWT cuando dije en el año 2017 en el comentario anterior que "Las implementaciones REST y RESTful pueden tener sesiones y cookies". Aunque algunos puristas pueden argumentar que esta no es la forma correcta de implementar una API REST.
Zlatin Zlatev
57

¿Probablemente te refieres a la diferencia entre las cookies Http Only y su contraparte?

No se puede acceder a las cookies de Http Only (leer o escribir) en JavaScript del lado del cliente, solo del lado del servidor. Si no se establece el indicador Http Only, o la cookie se crea en JavaScript (del lado del cliente), la cookie se puede leer y escribir en JavaScript (del lado del cliente) y también en el lado del servidor.

nikc.org
fuente
38

Todas las cookies son cliente y servidor

No hay diferencia. Una cookie normal se puede configurar del lado del servidor o del lado del cliente. La cookie 'clásica' se enviará de vuelta con cada solicitud. Una cookie establecida por el servidor se enviará al cliente en una respuesta. El servidor solo envía la cookie cuando se establece o cambia explícitamente, mientras que el cliente envía la cookie en cada solicitud.

Pero esencialmente es la misma galleta.

Pero el comportamiento puede cambiar

Una cookie es básicamente un name=valuepar, pero después del valor puede haber un grupo de atributos separados por punto y coma que afectan el comportamiento de la cookie si así lo implementa el cliente (o servidor). Esos atributos pueden referirse a la duración, el contexto y varias configuraciones de seguridad.

Solo HTTP (no solo para servidor)

Un servidor puede establecer uno de esos atributos para indicar que es una cookie solo HTTP. Esto significa que la cookie todavía se envía de un lado a otro, pero no estará disponible en JavaScript. Sin embargo, tenga en cuenta que la galleta todavía está allí. Es solo una protección incorporada en el navegador, pero si alguien usa un navegador ridículamente antiguo como IE5, o algún cliente personalizado, ¡puede leer la cookie!

Así que parece que existen 'cookies de servidor', pero en realidad no las hay. Estas cookies todavía se envían al cliente. En el cliente no hay forma de evitar que se envíe una cookie al servidor.

Alternativas para lograr la 'unicidad'

Si desea almacenar un valor solo en el servidor, o solo en el cliente, necesitará algún otro tipo de almacenamiento, como un archivo o una base de datos en el servidor, o almacenamiento local en el cliente.

GolezTrol
fuente
hola soy muy nuevo en estos conceptos y tengo algunas dudas. Lo siento, mis preguntas pueden parecer tontas, pero aun así las haré. Se agradece mucho cualquier ayuda. ¿Se puede enviar una cookie que se ha configurado en el lado del cliente a cualquier dominio? Quiero decir, ¿no es eso una amenaza a la seguridad? Además, ¿cómo funciona con clientes que no son navegadores, como API, etc.?
Karan Chadha
1
Hola @KaranChadha, si tienes una pregunta, hazla como una pregunta formal usando el botón 'Hacer pregunta' en la parte superior de la página. Un hilo de comentarios sobre una pregunta de hace 7 años probablemente no atraerá la atención adecuada. Por supuesto, está bien agregar un enlace a esta pregunta y respuesta, o incluso a esta respuesta específicamente. Puede usar el botón 'compartir' en la parte inferior de cada publicación para eso.
GolezTrol
¿Es esto cierto? Las cookies generadas por el cliente no parecen transferirse. Si lo hace document.cookie="foo=bar"seguido de, fetch("/foobar", {credentials: 'include'} )no se envía ninguna cookie que contenga foo=bar. Probé ese código directamente en este sitio usando DevTools y la consola.
oligofren
Sí, es cierto, dicen también los documentos , pero hay algunos detalles que pueden causar esto, como el atributo caduca que falta.
GolezTrol
1
@MarinosAn Sí se puede. Pero mi respuesta fue un poco breve en lo que respecta a los atributos que modifican el comportamiento de la cookie, así que la expandí un poco ahora.
GolezTrol
4
  1. Sí, puede crear cookies que solo se pueden leer en el lado del servidor. Se denominan cookies "Solo HTTP", como ya se explicó en otras respuestas.

  2. No, no hay forma (que yo sepa) de crear "cookies" que solo se puedan leer en el lado del cliente. Las cookies están destinadas a facilitar la comunicación cliente-servidor.

  3. PERO, si desea algo COMO "cookies solo para clientes", hay una respuesta simple: use "Almacenamiento local".

El almacenamiento local es sintácticamente más sencillo de usar que las cookies. Puede encontrar un buen resumen simple de cookies frente al almacenamiento local en:

https://courses.cs.washington.edu/courses/cse154/12au/lectures/slides/lecture21-client-storage.shtml#slide8

Un punto: puede usar cookies creadas en JavaScript para almacenar cosas relacionadas con la GUI que solo necesita en el lado del cliente. PERO la cookie se envía al servidor para CADA solicitud realizada, se convierte en parte de los encabezados de solicitud http, lo que hace que la solicitud contenga más datos y, por lo tanto, sea más lenta de enviar.

Si su página tiene 50 recursos como imágenes, archivos css y scripts, la cookie se envía (normalmente) con cada solicitud. Más sobre esto en ¿Cada solicitud web envía cookies al navegador?

El almacenamiento local no tiene esas desventajas relacionadas con la transferencia de datos, no envía datos. Eso es genial.

Panu Logic
fuente