Me resulta difícil entender un error que arroja mi aplicación cuando intento invocar una API REST.
Mi aplicación, un HTML puro, basado en JavaScript usando jQuery, se ejecuta en el servidor Jetty. El servidor ha implementado Content-Security-Policy :
Custom HTTP headers to be added to our responses: Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; base-uri 'self'; frame-ancestors 'self'; font-src 'self';frame-src 'self'|X-Frame-Options: SAMEORIGIN|X-Content-Type-Options: nosniff|X-XSS-Protection: 1; mode=block| Referrer-Policy: strict-origin|Feature-Policy: 'none'|Strict-Transport-Security: max-age=63072000; includeSubDomains; preloadEntiendo esta parte. Cualquiera que intente acceder a mi aplicación debe cumplir con estas restricciones.
Sin embargo, el código JavaScript en mi aplicación intenta llamar a una API REST Spring Boot que se ejecuta en la misma máquina virtual Linux (http://localhost:8080/... o http://server-host-name:8080/...) . Al hacerlo, se Content Security Policy violated when accessing http://localhost:8080...: content-src 'self' . Esto me confunde. Intentar acceder a mi aplicación en Jetty sin adherirse a la política de seguridad debería generar un error. Pero, ¿por qué arrojaría un error cuando la aplicación en Jetty está llamando a una API Spring Boot que no tiene tal restricción?
¿Necesito relajar la restricción de la política de seguridad de contenido en el servidor Jetty? Si es así, ¿por qué?
Resumen :
REST API: Spring Boot HTTP API ejecutándose en la misma VM de Linux
Jetty Server: restricción de CSP como se mencionó anteriormente
Aplicación de JavaScript en Jetty: llamando a la API Spring Boot
Brevemente : debe agregar http://localhost:8080 a la directiva default-src .
Tl; DR; : el token 'self' es insidioso, porque intuitivamente lo dotas de poderes que no logra cumplir.
Los navegadores reemplazan el token 'self' con el "origen de la tupla" ( esquema + nombre_de_host + número_de_puerto ) de la URL de la página desde la barra de direcciones del navegador, y luego agregan algo de magia específica de CSP:
ws: + host_name + ws_standard_portws: a wss: y http: a https: en navegadores CSP3Entonces que tenemos:
connect-src faltante, por lo tanto, el navegador usa default-src como respaldo.default-src 'self' en default-src http://your_domain.com:80 o default-src https://your_domain.com:443 (dependiendo de cómo cargue la página). Como puede ver, ninguno de estos permite http://localhost:8080 . Aunque en realidad localhost es un alias de your_domain.com , pero CSP no lo sabe, y solo bloquea debido a la falta de coincidencia de host_name + port_number .
Pero si va a cargar la aplicación con la URL http://localhost:8080/your_app_path , se permitirá buscar en REST API porque está cubierto por 'self'