블로그/Network
Network주니어2026-04-27

CORS의 동작 원리와 해결 방법은 무엇인가요?

한 줄 답변

CORS는 브라우저가 출처가 다른 리소스에 접근할 수 있도록 허용하는 보안 체계입니다. SOP 정책을 따르되 서버의 Access-Control-Allow-Origin 헤더로 안전한 예외를 허용합니다.

핵심 개념 정리

CORS(Cross-Origin Resource Sharing)는 추가 HTTP 헤더를 사용하여, 한 출처(Origin)에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체계입니다. 여기서 '출처'는 프로토콜(HTTP/HTTPS), 호스트명(도메인), 포트 번호가 모두 일치하는 경우를 의미하며, 이 중 단 하나만 달라도 브라우저는 이를 교차 출처로 판단하고 보안 제약을 적용합니다.

웹 브라우저는 기본적으로 동일 출처 정책(SOP, Same-Origin Policy)을 따릅니다. 이는 잠재적으로 해로운 문서가 다른 문서의 리소스에 접근하는 것을 제한함으로써 사이트 간 요청 위조(CSRF)나 데이터 유출과 같은 보안 위협을 방지하는 핵심 보안 모델입니다. 하지만 현대의 웹 아키텍처는 마이크로서비스나 외부 API 활용이 빈번하므로, 서버 측에서 명시적으로 허용된 출처에 대해서는 리소스를 공유할 수 있도록 예외를 두는 CORS 메커니즘이 필수적으로 자리 잡았습니다.

CORS의 핵심 동작인 예비 요청(Preflight Request) 과정을 살펴보면, 브라우저는 실제 요청을 보내기 전에 OPTIONS 메서드를 이용해 서버가 해당 요청을 허용하는지 미리 확인합니다. 이때 서버는 응답 헤더에 'Access-Control-Allow-Origin'을 포함하여 허용 도메인을 알려주고, 'Access-Control-Allow-Methods'로 허용되는 HTTP 메서드를 전달합니다. 브라우저는 이 응답을 검증한 뒤에야 실제 데이터를 전송하는 본 요청을 수행하게 됩니다. 반면 간단한 조건(GET/POST 메서드, 특정 헤더 등)을 만족하는 '단순 요청'은 예비 요청 없이 바로 본 요청을 수행하기도 합니다.

비교 정리

항목단순 요청 (Simple)예비 요청 (Preflight)
HTTP 메서드GET, HEAD, POST 중 하나OPTIONS (사전 확인용)
헤더 조건Content-Type이 특정 값(text/plain 등)만 가능Content-Type 제한 없음 (JSON 포함)
동작 방식본 요청을 바로 보내고 결과 확인본 요청 전 OPTIONS 요청을 보내 허락 확인
주요 목적기존 서버 호환성 유지현대적인 복잡한 API의 보안 강화

면접에서 이렇게 답하세요

답변 시 단순히 "에러가 난다"는 결과보다, 보안 정책인 SOP를 먼저 언급하여 "왜 이 제약이 필요한가"라는 근본적인 이유를 먼저 제시하세요. 이후 브라우저가 주도하는 Preflight 과정(OPTIONS 요청)을 흐름대로 설명하고, 서버 응답 헤더인 Access-Control-Allow-Origin의 역할을 강조하는 것이 좋습니다. 또한 실무적인 관점에서 모든 출처를 허용하는 와일드카드(*) 설정의 보안 취약점을 언급하고, 인증 정보(Credentials)가 포함될 때의 주의사항(Access-Control-Allow-Credentials: true 설정 시 Origin 구체화 필요 등)을 덧붙이면 시니어급의 통찰력을 보여줄 수 있습니다.

자주 묻는 추가 질문

Q. Preflight 요청이 성능에 미치는 영향과 최적화 방법은?

추가 네트워크 라운드 트립이 발생하므로 Access-Control-Max-Age 헤더를 설정해 브라우저에 허용 결과를 캐싱하면 성능을 개선할 수 있습니다.

Q. Access-Control-Allow-Origin: * 로 설정해도 되나요?

편리하지만 보안상 위험합니다. 특히 인증 정보(Cookie 등)를 포함하는 경우 와일드카드는 사용할 수 없으며, 반드시 신뢰할 수 있는 특정 도메인만 명시해야 합니다.

Q. 브라우저가 아닌 서버 간 통신(Server-to-Server)에서도 CORS가 발생하나요?

아니요. CORS는 브라우저에 구현된 보안 메커니즘입니다. 서버 간 통신이나 curl 명령어를 통한 호출에는 SOP/CORS 제약이 적용되지 않습니다.

커뮤니티 하이라이트

로컬 개발 시 프론트는 3000, 백엔드는 8080 포트를 써서 CORS를 자주 겪죠. 프록시 설정을 통해 해결하는 것도 좋은 방법입니다.

@backend_dev_ryan32

실무에선 허용 도메인을 화이트리스트로 관리하는 로직을 서버 공통 필터나 인터셉터에 구현하는 것이 정석입니다.

@security_expert_kim19

42명의 개발자가 이 질문에 참여했습니다

관련 면접 질문

앱에서 직접 답변해보세요

매일 3개의 면접 질문에 답변하고,
다른 개발자들의 답변을 비교해보세요.

무료로 시작하기