SOP
CORS 필요 이유
CORS 정의
CORS는 Cross-Origin Resource Sharing의 약자로, '다른 출처간의 리소스 공유'를 의미합니다. 이는 웹 보안 정책의 일종으로, 한 도메인에서 다른 도메인의 리소스를 사용하려 할 때 이를 허용할 것인지를 결정하는 방법입니다. 이 정책이 없다면 해커들이 사용자의 데이터를 쉽게 탈취할 수 있습니다. 그래서 CORS는 웹의 안전성을 확보하는 중요한 요소 중 하나입니다. "출처"란 여기서는 프로토콜, 호스트, 포트를 모두 합친 것을 말합니다.
출처(Origin)는 웹에서 서버의 위치를 나타내는 요소로, 프로토콜(예: http, https), 호스트(예: google.com), 그리고 포트 번호(예: 80, 443)를 합친 것을 말합니다. 이는 서버의 위치를 찾아가기 위해 필요한 기본적인 정보들을 합친 것입니다.
포트 번호는 생략 가능하며, 이는 웹에서 사용하는 HTTP와 HTTPS 프로토콜의 기본 포트 번호가 정해져 있기 때문입니다. 예를 들어, HTTP 프로토콜의 기본 포트는 80입니다.
출처에 포트 번호가 명시적으로 있을 경우에는 출처 판단시 포트 번호까지 모두 일치해야 합니다. 하지만 이에 대한 명확한 정의는 표준화 되지 않았으므로, 경우에 따라 다르게 판단될 수 있습니다.
브라우저의 개발자 도구의 콘솔에서 Location 객체의 origin 프로퍼티를 통해 어플리케이션이 실행되고 있는 출처를 쉽게 확인할 수 있습니다.
SOP(Same-Origin Policy)는 웹 보안 정책 중 하나로, "같은 출처에서만 리소스를 공유할 수 있다"는 규칙을 가지고 있습니다. 이 정책은 2011년 RFC 6454에서 처음 등장했습니다. 하지만 웹에서는 다른 출처의 리소스를 사용하는 일이 흔하므로, SOP에서는 몇 가지 예외 조항을 두고 있습니다. 그 중 하나가 "CORS 정책을 지킨 리소스 요청"입니다.
다른 출처로 리소스를 요청한다면 SOP 정책을 위반한 것이 되고, 이때 SOP의 예외 조항인 CORS 정책까지 지키지 않으면 다른 출처의 리소스를 아예 사용할 수 없게 됩니다.
이런 정책들이 필요한 이유는, 출처가 다른 두 어플리케이션이 마음대로 소통할 수 있는 환경이 보안에 매우 취약하기 때문입니다. 예를 들어, CSRF(Cross-Site Request Forgery)나 XSS(Cross-Site Scripting)와 같은 공격을 통해 사용자의 정보를 탈취하는 것이 가능합니다.
따라서 SOP와 CORS 정책은 웹에서 다른 출처의 리소스를 사용하는 것을 제한하며, 이것은 하나의 정책만으로 결정되는 것이 아니라 SOP에서 정의된 예외 조항과 CORS를 사용할 수 있는 케이스들이 맞물려 결정됩니다.
1. 브라우저가 웹 페이지에서 다른 출처로 리소스를 요청하면 브라우저는 먼저 "사전 요청(Preflight Request)"를 보냅니다. 이 요청은 HTTP OPTIONS 메소드를 사용하고, 실제 요청이 안전한지 확인하기 위해 사용됩니다.
2. 이 사전 요청에는 원래 보내려고 했던 요청의 메소드(GET, POST 등)와 헤더 정보 등이 포함되어 있습니다.
3. 서버는 이 사전 요청을 받아서, 해당 요청이 자신의 정책에 맞는지 확인하고 응답을 보냅니다. 이 응답에는 'Access-Control-Allow-Origin', 'Access-Control-Allow-Methods', 'Access-Control-Allow-Headers' 등의 CORS 관련 헤더가 포함되어 있습니다.
4. 브라우저는 이 응답을 받아서, 원래의 요청을 보낼 수 있는지 결정합니다. 만약 서버의 응답이 요청을 허용하지 않는다면, 여기서 요청은 중단되고 에러가 발생합니다.
5. 만약 서버의 응답이 요청을 허용한다면, 브라우저는 원래의 요청을 다시 보내게 됩니다.
6. 이후 서버는 원래의 요청에 대한 응답을 보내고, 이 응답 역시 CORS 관련 헤더를 포함하고 있어야 합니다.
7. 브라우저는 이 응답을 받아서, 웹 페이지에게 전달합니다.
CORS(Cross-Origin Resource Sharing)는 웹 보안을 위해 필요한 기술입니다. 기본적으로 웹 브라우저는 SOP(Same-Origin Policy)라는 보안 정책을 따르는데, 이는 한 출처에서 로드된 문서나 스크립트가 다른 출처의 리소스와 상호작용하는 것을 제한합니다.
이 SOP는 사용자의 데이터를 보호하는 중요한 역할을 하지만, 웹 애플리케이션이 발전하면서 다른 출처의 리소스를 안전하게 요청하고 사용하는 기능이 필요하게 되었습니다. 예를 들어, 다른 서버에서 제공하는 API를 사용하거나, CDN(Content Delivery Network)을 통해 서비스되는 리소스를 활용하는 등의 경우가 있습니다.
이럴 때 CORS가 필요하게 됩니다. CORS는 웹 애플리케이션에게 추가적인 HTTP 헤더를 사용하여 다른 출처의 선택된 리소스에 접근할 수 있는 권한을 부여합니다. 이를 통해 개발자들은 사용자의 데이터를 보호하면서도 필요한 리소스를 다른 출처에서 안전하게 가져올 수 있게 됩니다.