on your mark
[HTTP] OPTIONS, Preflight Request 본문
타사에 ajax 요청했는데 자꾸 결과창이 두번 뜨는 오류 발생
함수가 2번 호출되는 것도 아니고 응답값이 2번 오는 것도 아님 (구조 상 1번 요청하면 결과 창이 뜨는 구조)
뭐가 문제일까 네트워크 탭 뒤져보다가 OPTIONS 요청 메소드가 한번 찍혀있고 그 다음에 원래 요청이 가네,,,?

https://devolive.tistory.com/10
[HTTP] CORS
프론트 공부하면서 제일...은 아니고 머리 아프게 했던 여러 가지 문제 중 하나인 SOP/CORS CORS (Cross-Origin Resource Sharing) SOP에 위배되어도 XHR에 의해 resource를 사용할 수 있는 것을 의미 SOP SOP는 s..
devolive.tistory.com
CORS 정리한 내용은 여기
CORS 요청에는 두가지 종류가 있음
1. Simple (GET & POST) Request
2. PUT과 같은 다른 HTTP요청, 추가 헤더가 있는 요청 등
Simple Request
simple request는 아래의 경우만 허용된다.
- GET, HEAD, POST 메소드만 가능
- Request의 Content-Type은 다음만 가능
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
- custom header는 허용하지 않음
- 유저 에이전트가 자동으로 설정 한 헤더는 가능
- 그 외 가능한 header는 Fetch명세서 참고
Preflight Request
조금 더 복잡한 요청에 대해 브라우저는 OPTION method를 통해 Preflight Request를 할 것.
(복잡하고 많은 양의 데이터를 서버로 보낸다고 가정해보자. Front에서 처리하고 파싱하고 담았는데 POST요청을 허용하지 않는다면 자원낭비가 되므로, 이를 방지하기 위해 서버에서 어떤 메서드와 어떤 header를 허용하는지 확인 과정이 필요하게 된다. -> 이 과정이 Preflight)
(CORS의 경우 보안 문제도 있음)
이를 위해 해당 서버로 OPTIONS를 미리 보내고 해당 응답을 확인한 후 HTTP Method가 지원된다면 실제 요청이 이루어지게 됨
OPTIONS를 preflight하여 서버에서 허용하는 옵션을 미리 확인하고, 허용되지 않은 요청의 경우 405(Method Not Allowed)에러를 발생시키고 실제 요청은 전송하지 않음
- 브라우저에서 method를 OPTIONS로 요청 전송
- OPTIONS를 받은 서버가 응답헤더에 허용하는 옵션(Access-Control-Allow-*)을 포함해 전송
- 브라우저는 응답헤더의 옵션을 확인해 허용되지 않은 요청은 504에러 발생, 허용하는 경우 요청 전송
OPTIONS 요청 없애기
그래서 OPTIONS(preflight request)를 없앨 수 있을까?
- CORS상황이 되지 않도록 하는 것 -> 웹서버와 동일한 서버의 리소스만 사용하면 됨
하지만 API 서버가 분리되어 있는 경우가 많아 쉽지 않다.
특히 내 경우에는 타사 API를 사용하는 것이라 불가 - CORS에서 preflight가 발생하지 않는 조건을 모두 만족시키는 것이다.(simple requets)
하지만 이것도 일반적으로 인증을 위한 헤더를 포함하거나, 최근엔 Content-Type으로 application/json을 사용하는 경우가 많기 때문에 적용하기는 어려울 수 있다.
결론
열심히 검색하고 삽질하다가 결국 팀장님께 문의... 했더니 서버측에 문의하기로 하고 결론은 preflight request도 가고 응답값도 잘 오는데 창이 하나 뜨는 걸로 해결됨
삽질해서 공부했으니 그나마 다행이다.
'WEB > HTTP' 카테고리의 다른 글
[HTTP] CORS (0) | 2022.08.11 |
---|