CORS(Cross-Origin Resource Sharing)란, 웹 애플리케이션에서 다른 출처(Origin)의 리소스에 접근하는 보안 메커니즘이다.

이는 보안 상의 이유로, 웹 브라우저가 동일 출처 정책(Same-Origin Policy, SOP)에 따라 실행되는 기본적인 보안 원칙을 완화하기 위해 도입되었다.


왜 CORS가 도입되었을까?


SOP(Same-Origin Policy)는 웹 보안을 강화하기 위해 브라우저에서 적용되는 중요한 보안 메커니즘 중 하나이다.

이 정책을 통해, 스크립트가 실행 중인 웹 페이지에서 로드한 리소스(JS, CSS 등)만 접근이 허용되며, 이로 인해 악의적인 웹 페이지에서 사용자의 브라우저를 통한 다른 도메인의 리소스에 접근하는 시도를 방지할 수 있었다.

하지만 시대의 흐름에 따라 웹 기술이 발전하면서 다른 도메인의 데이터나 서비스에 접근해야 하는 경우(제 3자가 제공하는 API를 호출하는 경우 등)가 많아졌고, SOP라는 브라우저의 정책의 근본적인 부분을 해결할 방법이 필요했다.

그래서 리소스를 호출할 수 있는 출처를 서버가 명시해두면 출처가 다르더라도 요청과 응답을 주고받을 수 있도록 만들어진 정책이 CORS이다.


CORS의 작동 원리


  1. 웹 브라우저에서 클라이언트가 다른 출처의 리소스에 HTTP 요청을 보낸다.
  2. 서버는 요청을 수신하고, 요청 헤더에 포함된 Origin 값을 확인한다. 여기서 Origin은 요청을 보낸 출처의 주소이다.
  3. 서버는 해당 Origin이 자신의 리소스에 대한 요청을 허용하는지 검사한다.
  4. 만약 서버가 요청으르 허용하면, 응답 헤더에 허용된 Origin을 포함하여 클라이언트에게 응답을 보낸다.
  5. 웹 브라우저는 응답을 확인하고, 허용된 경우 데이터를 처리하고 표시한다. 만약 그렇지 않은 경우, 에러를 발생시킨다.


CORS 헤더


CORS는 HTTP 헤더를 통해 제어된다. 주요 CORS 관련 헤더는 다음과 같다.

  1. Origin: 브라우저가 요청을 보내는 페이지의 출처를 나타낸다.
  2. Access-Control-Allow-Origin: 서버가 허용하는 origin 목록을 나타낸다.
  3. Access-Control-Allow-Methods: 서버에서 허용하는 HTTP 메서드 목록을 나타낸다.
  4. Access-Control-Allow-Headers: 서버에서 허용하는 요청 헤더 목록을 나타낸다.
  5. Access-Control-Expose-Headers: 브라우저에 응답 헤더 중에서 접근 가능한 헤더 목록을 나타낸다.
  6. Access-Control-Allow-Credentials: 인증정보(Cookie, HTTP 인증 등)를 요청에 포함할 수 있는지 여부를 나타낸다.
  7. Access-Control-Max-Age: 사전 요청의 최대 유효 기간을 지정하는 헤더로, 브라우저가 미리 서버에게 허용 여부를 물어보는 사전 요청을 최적화한다.


CORS 설정


  • Spring Boot 애플리케이션의 Controller 단에서 CORS를 활성화
@CrossOrigin(origins = "*", allowedHeaders = "*") // 모든 출처 허용
@RestController
public class testController {

  // @CrossOrigin(origins = "http://localhost:3000") -> 메서드 단에도 적용 가능
  @GetMapping("/api/data")
  public String getData() {
    return "stub data";
  }
}


  • React 애플리케이션에서 데이터 받을 때 예시
fetch("http://localhost:8080/api/data", {
  method: "GET",
  headers: {
    Origin: "http://localhost:3000", // 요청하는 출처 주소
  },
})
  .then((response) => response.text())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));


  • 서버에서 전역으로 CORS 설정
@Configuration
public class CorsConfig implements WebMvcConfigurer {

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
          .allowedOrigins("http://localhost:3000") // 허용할 출처 주소 설정
          .allowedMethods("GET", "POST", "PUT", "DELETE") // 허용할 HTTP 메서드 설정
          .allowedHeaders("Authorization", "Content-Type") // 허용할 헤더 설정
          .allowCredentials(true); // 인증 정보 허용
          .maxAge(60 * 60); // 3600초 == 60분
  }
}

Categories:

Updated:

Leave a comment