CORS 설정 오류 — 모든 출처(*) 허용의 함정
편하려고 모든 출처를 허용하거나 요청 출처를 그대로 되비추면, 악성 사이트가 사용자 브라우저를 빌려 내 API 를 호출할 수 있습니다.
이게 무슨 문제인가요?
CORS 는 "어느 웹사이트가 내 API 를 브라우저에서 호출할 수 있는지"를 정하는 규칙입니다. 개발 중 편의를 위해 모든 출처를 뜻하는 *로 열어두거나, 요청이 들어온 출처(Origin)를 검증 없이 그대로 응답에 되비추면(reflect), 의도하지 않은 외부 사이트도 내 API 를 부를 수 있게 됩니다. 특히 쿠키 기반 인증과 Allow-Credentials: true가 함께 있으면 위험이 커집니다.
왜 위험한가요?
로그인한 사용자가 악성 페이지를 방문하면, 그 페이지의 스크립트가 사용자의 인증 상태를 그대로 이용해 내 API 를 호출하고 응답을 빼낼 수 있습니다. 사용자는 아무것도 누르지 않아도 데이터가 탈취되거나 조작될 수 있습니다.
내 앱도 해당되나요?
API 응답 헤더에서 Access-Control-Allow-Origin이 *인지, 또는 요청한 Origin 을 그대로 반사하는지 확인하세요. 동시에 Access-Control-Allow-Credentials: true가 있다면 특히 위험한 조합입니다.
어떻게 고치나요?
- 1허용 출처를 화이트리스트로 제한
*대신 내 서비스 도메인처럼 신뢰하는 출처만 명시적으로 허용합니다. - 2credentials 와 * 를 함께 쓰지 않기
쿠키·인증 정보를 주고받는다면(
Allow-Credentials: true) 출처를 절대*로 두지 말고 정확한 도메인만 지정합니다. - 3반사형 설정은 화이트리스트 대조 후에만
요청 Origin 을 응답에 넣어야 한다면, 미리 정한 허용 목록과 대조해 일치할 때만 반사합니다.
- 4불필요한 메서드·헤더 제거
Allow-Methods와Allow-Headers에서 실제로 쓰지 않는 항목을 빼 공격 표면을 줄입니다. - 5미허가 출처로 재점검
허용되지 않은 Origin 으로 프리플라이트(OPTIONS) 요청을 보내 차단되는지 확인합니다.
자주 묻는 질문
흔한 오해입니다. CORS 는 브라우저의 보호 장치이고, "끈다"는 보통 모든 출처를 허용(*)한다는 뜻이 돼 오히려 더 위험합니다. 끄는 게 아니라 신뢰 출처만 정확히 허용하는 것이 맞습니다.
내 API 를 어떤 웹사이트든 브라우저에서 호출할 수 있게 됩니다. 인증이 쿠키로 걸려 있으면 악성 사이트가 사용자의 로그인 상태를 이용해 데이터를 빼낼 수 있습니다.
인증이 필요 없는 완전 공개 데이터라면 *가 적절할 수 있습니다. 하지만 로그인·쿠키·개인 데이터가 관여하면 반드시 출처를 제한해야 합니다.
관련 보안 이슈
앱 주소만 알려주시면 코드·서버 접근 없이 무료로 점검해 드립니다. 위험이 나오면 사람이 직접 고치는 것까지 도와드려요.
* 이 글은 보안 보증이 아닌 일반적인 안내입니다. VibeRadar 가 실제 점검에서 자주 보는 취약점 유형을 설명하며, 특정 서비스의 결함을 단정하지 않습니다.