SOP는 한 출처(origin)에서 로드한 리소스(도큐먼트 또는 스크립트)가 다른 출처에서 로드한 리소스와 상호 작용하는 것을 제한하는 보안 메커니즘이다.
출처의 구성요소는 다음과 같다.
동일 출처: 출처의 모든 구성요소가 동일한 출처
교차 출처(또는 다른 출처): 출처의 구성요소가 하나라도 다른 출처
출처 구성요소 예시
http://store.company.com/dir/page.html
다른 URL과 출처 비교 예시
프로토콜
이 https이다.호스트
가 new.company.com이다.포트
가 81이다.SOP가 없는 경우 다음과 같은 보안 문제가 발생할 수 있다.
하지만 SOP가 존재하기 때문에 공격자의 요청은 거부된다. 사실 이건 CORS와도 관련이 있는데 CORS 정책에 따라 브라우저는 이 요청을 차단한다.
Origin
필드가 담긴 preflight
요청을 실제 요청보다 먼저 보내게 되는데, Origin
필드의 값은 리소스를 요청하는 출처가 담긴다. 이 경우에는 공격자의 출처인 https://cabage556.com 이 담긴다.Access-Control-Allow-Origin
필드를 담아 보내는데, Access-Control-Allow-Origin
필드의 값은 해당 리소스를 요청할 수 있는 출처가 담겨 있다. 서버가 이 헤더 필드에 https://cabbage556.com 을 담아 보낸다고 하자.Access-Control-Allow-Origin
필드의 값을 확인하고 Origin
필드의 값과 비교해 다르다면 실제 요청을 보내지 않는다. 이 경우에 서버가 보낸 Access-Control-Allow-Origin
필드의 값과 Origin
필드의 값이 다르기 때문에 브라우저는 실제 요청을 보내지 않고 차단한다.