Para abordar el "¿Por qué?" En parte, la razón por la que los navegadores no aplican la Política del mismo origen (de la cual CORS es una relajación) para WebSockets a diferencia de las llamadas AJAX, es porque los WebSockets se introdujeron después de que se estableció el valor de las solicitudes de origen cruzado y porque ' no están sujetos a SOP para empezar, la razón histórica de las verificaciones del lado del cliente CORS no se aplica.
Para AJAX, en los días de una Política de origen único general, los servidores nunca esperaban que un navegador autenticado enviara una solicitud desde un dominio 1 diferente , por lo que no necesitaban asegurarse de que la solicitud provenía de una ubicación confiable 2 , solo marque el cookie de sesión. Las relajaciones posteriores como CORS tuvieron que tener verificaciones del lado del cliente para evitar exponer las aplicaciones existentes a abusos al violar esta suposición (efectivamente haciendo un ataque CSRF ).
Si la Web se estuviera inventando hoy, sabiendo lo que sabemos ahora, no se requerirían ni SOP ni CORS para AJAX y es posible que toda la validación quede en manos del servidor.
WebSockets, al ser una tecnología más nueva, está diseñado para admitir escenarios de dominio cruzado desde el principio. Cualquiera que escriba la lógica del servidor debe ser consciente de la posibilidad de solicitudes de origen cruzado y realizar la validación necesaria, sin la necesidad de tomar precauciones estrictas en el lado del navegador al estilo CORS.
1 Esta es una simplificación. Las solicitudes de recursos GET de origen cruzado (incluidas las etiquetas <img>, <link> y <script>) y las solicitudes POST de envío de formularios siempre se permitieron como una característica fundamental de la Web. Hoy en día, las llamadas AJAX de origen cruzado cuyas solicitudes tienen las mismas propiedades también están permitidas y se conocen como solicitudes simples de origen cruzado . Sin embargo, no se permite acceder a los datos devueltos de tales solicitudes en código a menos que lo permitan explícitamente los encabezados CORS del servidor. Además, estas solicitudes POST "simples" son la razón principal por la que los tokens anti-CSRF son necesarios para que los servidores se protejan de sitios web maliciosos.
2 De hecho, ni siquiera estaba disponible una forma segura de verificar el origen de la solicitud, ya que el Referer
encabezado se puede falsificar, por ejemplo, mediante una vulnerabilidad de redireccionamiento abierto. Esto también muestra cuán mal se entendían las vulnerabilidades CSRF en ese entonces.