웹 생태계에서 CSRF(Cross-Site Request Forgery)나 XSS(Cross-Site Scripting)와 같은 방법의 해킹을 방지하기 위해서 다른 Origin간의 리소스를 불러오는 것을 막아두었는데 대표적인 정책으로는 CORS와 SOP가 있다.
SOP는 다른 Origin에 요청하는 것을 완전히 제한하는 정책.
개발시에는 다른 Origin의 리소스를 불러와야할 때가 있기 때문에 예외적으로 다른 Origin의 리소소를 가져올 수 있도록 허락하는 정책이 CORS이다.
다른 출처에 있는 리소스를 가져와서 사용하는 일에 대해서 몇 가지 예외 조항을 두고 이 조항에 해당하는 리소스 요청은 출처가 다르더라도 허용하는 정책
일반적으로 웹 클라이언트가 다른 Origin으로 리소스 요청을 보낼때는 http요청을 보내게 됨. 이 때 브라우저는 요청 헤더에 Origin이라는 필드에 요청을 보내는 클라이언트의 Origin을 함께 보낸다.
서버가 이 요청에 대해서 응답을 할 때 응답 헤더의 access-control-allow-origin 이라는 값에 리소스 접근 허용 Origin을 지정해주고 이 응답을 받은 브라우저는 자신이 보냈던 Origin과 access-control-allow-origin을 비교하여 유효한 요청인지 확인한다.
브라우저가 서버에게 바로 클라이언트의 요청을 보내고 응답헤더에 access-control-allow-origin 값을 비교해 cors 정책 위반 여부를 판단하는 방식
본 요청을 보내기 전에 사전요청(preflight)을 보내서 안전하지 체크하는 방식
기본적으로 브라우저가 제공하는 비동기 리소스 요청 API인 XMLHttpRequest 객체나 fetch API는 별도의 옵션 없이 브라우저의 쿠키 정보나 인증과 관련된 헤더를 함부로 요청에 담지 않는다. 이때 요청에 인증과 관련된 정보를 담을 수 있게 해주는 옵션이 바로 credentials 옵션이다.
브라우저는 인증 모드가 include일 경우, 모든 요청을 허용한다는 의미의 *를 Access-Control-Allow-Origin 헤더에 사용하면 안되며, 명시적인 URL이여야 한다.
응답 헤더에는 반드시 Access-Control-Allow-Credentials: true가 존재해야한다.