-
[모의 면접 CS 스터디] CORS, SOPCS/네트워크 2024. 1. 24. 22:00
이 글에서는 CORS와 SOP에 대한 상세한 내용은 다루지 않고 CORS와 SOP를 사용하는 이유에 대해서 주로 살펴볼 겁니다. 자세한 내용을 원하시는 분은 이 글을 참조해주세요
CORS(Cross-Origin Resource Sharing)
CORS란 무엇인가?
CORS란 간단히 말해서 서로 다른 출처(Origin)를 가지는 클라이언트와 서버 간의 데이터 요청과 응답이 이루어지는 것을 말한다. 그렇다면 서로 다른 출처는 무엇을 뜻할까? 도메인의 구조를 보았을 때

protocl에서부터 host 그리고 여기에 더해 포트 번호가 다르면 서로 다른 출처라고 간주한다.
이를테면 www.example1.com에서 www.example2.com로 요청하거나 www.exmaple1.com:8080에서 www.example1.com:8000으로 요청하는 걸 말한다.
CORS를 왜 기본적으로 지원하지 않는 것일까?
개발하다보면 프론트 측에서 CORS 이슈로 인해 외부 API를 요청하지 못한다거나 아니면 프론트와 백엔드 서버의 포트번호가 다른 경우 CORS 이슈가 발생하는 경우를 종종 볼 수 있다. 이런 경우 보통 서버 측에서 응답 헤더에 Access-Controll-Allow-Origin이나 Access-Controll-Allow-Credentials 등의 내용을 추가하면 해결이 된다. 하지만 굳이 왜 이런 번거로운 과정을 거쳐서까지 CORS를 막는 걸까? 결론부터 말하면 보안 문제 때문이다. 이에 대해서는 SOP에 대한 배경지식이 필요하다.
SOP(Same-Origin Policy)
SOP란 무엇인가?
SOP이란 웹 페이지가 동일한 origin을 가지는 서버에 대한 응답에 접근할 수 있는 정책을 의미한다. 이러한 정책이 나온 이유는 한 출처가 다른 출처의 리소스에 접근하지 못하게 하기 위함이다. 본 정책에 따라서 다른 악성 웹 사이트에서 악의적인 스크립트를 이용해 서버에 요청을 보내도 서버의 응답이 돌아와도 웹브라우저에 의해 차단되어 내용을 보진 못한다. CORS란 이러한 SOP 정책에 대한 예외사항이라고 볼 수 있다.
SOP의 보안적 허점과 이점

SOP은 어디까지나 응답을 막을 뿐이다. 다만 유심히 봐야될 점은 SOP는 어디까지나 서버의 응답을 못 읽게 한다는 것이다.
이를테면 사용자가 현재 은행 사이트 A의 로그인 되어 있는 상태이고 그런 도중 어떠한 악성 사이트 B에 접근하게 되었다고 가정하자. 이 때 모든 웹브라우저의 웹페이지는 요청 시 쿠키를 공유하기 때문에 B가 다른 웹 페이지의 쿠키에 접근을 하지 못하든 상관없이 B의 요청이 A 사이트의 서버로 전달되어 쿠키에 담긴 세션이나 토큰을 통해 인증이 되어 B의 요청이 그대로 받아들여질 수 있다는 점이다. 이러면 B가 응답을 보진 못하겠지만 어쨌든 원하는 요청을 보내는 건 가능하다.
그래서 흔히 SOP 정책이 CSRF 공격을 방지하기 위해 나왔다는 말이 있지만 근본적으로 SOP는 브라우저 측에서 서버의 응답을 못 보게 할뿐이지 악의적인 요청을 방지하진 못한다.
그렇다면 SOP가 완전히 보안적으로 무용한가? 그렇진 않다. 적어도 다른 출처의 웹 페이지가 보안에 활용되는 여러 정보들에 접근하는 것은 방지할 수 있다.

pre-flight request 그리고 매우 특수한 경우를 제외하면 대다수의 경우 브라우저 측에서 Pre-flight request를 보내어 CORS 여부를 체크하기 때문에 이러한 공격을 예방할 수 있다. 위 그림에서 본 요청만 보내서 다른 출처임을 파악하지 않는다면 브라우저 측이 요청을 받든 안 받든 내 계좌에서 돈이 빠져나가겠지만 예비 요청 덕분에 이를 방지할 수 있는 것이다.
출처:
csrf - Is CORS helping in anyway against Cross-Site Forgery? - Information Security Stack Exchange
[10분 테코톡] 🌳 나봄의 CORS - YouTube
'CS > 네트워크' 카테고리의 다른 글
[모의 면접 CS 스터디] 세션, 쿠키, jwt (0) 2024.01.22 [모의 면접 CS 스터디] HTTPS (0) 2024.01.18 [모의면접 CS 스터디] DNS (0) 2024.01.17 [모의 면접 CS 스터디] HTTP (0) 2024.01.16 [모의 면접 CS 스터디] HTTP/1.1 ~ HTTP/3 (0) 2024.01.15