예를 들어 A라는 접근하고자하는 정상적인 사이트가 있고, B라는 악의적인 사이트가 있다.
사용자는 A에 로그인해 있고 그 상태가 유지되고 있다.
그것은 인증정보가 사용자의 브라우저에 쿠키로 저장되어 있다는 것을 의미한다.
그런데 A로부터 사용자의 정보를 빼내기 위해 해커들이 B라는 악의적인 사이트를 만들었다. 그리고 사용자가 페이지에 접속하도록 유도한다. 해당 페이지에 사용자가 접속을 하면 B가 만든 HTML, CSS, JS코드가 사용자의 브라우저에 받아와지고 그 코드가 사용자 브라우저에 무슨 짓을 시킬지 모르는 것(XSS)이다. 그리고 그곳엔 인증정보까지 있다.
XSS (Cross Site Script) 검증되지 않은 외부 입력 데이터가 포함된 웹페이지가 전송되는 경우, 사용자가 해당 웹페이지를 열람함으로써 웹페이지에 포함된 부적절한 스크립트가 실행되는 공격
A로부터 개인정보를 조회하는 요청에 사용자의 브라우저에 저장된 A페이지의 토큰을 실어서 A에 보낸 다음 그것으로 탈취한 정보를 B 서버로 보내버릴 수 있다. 즉 사용자의 의지와 상관없이 거기에 저장된 내 정보들을 가지고 악의적인 행위(CSRF)을 할 수가 있기 때문에 브라우저가 이런 것을을 방지하고 있었던 것이다.
CSRF (Cross-Site Request Forgery) 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격
정확히 말하자면 CORS는 그걸 막는게 아니라 오히려 풀어주는 역할을 한다. 요청을 막고 있는 건 SOP(Same-Origin Policy, 동일 출처 정책)가 하는 것이다.
SOP이라는 것은 말 그대로 동일한 출처, 똑같은 URL끼리만 API등의 데이터에 접근이 가능하도록 막는 막는 것이다.
CORS라는 것은 "이게 되게하려면 CORS라는 것을 허용해주던가 해라"라는 의미인 것이다.
CORS는 Cross Origin Resource Sharing 의 약자로, 동일 출처(Same-Origin)의 반대 개념이다. 말 그대로 다른 출처 간에 리소스를 공유할 수 있도록 하는 것이다.
이 다른 출처끼리 정보요청과 반환이 가능하도록 하는게 CORS라는 것이다.
정리하자면 CORS에서 요청들은 두 종류,
Simple request와 Preflighted 요청으로 나뉘는데
Simple request는 요청을 보내기는 다 보내는데 통과를 못하면 답장만 못 받아오는 것이고, Preflighted 요청은 요청을 '보내는'것도 일단 허락을 받아야한다.