¿Hay razones para no usar JSONP para solicitudes AJA~X?

Como desarrolladores web, uno de nuestros principales objetivos es asegurar que las aplicaciones que creamos sean funcionales, eficientes y seguras. Al tratar con solicitudes AJAX, una técnica común que a menudo surge es JSONP (JSON con Padding). Usado predominantemente para hacer solicitudes entre dominios, JSONP explota el hecho de que las etiquetas <script> pueden cargar contenido de cualquier dominio. Sin embargo, ¿hay una justificación para evitar JSONP, especialmente cuando ni siquiera estamos tratando con situaciones entre dominios?

En esta publicación, exploraremos a fondo las razones por las que quizás quieras pensarlo dos veces antes de incorporar JSONP en tu aplicación AJA~X.

¿Qué es JSONP?

JSONP significa JSON con Padding. Es un método que permite a los desarrolladores solicitar datos de un servidor que reside en un dominio diferente al de su aplicación. Este método elude la política de mismo origen inherente en los navegadores web, que de otro modo bloquearía dicha solicitud.

Aquí hay un ejemplo rápido de cómo podría verse una solicitud JSONP:

function handleResponse(data) {
    console.log(data);
}

let script = document.createElement('script');
script.src = 'https://example.com/data?callback=handleResponse';
document.body.appendChild(script);

Desventajas de usar JSONP

A pesar de su facilidad de uso y la manera ingeniosa en que elude problemas entre dominios, JSONP no está exento de inconvenientes. Aquí hay varios factores importantes a considerar:

1. Falta de manejo de errores

  • Una preocupación significativa con JSONP es la ausencia de manejo de errores.
  • Si ocurre un error al hacer una solicitud, no hay una forma integrada de capturarlo en nuestro código JavaScript. En lugar de una respuesta de error bien definida, simplemente recibes una inyección de script que o bien funciona o no.
  • Para gestionar esto, necesitarías asegurarte de que tu servidor siempre devuelva una respuesta JSON correctamente formateada.

2. Vulnerabilidades de seguridad

  • Al igual que cualquier método que implique ejecutar dinámicamente scripts de fuentes externas, JSONP deja espacio para posibles preocupaciones de seguridad.
  • Un atacante podría potencialmente devolver scripts maliciosos si tiene control sobre el servicio que estás llamando.
  • Para mitigar el riesgo, puedes comprobar el referer en el script del lado del servidor, pero esto no es infalible.

3. Variabilidad en el comportamiento del navegador

  • El comportamiento de las etiquetas <script> generadas dinámicamente puede diferir entre varios navegadores. Podrías enfrentar resultados inesperados simplemente dependiendo de la elección del navegador del usuario.

4. Flexibilidad limitada

  • Con JSONP, no puedes cancelar o reintentar solicitudes fácilmente, como podrías con otros métodos como XMLHttpRequest o fetch.
  • Esta inflexibilidad puede llevar a situaciones donde tengas que manejar de manera adecuada solicitudes en curso, lo que puede complicar la lógica de tu aplicación.

5. Dificultades para depurar

  • Depurar problemas que surgen de JSONP puede ser a menudo más desafiante, ya que los errores no se devuelven como las solicitudes AJAX tradicionales.

Conclusión

Usar JSONP a veces puede parecer una solución rápida, especialmente cuando trabajas en solicitudes entre dominios. Sin embargo, cuando evalúas los posibles riesgos de seguridad, la falta de manejo de errores y otras limitaciones mencionadas arriba, queda claro que este enfoque puede no ser el más adecuado para cada aplicación, especialmente cuando ni siquiera requieres funcionalidad entre dominios.

Explora otras técnicas como CORS o solicitudes AJAX estándar, ya que pueden proporcionar una alternativa más robusta y segura. Recuerda, siempre es mejor sopesar los pros y los contras según las necesidades de tu proyecto específico antes de decidir el enfoque correcto.

Al mantenerte informado sobre las posibles desventajas de herramientas como JSONP, puedes tomar decisiones más educadas que prioricen tanto la funcionalidad como la seguridad de tus aplicaciones.