CORS

CORS는 웹 보안 기능 중 하나로, 웹 페이지가 현재 도메인 이외의 도메인에서 리소스 요청을 제어하기 위한 메커니즘입니다. 이는 웹 애플리케이션이 동일 출처 정책(Same-Origin Policy)에 의해 보호받을 수 있도록 해줍니다. 동일 출처 정책은 보안을 위해 스크립트가 다른 출처의 리소스를 불러오는 것을 막는 정책입니다. 하지만 웹 애플리케이션이 여러 출처에 있는 리소스에 접근해야 할 필요가 있을 때, CORS를 사용하여 이를 허용할 수 있습니다.

CORS의 작동 방식

CORS는 서버와 클라이언트 간의 HTTP 헤더를 통해 설정됩니다. 주로 서버에서 특정 출처(origin)의 요청을 허용하도록 설정합니다. 주요 CORS 관련 헤더는 다음과 같습니다.

  • Access-Control-Allow-Origin: 서버가 응답 시, 요청을 허용할 출처를 이 헤더에 명시합니다. 예를 들어, Access-Control-Allow-Origin: https://example.com은 특정 출처만 요청을 허용하고, Access-Control-Allow-Origin: *는 모든 출처의 요청을 허용합니다.

  • Access-Control-Allow-Methods: 서버가 지원하는 HTTP 메서드를 명시합니다. 예를 들어, GET, POST, PUT, DELETE 등이 있습니다.

  • Access-Control-Allow-Headers: 서버가 허용하는 HTTP 헤더를 명시합니다. 클라이언트가 보낼 수 있는 헤더를 지정할 수 있습니다.

  • Access-Control-Allow-Credentials: 자격 증명(쿠키, 인증 헤더 등)을 포함한 요청을 허용할지 여부를 결정합니다. 이 헤더가 true로 설정되면, 클라이언트는 요청에 자격 증명을 포함시킬 수 있습니다.

  • Access-Control-Expose-Headers: 클라이언트가 접근할 수 있는 응답 헤더를 명시합니다.

  • Access-Control-Max-Age: 사전 요청(preflight request)의 결과를 캐시할 수 있는 시간을 지정합니다.

CORS 요청 유형

단순 요청(Simple Requests):

다음 조건을 모두 만족하는 요청을 말합니다.

  • HTTP 메서드가 GET, POST, 또는 HEAD 중 하나입니다.
  • 사용되는 헤더가 Accept, Accept-Language, Content-Language, Content-Type 중 하나이며, Content-Typeapplication/x-www-form-urlencoded, multipart/form-data, 또는 text/plain인 경우.

사전 요청(Preflight Requests):

단순 요청이 아닌 경우, 브라우저는 실제 요청을 보내기 전에 OPTIONS 메서드를 사용하여 사전 요청을 보냅니다. 이 요청은 서버가 실제 요청을 허용할 수 있는지를 확인하기 위한 것입니다.

CORS 설정 시 주의점

보안:

모든 출처를 허용하는 Access-Control-Allow-Origin: * 설정은 편리하지만, 보안에 취약할 수 있습니다. 민감한 데이터를 다루는 경우, 특정 출처만 허용하는 것이 좋습니다.

서버 설정:

CORS를 올바르게 설정하려면 서버 쪽에서 헤더를 적절히 반환해야 합니다. 각 서버 환경(예: Nginx, Apache, Node.js 등)에 맞는 설정이 필요합니다.