Las sesiones y cookies son dos conceptos muy comunes en la web, y también son muy malentendidos. Sin embargo, son extremadamente importantes para la autorización de páginas, así como para tener información para estadísticas de las páginas. Echémos un vistazo a los dos siguientes casos de uso.
Supón que quieres acceder a una página que tiene acceso restringido al público, como el perfil de twitter de un usuario. Por supuesto que puedes abrir tu navegador y escribir tu usuario y contraseña para acceder a esa información, pero el concepto de "exploración web" significa usar un programa para automatizar este proceso sin intervención humana. Por consiguiente, tenemos que encontrar que está ocurriendo realmente detrás de bambalinas cuando vamos a usar un navegador para acceder.
Cuando por primera vez recibimos una página de acceso y escribimos un usuario y contraseña, después de presionar el botor de "entrar", el navegador envía una petición POST a un servidor remoto. El servidor redirecciona al usuario a su página de inicio después de verificar la información de acceso y retorna una respuesta HTTP. La pregunta aquí es ¿cómo el servidor sabe quien tiene privilegios de acceso a cierta página? Como HTTP es sin estado, el servidor no tiene cómo saber si se ha pasado la verificación en el paso anterior. La solución mas fácil e ingenua es pegar el nombre de usuario y la contraseña en la URL. esto funciona, pero coloca mucha presión en el servidor, porque siempre se debe validar un usuario y una contraseña en la base de datos, y puede hacer que la experiencia de usuario se deteriore. Una alternativa para lograr esta meta es guardar la identidad del usuario en el cliente y el servidor usando cookies y sesiones.
Las cookies, de una manera corta, almacenan información (incluyendo la información de acceso) en el computador del cliente. El navegador envía estas cookies cada vez que el usuario visita el mismo sitio, automáticamente completando el paso de acceso para el usuario.
Figure 6.1 principio de las cookies.
Las sesiones, por otro lado, guardan información histórica en el lado del servidor. El servidor utiliza un identificador de sesión para diferenciar las sesiones, y también este identificador es generado por el servidor y debería ser aleatorio y único. Puedes utilizar cookies o argumentos en la URL para obtener la identidad del cliente.
Figura 6.2 principio de las sesiones.
Las cookies son mantenidas por los navegadores. Ellas pueden ser modificadas durante la comunicación entre servidores web y navegadores. Las aplicaciones web pueden acceder a la información de las cookies cuando el usuario visita los sitios correspondientes. La mayoría de navegadores web tienen una configuración para determinar la privacidad de las cookies. Puedes ver algo similar cuando lo abres.
Figura 6.3 cookies en navegadores.
Las cookies tiene un tiempo de expiración, y se dividen en dos tipos por su ciclo de vida: las cookies de sesión y las cookies persistentes.
Si tu aplicación no le da a una cookie un tiempo de expiración, el navegador no la guardará en el sistema de almacenamiento después de que el navegador sea cerrado. Estas cookies son llamadas cookies de sesión y son guardadas usualmente en memoria en vez del sistema de almacenamiento permanente.
Si tu aplicación define un tiempo de expiración (por ejemplo, setMaxAge(60 * 60 * 24)), el navegador guardará esta cookie en el sistema de ficheros, y no la elimninará hasta que se alcance el tiempo de expiración. Las cookies guardadas en el sistema de ficheros pueden ser accedidas por diferentes instancias del navegador, por ejemplo, por dos ventanas de Internet Explorer; diferentes navegadores usan diferentes procesos para manejar las cookies que son guardadas en memoria.
Go usa la función SetCookie
del paquete net/http
para definir cookies:
http.SetCookie(w ResponseWriter, cookie *Cookie)
w
es la respuesta de la petición y es cookie una estructura. Vamos a ver como se ve:
type Cookie struct {
Name string
Value string
Path string
Domain string
Expires time.Time
RawExpires string
// MaxAge=0 significa que no esta especificado el atributo 'Max-Age'.
// MaxAge<0 significa elimiar la cookie ahora mismo, equivalente a 'Max-Age: 0'
// MaxAge>0 significa a cantidad de segundos que debe permanecer en memoria la cookie
MaxAge int
Secure bool
HttpOnly bool
Raw string
Unparsed []string // Texto plano con las parejas de atributos sin evaluar
}
Aquí está un ejemplo de cookie:
expiration := time.Now().Add(365 * 24 * time.Hour)
cookie := http.Cookie{Name: "username", Value: "astaxie", Expires: expiration}
http.SetCookie(w, &cookie)
El ejemplo de arriba muestra como definir una cookie. Ahora vamos a obtener una cookie que ha sido definida:
cookie, _ := r.Cookie("username")
fmt.Fprint(w, cookie)
Aquí hay otra manera de obtener una cookie:
for _, cookie := range r.Cookies() {
fmt.Fprint(w, cookie.Name)
}
Como puedes ver, es muy sencillo obtener cookies de las peticiones.
Una sesión es una serie de acciones o mensajes. Por ejemplo, piensa en las acciones que existen entre contestart el teléfono y colgarlo, esto es un tipo de sesión. Cuando se refiere a protocolo de red, las sesiones tienen que ver con las conexiones entre navegador y servidor.
Las sesiones ayudan a almacenar el estado de la conexión entre servidor y cliente, y esto puede ser en forma de estructuras de datos.
Las sesiones son mecanismos del lado del servidor y usualmente emplean tablas hash (o algo similar) para guardar la información que llega.
Cuando una aplicación necesita asignar una nueva sesión a un cliente, el servidor debe verificar si existen sesiones anteriores del actual cliente con un único identificador de sesión. Si la sesión ya existe, el servidor continúa con la misma sesión al cliente. Por otro lado, si una sesión no existe para el cliente, el servidor crea una nueva sesión (estu usualmente ocurre cuando el servidor ha eliminado el identificador de sesión correspondiente, pero el usuario ha usado la sesión anterior manualmente).
La sesión por si misma no es complicada, pero su implementación y despliegue lo es, así que no puedes usar "una regla que le sirva a todas".
En conclusión, el propósito de las sesiones y cookies es el mismo. Ambas son para superar las conexiones sin estado de HTTP, pero ellas usa diferentes métdos. Las sesiones usan cookies para guardar los identificadores de sesión en el lado del cliente, y guardan toda la demás información del lado del servidor. Las cookies guardan toda la información del lado del cliente. Puedes haber notado que las cookies tienen algunos problemas de seguridad. Por ejemplo, usuarios y contraseñas pueden ser descubiertas y recogidas por sitios web maliciosos de terceros.
Aquí están dos ataques comunes:
- La aplicación A define una cookie no esperada para la aplicación B.
- Ataques XSS: la aplicaión utiliza el Javascript
document.cookie
para acceder a las cookies de la aplicación B.
Después de finalizar esta sección, deberías saber algunos conceptos básicos de sesiones y cookies. También entender las diferencias entre ellas, así que no te mates la cabeza cuando los errores emergan. Discutiremos las sesiones en mas detalle en las secciones siguientes.
- Índice
- Sección anterior: Almacenamiento de datos y sesiones
- Siguiente sección: Como usar sesiones en Go