Cookies casos de la vida real

He estado trabajando en un proyecto en Ruby on Rails últimamente que fue bastante desafiante ya que presentaba varios escenarios en el que se pueden usar cookies de manera distinta. Aventurarme con cookies me ha hecho aprender bastante sobre cómo se configuran y comportan. Deseo compartir este conocimiento ya que no hay mucha información por ahí y quiero hacer una recopilación que sirva como guía a futuro. Este tutorial admite que tienes conocimiento de cómo crear un controlador y una acción en Rails.

Qué son las cookies?

Las cookies son pequeños archivos de texto que se guardan en el navegador y que pueden accederse desde el Front-end o enviarse al Back-end.

Para qué sirven?

Por fin vas a entenderlo de una manera super fácil: El protocolo HTTP que maneja la comunicación entre front-end y back-end no guarda ningún tipo de estado (esto en ingles se lo conoce como stateless), o sea cuando estás en un pagina y le das a un link o a un botón y el mismo manda información al back-end la próxima acción que realices será una acción completamente nueva para el servidor. Te doy un ejemplo:

Dale click a los pasos:

1Front-end

Llenas el formulario de inicio de sesión en tu sitio web favorito de programación en Rails.

2Back-end
3Front-end
4Front-end Back-end

¿Te quedo claro? Si no, volvelo a leer porque para entender lo que viene el concepto debe quedarte claro.

Configurando una cookie

Vamos a la acción. Abrí: app / controllers / application_controller.rb en tu app de Ruby on Rails y escribe lo siguiente:

Entendamos el código de arriba: Lo único que estás haciendo es crear un callback para que el método set_cookie se llame antes de cualquier otra acción. Dentro del método creamos la nueva cookie con el nombre de “my_first_cookie” y luego le asignamos un valor de 'Learning cookies with Rails Genius'. Listo ya está creada tu cookie. Ahora arrancamos nuestro servidor de Rails con el comando rails server y visitamos la direccion localhost:3000 en nuestro navegador. Abrimos la pagina principal en nuestro navegador y la podemos ver en la pestaña apps del developer tools (Puedes apretar f9 para abrilo)

Propiedades de una cookie

my_cookie:

El nombre de tu cookie. Ponle el nombre de la chica que te gustaba y te rechazó por ser programador 😅. Una buena práctica es poner un nombre intuitivo y que comience con barra baja: _misitio_session

value:

Es el valor que le quieres dar a tu cookie. No pongas cosas complejas como modelos de active record, es mejor  mantener el valor lo más simple posible. Por ejemplo si quieres guardar un modelo de active record solo guarda su id y luego lo buscas con eso

domain:

La propiedad domain nos dice que dominio o subdominio puede acceder (leer) la cookie. Veamos algunos ejemplos:

Nuestro Dominio sera: ruby_latam.com
El subdominio que creó la cookie sera noticias.ruby_latam.com

Sin poner la propiedad domain

Solo enviará la cookie al subdominio que la creó y a ningún otro.

  • noticias.ruby_latam.com SI podrá leer la cookie

  • empleos.ruby_latam.com NO podrá leer la cookie.

domain: .ruby_latam.com

Enviará a todos los subdominios.

  • noticias.ruby_latam.com SI podrá leer la cookie

  • empleos.ruby_latam.com SI podrá leer la cookie.

domain: :all

Enviará a todos los subdominios.

  • noticias.ruby_latam.com SI podrá leer la cookie

  • empleos.ruby_latam.com SI podrá leer la cookie.

domain: %w(.ruby_latam.com .ruby_europe.org)

Enviará a diferentes dominios.

  • noticias.ruby_latam.com SI podrá leer la cookie

  • empleos.ruby_europe.org SI podrá leer la cookie.

secure:

Si es true quiere decir que la cookie solo se transmitirá desde sitios web que tengan https. Si estas en localhost haciendo pruebas ponla en false.

Tip: con el siguiente comando se pondra en false si estas en develpment y true si estas en produccion:

http_only:

Si esta opción está como true el Front-end NO podrá leer la cookie sólo podrá descifrarla el Back-end.

expire_after:

El tiempo en que expira la cookie una vez que no tenga actividad. Si le pones una hora a cada nuevo request se actualiza de nuevo para una hora más.

same_site:

none: Permite que la cookie se envíe desde cualquier sitio externo. Esto puede ocasionar que te hackeen con un ataque Cross Site Request Forgery. Tengo un post en el que te explico como funciona:

Entendiendo como funciona el CSFR en Ruby on Rails

lax: Este valor es una buena opción por defecto, ya que permite que las cookies se envíen en la mayoría de las solicitudes de navegación de nivel superior, pero las bloquea en contextos de cross-site en ciertos casos, como formularios POST enviados desde otros sitios. En otras palabras va a aceptar request de tipo GET desde otros sitios.

strict: En este caso solo se enviará la cookie desde el dominio que la creó. Por ejemplo la cookie fue creada en blog.ruby_latam.com asi que el front-end debe estar igual en blog.ruby_latam.com porque sino no la mandará. Por ejemplo, si tu front-end está en front_end.ruby_latam.com NO se mandará la cookie.

Volviendote Genio en Cookies de Ruby on Rails 🤯

Practiquemos todo lo que ya sabemos: Crea una nueva app de rails y luego genera un controlador en tu terminal así:

Abre tu nuevo controlador y en la accion set_cookies crearemos nuestra nueva cookie:

Como ves la cookie se encuentra allí y está lista para leerse. Ahora vamos a nuestra próxima acción y pongamos lo siguiente:

Abrimos la vista correspondiente en app/ views/ handle_cookies/ set_cookie.html.erb y ponemos lo siguiente:

Y el resultado ya lo podemos ver si vamos a la siguiente url:

Ten en cuenta que le pusimos el tiempo de expiración en 5 minutos, si te tardas mucho en hacer todo el procedimiento puede ser que la cookie desaparezca. Para volverla a generar solo visita la primera acción nuevamente. Listo 🎉🎉🎉🎉

Dejando atras el nível junior 🏋️🥇

Ahora veremos unos casos más avanzados.

Cookie Signed

Suponte que quieres mandar una cookie al frontend para que lea la información pero no quieres que alguien malicioso pueda modificarla. Para eso existe cookies.signed. Lo que hará será mandar la información al frontend pero firmada con una clave que solo tiene el backend, si en algún momento la información es alterada la cookie dejará de ser valida y devolverá nil.

Creando:

Recuperando

Cookie Encrypted

Esta cookie igual que la anterior ira firmada pero con la diferencia que los datos estaran encriptados y el frontend no podra leerla.

Cookie Permanent

Esta cookie tendra una validez de 20 años. Usala si quieres que los datos esten accesibles por un largo periodo de tiempo

Tip: Todos estos métodos pueden encadenarse:

Espero que hayas conseguido entender como funcionan las cookies. No te olvides que solo este es el comienzo y debes profundizar en otros aspectos luego por tu cuenta.

Ruby on Rails es un framework maravilloso que impulsa la creacion rapida y que su comunidad cree firmemente que hay formas de avanzar en la tecnologia sin tener que destruirnos entre todos nosotros. Un saludo y hasta la proxima.

Post a new comment. It's cool!

Developed in Bolivia 🇧🇴 by Marcelo Alarcón