CORS에 대해 설명해주세요.
SOP(Same Origin Policy)
- 다른 출처의 리소스를 사용하는 것을 제한하는 보안 방식
- cross-origin HTTP 요청을 제한하는 것
출처(origin)이란?
- url의 protocol, host, port가 같아야지만 같은 출처
- 인터넷 익스플로러는 protocol, host로만 판단.
- http://localhost:80 과 http://127.0.0.1 은 다른 origin!
CORS
만일 다른 출처의 리소스가 필요하다면?CORS!
- Cross-Origin Resource Sharing 의 약자
- 다른 도메인으로부터 리소스가 요청될 경우 해당 리소스는 cross-origin
- 타 도메인간의 자원을 공유할 수 있도록 해주는 것
- 허가된 출처집합을 서버에게 알려주도록 허용하는 특정 HTTP 헤더를 추가함으로써 동작한다.
- 출처를 비교하는 로직이 서버에 구현된 것이 아닌 브라우저에 구현되어 잇는 스펙
- CORS 정책을 위반한 리소스의 경우에도 서버는 정상적으로 응답하고 그 브라우저가 응답 파기
CORS의 동작 방법
- 웹 클라이언트 어플리케이션이 다른 출처의 리소스를 요청할 때는 HTTP 프로토콜을 사용하여 요청을 보낸다. 이때 브라우저는 요청 헤더에 Origin이라는 필드에 출처를 담아 보냄
- 이후 서버는 요청에 대한 응답을 할 때 Access-Control-Allow-Origin이라는 값에 리소스에 접근하는 것이 허용된 출처를 보내줌
- 브라우저는 자신이 보낸 Origin과 서버에서 보내준 Access-Control-Allow-Origin을 비교하여 응답을 파기할 지를 결정
CORS 관련 HTTP Response Headers
| HTTP Header | Description | | — | — | | Access-Control-Allow-Origin | 접근 가능한 url 설정 | | Access-Control-Allow-Credentials | 접근 가능한 쿠키 설정 | | Access-Control-Allow-Headers | 접근 가능한 헤더 설정 | | Access-Control-Allow-Methods | 접근 가능한 http method 설정 |
- Access Control Allow Origin 세팅을 변경하여 보통 웹 개발 시 CORS 해결
질문 1: SOP는 왜 중요하며, 이 정책이 없다면 어떤 보안 문제가 발생할 수 있나요?
답변 1: SOP는 웹 보안의 핵심 원칙 중 하나입니다. 이 정책이 없으면 악의적인 웹사이트가 사용자가 인증된 세션을 통해 다른 웹사이트의 데이터를 읽거나 조작할 수 있습니다. 예를 들어, 사용자가 은행 웹사이트에 로그인한 상태에서 악성 스크립트가 포함된 다른 사이트를 방문한다면, 이 스크립트가 은행 사이트의 데이터를 가져오거나 트랜잭션을 조작할 수 있습니다. SOP는 이러한 종류의 공격, 즉 크로스 사이트 스크립팅(XSS)과 크로스 사이트 요청 위조(CSRF)를 방지하는 데 도움을 줍니다.
질문 2: CORS 정책 위반 시 브라우저는 서버의 응답을 어떻게 처리하나요?
답변 2: CORS 정책을 위반한 경우 서버는 정상적으로 응답하지만, 브라우저는 이 응답을 파기합니다. 브라우저는 서버로부터 받은 Access-Control-Allow-Origin 헤더를 확인하여, 현재 웹 페이지의 출처와 일치하는지 검사합니다. 일치하지 않으면 브라우저는 보안 위험을 방지하기 위해 응답을 사용하지 않고 버립니다. 이 과정은 서버가 정상적으로 응답을 보냈음에도 불구하고 클라이언트 측에서 리소스에 대한 접근을 차단함으로써 이루어집니다.
질문 3: Access-Control-Allow-Origin 헤더에 ‘*‘를 사용하는 것과 특정 도메인을 명시하는 것 사이의 보안 차이는 무엇인가요?
답변 3: Access-Control-Allow-Origin 헤더에 ‘*‘를 사용하면 모든 출처에서 리소스에 대한 접근을 허용합니다. 이는 편리하지만 보안에 취약할 수 있습니다. 예를 들어, 민감한 데이터를 다루는 API는 특정 신뢰할 수 있는 도메인에서만 요청을 허용해야 합니다. 반면, 특정 도메인을 명시하면 해당 도메인에서만 리소스에 접근할 수 있어 보안을 강화할 수 있습니다. 이 방식은 리소스에 대한 접근을 제한적으로 허용하여 보안 수준을 높이는 데 도움이 됩니다.