OPTIONS 요청에 대한 이해

Caesars·2022년 8월 12일
1

http

목록 보기
1/2

서버에 알 수 없는 요청들이 들어와서 Spring Filter 를 사용해 POST를 제외한 다른 요청을 필터링 했습니다. 문제는 필터링을 하고 나니 정상적인 POST 요청까지 거부되고 있었습니다. OPTIONS 에 대해 인지를 하지 못했기 때문에 벌어진 일인데 더 잘 알고 사용하고자 하는 생각에 글을 작성합니다.


웹 개발을 하다 보면 네트워크 요청시 실행한 요청(GET, POST 등) 전에 OPTIONS 요청이 발생하는 것을 볼 수 있습니다. 항상 발생하는 것이 아니고 요청 도메인이 서버와 다른 경우에만 발생하는데 이는 CORS와 관련이 있습니다.

CORS

기본적으로 SOP(동일 출처 정책)때문에 다른 출처에서 리소스를 받아오는 것이 제한됩니다. 하지만 동일한 출처가 아닌 다른 출처에서의 데이터를 주고 받는 일이 필요할 때가 있기에 이러한 문제를 해결하기 위해 나온 정책이 바로 CORS(교차 출처 자원 공유) 입니다. CORS의 동작은 Preflight Request 를 통해 이루어집니다.

Preflight Request란

클라이언트에서 요청하려는 URL이 외부 도메인일 경우, 웹브라우저에서 자체적으로 실행됩니다.
해당 서버로 OPTIONS 를 미리 보내보고 해당 응답을 확인한 후, 보내려고 하는 Http Method 를 지원하면 실제 요청이 이뤄지게 되는 것입니다. preflight request는 실질적인 요청 전 OPTIONS 메소드를 통해 사전에 요청이 안전한지 확인하는 방법입니다.

Request headers

  • Origin: 요청 도메인
  • Access-Content-Request-Method: 요청 메서드
  • Access-Control-Request-Headers: 요청시 사용 헤더

Response headers

  • Access-Control-Max-Age : 클라이언트에서 Preflight 의 요청 결과를 저장할 기간. 응답을 받은 후 페이지를 새로 고침 해보면 해당 시간 동안은 Preflight 요청을 하지 않는 것을 알 수 있습니다.
  • Access-Control-Allow-Methods : 요청을 허용하는 메서드, 기본값은 GET, POST. 이 헤더가 없으면 GET과 POST요청만 가능합니다. 이 헤더가 있으면 클라이언트는 해당하는 메서드일 경우에만 실제 요청을 시도합니다.
  • Access-Control-Allow-Origin : 리소스에 접근할 수 있도록 허용하는지를 알려줍니다

결론

OPTIONS 요청은 http와 관련된 웹 표준이기 때문에 사용자가 OPTIONS 요청을 사용하고 말고의 문제는 아닙니다. 따라서 서버에서 특정 요청을 거부하도록 설정해도 OPTIONS 요청까지 막아서는 안됩니다. 이 문제는 Front나 Back에서 공통적으로 마주치는 문제로 보이기에 양쪽 개발자 모두 기본적으로 알고 있어야 될 듯 합니다.


참고

https://nukeguys.github.io/dev/options-request
https://stackoverflow.com/questions/15381105/what-is-the-motivation-behind-the-introduction-of-preflight-cors-requests
https://stackoverflow.com/questions/38375124/what-is-the-reason-behind-using-option-request-before-post-on-cors-requests
https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-http-options-%EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%99%80-cors%EB%9E%80/
https://wonit.tistory.com/571

profile
잊기전에 저장

0개의 댓글