OPTIONS
Uso
Una solicitud OPTIONS obtiene los métodos permitidos y las capacidades de un recurso de destino sin ejecutar ninguna acción sobre él. El servidor responde con una cabecera Allow que enumera los métodos admitidos.
Cuando se utiliza un asterisco (*) como destino de la solicitud, esta se aplica al servidor en su conjunto y no a un recurso concreto.
OPTIONS * HTTP/1.1
Host: api.example.re
Comprobación previa de CORS
El uso más habitual de OPTIONS en la práctica es la solicitud de comprobación previa (preflight) de CORS. Antes de enviar una solicitud de origen cruzado con un método fuera del conjunto incluido en la lista segura de CORS, con cabeceras personalizadas o con un Content-Type fuera del conjunto de la lista segura (application/x-www-form-urlencoded, multipart/form-data, text/plain), el navegador envía automáticamente una solicitud OPTIONS al servidor de destino. La comprobación previa verifica si el servidor permite la solicitud real.
La solicitud de comprobación previa incluye Origin, Access-Control-Request-Method y, opcionalmente, Access-Control-Request-Headers. El servidor responde con Access-Control-Allow-Origin, Access-Control-Allow-Methods y Access-Control-Allow-Headers para indicar su aprobación.
Capacidades del recurso
Un cliente consulta los métodos permitidos para un recurso concreto. El servidor responde con 204 No Content y una cabecera Allow.
Solicitud
OPTIONS /articles HTTP/1.1
Host: api.example.re
Respuesta
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, POST, DELETE
Consulta de ámbito global del servidor
Usar * como destino revela los métodos que el servidor admite en general, con independencia de cualquier recurso concreto.
Solicitud
OPTIONS * HTTP/1.1
Host: api.example.re
Respuesta
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD
Comprobación previa de CORS
Un navegador prepara una solicitud PUT de origen cruzado con una cabecera personalizada X-Request-ID. Antes de enviar la solicitud real, el navegador emite una solicitud OPTIONS de comprobación previa para confirmar que el servidor permite ese método y esa cabecera desde el origen solicitante.
Solicitud de comprobación previa
OPTIONS /api/data HTTP/1.1
Host: api.example.re
Origin: https://example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Request-ID
Respuesta de comprobación previa
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, PUT, DELETE
Access-Control-Allow-Headers: X-Request-ID
Access-Control-Max-Age: 86400
El valor de Access-Control-Max-Age indica al navegador que almacene en caché el resultado de la comprobación previa durante 86.400 segundos (un día), lo que evita repetir las solicitudes de comprobación previa para el mismo endpoint.
Seguridad
Las respuestas OPTIONS incluyen una cabecera Allow que enumera todos los métodos que admite el recurso. Esto constituye una divulgación menor de información, y los escáneres de seguridad suelen señalar un endpoint OPTIONS habilitado como hallazgo. Deshabilitar OPTIONS por completo no es una solución práctica, porque las solicitudes de comprobación previa de CORS necesitan OPTIONS para funcionar.
El enfoque recomendado consiste en limitar la cabecera Allow únicamente a los métodos que cada endpoint necesita. Un recurso que acepta GET y POST no debería anunciar DELETE ni PUT en la lista de Allow.
Algunos frameworks admiten una cabecera X-HTTP-Method-Override para encapsular PUT, PATCH o DELETE dentro de una solicitud POST. Esto elude los controles de acceso basados en el método y supone un riesgo de seguridad si la función no se habilita y audita de forma explícita.
Para evitar solicitudes de comprobación previa innecesarias, mantenga las solicitudes de origen cruzado dentro de los criterios de las solicitudes “simples”: GET, HEAD o POST únicamente con cabeceras de la lista segura y tipos de contenido de la lista segura. Usar Content-Type: application/json siempre desencadena una comprobación previa. Access-Control-Max-Age almacena en caché los resultados de la comprobación previa para reducir los viajes de ida y vuelta repetidos de OPTIONS.