Option 메소드에 대해 알아보기 전에 SOP 라는 웹 정책을 먼저 알아야 한다.
즉 같은 Origin으로만 요청을 주고 받을 수 있고, 다른 Origin으로의 Read를 제한한다.
Origin 기준 : URL의 Protocol, host, port가 일치하는 경우
SOP 없이 다른 Origin 문서와 상호작용이 가능하다면, 악의적인 의도를 가진 사용자가 작성한 스크립트가 정상적인 웹 사이트에서 실행이 가능하게 되어 유저들의 정보가 악의적인 사용자에게 유출될 수 있다.
이러한 문제를 SOP을 통해 다른 Origin문서를 읽지 못하게 막아 보안적인 이슈를 해결하였다.
하지만 이렇게되면 정상적인 사용자가 다른 웹사이트의 API를 긁어올 수 없게 된다.
그래서 SOP를 우회하기 위한 방법이 존재하는데, 가장 권장하는 방법이 CORS이다.
CORS (Cross-Origin Resource Sharing)은 HTTP Header에 추가적인 정보를 추가해서 서버가 브라우저에게 자기 자신뿐 아니라 다른 Origin에서 요청한 정보도 허용할 수 있도록 알려주는 것이다.
A 사이트가 B 사이트의 API를 사용하고 싶으면 B 사이트에 A가 요청을 보내도 되는지 물어봐야 한다.
이 과정을 Pre-flight 라고 부르는데, A에서 B에게 요청을 보낼 때 http Header에 origin : A 라고 출처를 명시해주고, 서버가 다시 응답을 보낼 때 http header에 access-control-allow-origin-'허용하는 주소'로 CORS를 허용할 URI를 명시한다.
그러면 브라우저에서 http Header를 분석 후 요청을 승인할지 거부할지 판단하고, 승인 시 본래 하려던 요청을 서버에 보낸다.
이런 Pre-flight 절차에서 서버에게 요청할 때 사용하는 http 메소드가 option 메소드이다.
1. 클라이언트는 서버로 option 요청에 Origin 헤더를 담아 보낸다.
2. 서버는 응답으로 Access-control-allow-origin 헤더에 CORS를 허용하는 URI 목록을 보낸다.
3. 해당 응답을 브라우저가 해석 후 CORS가 허용되었다고 판단하면 POST 요청을 서버로 보낸다.
option는 서버에서 추가 정보를 판별할 때 사용하는 HTTP/1.1 메서드이다.
그러나 항상 option을 요청하는게 아니라 아래 3가지 조건이 만족해야 pre-flight 과정을 생략하고, 조건이 충족되지 않는 경우 pre-flight 요청을 먼저 보낸다.
1. get,head,post 메소드 중 하나
2. user agent에 의해 자동 설정되는 해더 외 CORS-safelisted request-header로 명시된 헤더들만 포함된 경우 (Accept, Content-Language, Content-Type 등)
3. Content-Type의 경우 Application/x-www-form-urlencoded, multipart/form-data, text/plain 중 하나인 경우