시나리오 알아보는 CORS가 필요한 이유 - CORS

CORS의 핵심 보안 철학은 “내 웹사이트의 사용자가 모르게, 제3자 서버에 민감한 요청을 보내면 안 된다.”를 보장하는 것이다.
브라우저가 다른 도메인에서 데이터를 가져오는 경우, 악성 웹사이트가 사용자 정보를 유출하거나, 다른 웹사이트의 기능을 조작하는 것을 방지한다.
그렇다면 CORS 정책이 없고 다른 Origin을 허용한다면 어떠한 문제가 발생하게 될까?
다음의 경우 시나리오를 바탕으로 알아보자
내 세션을 누가 써버린다??
- 사용자가 https://bank.com에 로그인해서 세션 쿠키 유지
- 이 상태로 사용자가 모르고 https://fakebank.com라는 악성 사이트에 접속
- 악성 사이트에서 기존의 https://bank.com로 요청을 보내게 된다면?
- bank.com에서의 인증 요소를 가진 상태
- 악성 사이트(fackbank)의 코드로 정상적인 사이트에 임의의 요청이 가능
사용자의 인증정보를 악용한 요청(서버의 상태를 바꾸거나, 어떠한 정보를 알아낼 수 있는)이 가능한 상태가 된다.
이때 악성 사이트는 요청을 통한 받은 정보를 임의의 주소로 전송하여 정보를 탈취할 수 있게 된다.
CORS의 역할은?
CORS를 지원하는 브라우저의 역할이 중요한 부분이다.
- JS코드가 cross-origin 요청을 보내게 되면
- 브라우저는 응답을 받을 때까지 멈춤(simple요청, Preflight요청)
- 응답 헤더의 Access-Control-Allow-Origin헤더 확인
- 있다면 응답을 요청을 보낸 코드(javascript)에게 넘겨줌,
- 없다면 응답을 숨기고, 에러를 발생시킴
simple요청의 경우 응답을 숨기기 때문에 JS코드에서 활용불가
Preflight요청의 경우 변경 요청이 아니기 때문에 서버의 데이터도 변경되지 않음
결국 보호하는 대상은?
브라우저에 의해 실행되는 프론트엔드 JavaScript 코드의 보안 강화를 위한 정책
즉 악성사이트가 요청을 보내 응답으로 온 정보를 유출하지 못하게 하는게 핵심인 정책으로
사용자의 민감한 데이터를 응답으로 읽어서 타 서버로 전송을 못하게 하는게 핵심이다.
Preflight요청이 아닐 경우 서버에 요청이 보내기지 때문에 서버의 상태(이체, 수정 등)가 변경될 수 있는 것이 아닌가?
Preflight 조건을 찾아보던 중 제목과 같은 의문이 들었다.
- 브라우저는 “simple 요청”, 즉 “preflight 없는 요청”이라면, 그냥 서버로 전송함
- 이때 세션 쿠키도 자동으로 붙음
- 세션 쿠키가 붙어있으면, 서버는 ‘로그인된 사용자’라고 생각하고 요청을 처리
즉, 서버의 상태(이체, 수정 등)는 실제로 바뀔 수 있음
특정 조건에서는 CORS로는 요청을 막을 수 없기 때문에 CORS만으로는 안전하지 않음
이러한 경우 CSRF 방어에 추가적인 전략이 필요하게 된다.
사실 CORS는 브라우저에 초점을 맞춘 보안정책일 뿐만 아니라 하나의 방법으로 모든 시나리오를 방어할 수는 없으니 어쩔 수 없는 결과라고 할 수 있다.