No voy a explicar qué es CORS, la página de la wikipedia y cientos de web a golpe de búsqueda te lo explicarán. A mi gusta verlo como el gran bugfix del desarrollo web. Este post trata de explicar algunas de las dificultades que nos hemos encontrado en el uso de CORS después de dos años usándolo en producción.
Hasta ahora hemos estado usando JSONP y otros hacks para consumir servicios de dominios diferentes al que se ejecuta nuestra web app. Aunque tenga una siglas más o menos aparentes, detrás de ellas se esconde un hack horrible, que nunca debería haber existido. Alquien pensó que ya era hora de cambiar eso, que debería haber una tecnología que permitiese coger datos de dominios usando AJAX que no son el nuestro de forma segura. Y ahí entro CORS.
Nosotros en cartodb y otros proyectos de vizzuality usamos CORS cosas muy variopintas:
- poder manipular los píxeles de las imágenes (para hacer análisis raster en mapas)
- poder hacer POST y con enviar más datos de los que permite una petición GET
- consumir datos de nuesta API desde aplicaciones web sin necesidad de un backend
Decir que en ningún caso hemos usado autentificación, desconozco lo completo que será el tema, pero imagino que tendrá sus cosillas (hay tokens CSRF por ejemplo) de por medio.
Cuando digo que tenemos en producción quiero decir que hemos estado más de 9 meses basando nuestra arquitectura pública de mapas en CORS, quiero decir, ya hemos llegado a la fase de “esto functiona” a “vamos puliendo los detalles”. Cuando digo producción, digo millones de usuarios y en sitios con mucho tráfico y usuarios diferentes, por ejemplo, wikileaks, blog de twitter, lemonde, the guardian y otros con mucho más tráfico que no recuerdo.
Los problemas que nos hemos encontrado:
- INTERNET EXPLORER. Sí, las versiones anteriores no lo soportan y dependiendo de como le de [1] IE10 a veces reporta que tampoco lo soporta. Así que tendrás que tener un fallback ( leer la siguiente)
- Vas a necesitar un fallback: no puedes basar tu arquitectura en CORS, aunque los navegadores que soporten sean compatibles, hay muchos otros problemas (leer siguientes), así que vas a tener que tragar con JSONP o proxy en tu servidor.
- Algunos proxies eliminan las cabeceras de CORS. Cuando tu navegador web hace un OPTIONS antes de hacer la petición de verdad (necesita saber si puede de verdad hacerlo) si eliminan las cabeceras el navegador devolverá un error.
- El número de peticiones se multiplica. Hay que hacer un OPTIONS antes de hacer la petición real. No es que sea mucha carga, pero es una petición más que tus servidores tienen que tragar (no es cacheable según el standard y efectivamente los navegadores no las cachean), hay cierto lag y es un fastidio cuando estás desarrollando.
- Ahora ese problema ya no existe, pero durante este tiempo tanto chrome como FF han cambiado la forma de funcionar.
Para terminar, nosotros basamos todo nuestro API de mapas en CORS y teníamos como fallback JSONP. Hace cosa de 1 mes hemos pasado de usar JSONP como herramienta principal y CORS como fallback. Falta aún un tiempito para poder basar todo el sistema en CORS, pero desde luego es un gran avance en el desarrollo web.
Ya hay mucha gente incluyendo las cabeceras de CORS en sus servicios permitiendo hacer algunas cosas interesantes, por ejemplo, los tiles de los mapas de google los incluyen o algunos servicios de autentificación, por ejemplo openstreemap, permitiendo hacer oauth desde javascrip
[1] si está en modo compatibilidad IE10 no funciona CORS, pero incluso a veces en modo normal, tampoco.