웹 생태계에서 다른 출처로의 리소스 요청을 제한하는 정책중 하나로, 같은 출처의 리소스만 공유할 수 이도록 제한하는 정책이다.
자원의 위치는 여러개의 구성요소로 이루어져 있다.
이와 같은 URL에서 출처란 Protocol, Host, Port 번호를 의미하게 된다. 따라서 "출처가 같다"는 Protocol, Host, Port 번호가 같다는 것을 의미하게 된다. 이 중에서 Port 번호는 각 웹에서 사용하는 프로토콜에 따라 기본 번호가 정해져있기 때문에 생략이 가능하다.
오늘날 많은 사이트에서는 토큰이나 세션을 활용한 인증,인가를 사용하고 있다. 로그인을 통해 발급받은 토큰과 같은 정보들은 브라우저에 저장되어 해당 사이트로 요청을 보낼 때마다 함께 보내지게 된다. 문제는 토큰과 같은 정보가 브라우저에 저장되는 것이다.
자원에는 JavaScript 코드도 해당이 된다. 만약 사용자에게 이메일이나 피싱사이트를 통해 악성사이트에서 자원을 요청하게 만들면, 사용자의 브라우저로 악성 JavaScript 코드를 보내 악의적인 동작을 수행할 수 있게 되는 것이다.
예를 들어 사용자가 네이버에 로그인하여 브라우저에 토큰이나 세션과 같은 정보를 가지고 있는 경우이다. 해커는 피싱메일이나 사이트를 통해 브라우저에서 의도된 동작을 수행하는 코드를 사용자에게 전송하게 된다. 사용자의 브라우저는 해당 코드대로 동작하며 브라우저의 정보들을 사용하여 네이버 사이트에 사용자 정보 조회와 같은 동작들을 수행하게 된다.
만약 SOP가 없는 경우 이와 같이 서로 다른 사이트끼리 데이터를 주고받을 수 있게 되어 해킹으로부터 취약점이 생길 수 있다. 따라서 애초에 서로 다른 사이트로부터 리소스를 받을 수 없게 만들어 이와 같은 위험을 제거하는 것이 SOP이다.
웹 생태계가 다양해지며 여러 서비스들끼리 자유롭게 데이터가 주고받아질 필요가 생겼다. 하지만 위에서 설명했듯 다른 사이트간의 요청들은 해킹으로부터의 취약점이기 때문에 SOP에 따라 브라우저가 막고 있다. 따라서 서로 다른 사이트간의 요청들을 허용하기 위해 어떤 기준을 충족시키면 리소스 공유가 가능하게 만들기 위한 매커니즘이 CORS이다.
https://evan-moon.github.io/2020/05/21/about-cors/
https://velog.io/@jesop/SOP%EC%99%80-CORS
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-CORS-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%F0%9F%91%8F