Entender CORS

He estado buscando en la web sobre CORS, y quería confirmar si lo que hice fue lo que realmente es.

Mencionado a continuación es un escenario totalmente ficticio.

Tomaré un ejemplo de un sitio web normal. Digamos que mi página html tiene un formulario que toma un nombre de campo de texto. Al enviarlo, envía los datos del formulario a myPage.php . Ahora, lo que ocurre internamente es que el servidor envía la solicitud a www.mydomain.com/mydirectory/myPage.php junto con los campos de texto. Ahora, el servidor ve que la solicitud fue despedida del mismo dominio / puerto / protocolo

( Pregunta 1. ¿Cómo sabe el servidor acerca de todos estos detalles? ¿De dónde extrae todos estos detalles? )

Sin embargo, dado que la solicitud se origina desde el mismo dominio, el servidor ejecuta el script php y devuelve lo que se requiere de él.

Ahora, por el bien de la discusión, digamos que no quiero llenar manualmente los datos en el campo de texto, sino que quiero hacerlo programáticamente. Lo que hago es crear una página html con javascript y lanzar una solicitud POST junto con los parámetros (es decir, los valores de textField). Ahora que mi solicitud no proviene de ningún dominio como tal, el servidor no tiene en cuenta el servicio de mi solicitud. y obtengo un error de dominio cruzado?

Del mismo modo, podría haber escrito un progtwig Java también, que haga uso de HTTPClient / Post request y haga lo mismo.

Pregunta 2: ¿Es este el problema?

Ahora, lo que nos proporciona CORS es que el servidor dirá que “cualquiera puede acceder a myPage.php”. De enable cors.org dice que

Para solicitudes CORS simples, el servidor solo necesita agregar el siguiente encabezado a su respuesta: Access-Control-Allow-Origin: *

Ahora, qué es exactamente lo que el cliente va a hacer con este encabezado. Como en, el cliente de todos modos quería hacer una llamada a los recursos en el servidor ¿verdad? Debería estar al servidor para configurarse solo con si desea aceptar o no, y actuar en consecuencia.

Pregunta 3: ¿De qué sirve devolver un encabezado al cliente (que ya ha hecho una solicitud al servidor)?

Y finalmente, lo que no entiendo es que, digamos que estoy creando algunos servicios RESTful para mi aplicación de Android. Ahora, digamos que tengo un servicio POST en www.mydomain.com/rest/services/myPost . Tengo mi servidor Tomcat alojando estos servicios en mi máquina local.

En mi aplicación de Android, simplemente llamo a este servicio y obtengo el resultado (si corresponde). ¿Dónde exactamente usé CORS en este caso? ¿Esto cae bajo una categoría diferente de llamadas al servidor? Si es así, ¿cómo exactamente?

Además, marqué Habilitar Cors para Tomcat y dice que puedo agregar un filtro en mi web.xml de mi proyecto web dynamic, y luego comenzará a aceptarlo.

Pregunta 4: ¿Es eso lo que habilita las llamadas desde mi dispositivo Android a mis servicios web?

Gracias

  1. En primer lugar, la verificación del dominio cruzado la realiza el navegador , no el servidor. Cuando JavaScript hace una XmlHttpRequest a un servidor que no sea su origen, si el navegador admite CORS, se inicializará un proceso CORS. O bien, la solicitud dará como resultado un error (a menos que el usuario haya reducido deliberadamente la seguridad del navegador)

  2. Cuando el servidor encuentra el encabezado HTTP de Origin , el servidor decidirá si está en la lista de dominios permitidos. Si no está en la lista, la solicitud fallará (es decir, el servidor enviará una respuesta de error).

Para los números 3 y 4, creo que debes hacer preguntas por separado. De lo contrario, esta pregunta será demasiado amplia. Y creo que se acercará rápidamente si no lo eliminas.

Para obtener una explicación de CORS, vea esta respuesta de los progtwigdores: https://softwareengineering.stackexchange.com/a/253043/139479

NOTA: CORS es más una convención. No garantiza la seguridad. Puede escribir un navegador malicioso que no tenga en cuenta la misma política de dominio. Y ejecutará JavaScript obtenido de cualquier sitio. También puede crear encabezados HTTP con encabezados de Origin arbitrarios y obtener información de cualquier servidor de terceros que implemente CORS. CORS solo funciona si confías en tu navegador.

Para la pregunta 3, debe entender la relación entre los dos sitios y el navegador del cliente. Como Krumia aludió en su respuesta, es más una convención entre los tres participantes en la solicitud.

Recientemente publiqué un artículo que detalla un poco más acerca de cómo están diseñados los accesos de CORS para funcionar.