프로그래밍/프론트엔드

preflight시에 get만 cors에러나는 이유(post와의 차이 - origin null)

브래드 킴 2023. 1. 12. 11:28
728x90

preflight -> xhr

로컬 브라우저에서 api서버로 리소스를 요청할때 아래와 같이 XHR (XML Http Request) 요청을 보내기 전에, preflight를 통해, 서버의 허용여부를 체크하게 된다.

 

preflight시 get요청은 CORS에러 발생

서버와 도메인이 다르다면, CORS에러가 날 것이고 서버에서 CORS를 허용해준다면 요청이 정상적으로 처리 되어야 한다.

그런데, 서버에서 CORS에 대한 전체 허용을 해줘도 GET요청은 아래와 같이 에러가 발생한다. POST는 정상이다.

 

orgin null이 문제

이유가 무엇일까? 일단 서버 프로그램을 하나씩 뜯어봐야 하지만, 결론을 말하자면 request헤더에 담겨 있는 origin이 null이라는 것이 문제이다.

 

Spring 서버 프로그램의 경우

서버 프로그램마다 다를 것이지만, Spring의 경우 cors util에 아래와 같은 코드가 있어, origin이 null인 경우엔 cors에러 처리가 되도록 설정되어 있다.(아무리 cors를 아래와 같이 허용한다고 하더라도)


post요청도 origin이 null인데, 왜 post요청은 정상적으로 preflight에서 허용이 되는가?

크롬에서 post요청의 경우 origin 자동 setting

검색을 해보면, reference가 많이 나오지는 않는다. 그나마 찾은 곳은 여기. 여기에 나도 댓글을 달긴 했는데, 원인은 크롬브라우저에서 get/head 요청을 제외하곤 나머지 요청에 대해서는 origin을 setting하여 send한다는 것이다.

오픈된 chrome resource 의 414줄을 보면 주석과 함께 아래와 같은 코드가 있음을 알수가 있다.

  if (httpMethod() == HTTPNames::GET || httpMethod() == HTTPNames::HEAD)
    return false;

  // For non-GET and non-HEAD methods, always send an Origin header so the
  // server knows we support this feature.


get/head요청을 제외한 post 등의 요청에서는 항상 origin에 값을 알아서 세팅해준다는 것이다. 물론, 서버프로그램마다 cors에 대한 허용기준이 유사하긴 하지만 다를수 있으므로 이점도 참고하시길 바란다.

728x90