개인공부

CORS(Cross Origin Resource Sharing)

개바리여리 2024. 10. 9. 22:29

  CORS

 

Cors: Cross origin resource sharing 이라고 부른다. cors를 알아보기전 SOP(same origin policy)에 대해 알아야 한다.

 

여기서 origin이란 "https://도메인주소:443" 을 부른다 url에서 path부분을 제외한 것

똑같은 origin끼리만 데이터 송수신이 가능한 것을 sop라고 부른다.

악의적인 사용자가 하이채킹을 통해 정보를 빼가는 것을 방지하기 위해 도입된다.

 

*하이재킹:  하이재킹(Hijacking)은 원래 사용자가 의도한 통신이나 세션을 가로채서 공격자가 불법적인 목적으로 제어하는 사이버 공격 방식

 

다른 origin끼리의 통신일때 Cors가 발생하는 것이다. 

즉 COCRS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 애플리케이션에서 다른 출처(도메인, 프로토콜, 포트)에 있는 리소스를 요청할 때 발생하는 보안 메커니즘입니다.

 

CORS 동작 방식:

  1. 프리플라이트 요청(Preflight Request): 브라우저는 교차 출처 요청을 하기 전에 OPTIONS 메서드를 사용해 서버에 사전 요청을 보냅니다. 이 프리플라이트 요청을 통해, 브라우저는 실제 요청을 보내도 되는지 확인합니다.
  2. 서버의 응답: 서버가 올바른 CORS 헤더를 포함하여 응답하면 브라우저는 실제 요청을 수행합니다.
  3. CORS 헤더:
    • Access-Control-Allow-Origin: 교차 출처를 허용할 도메인을 지정합니다. (예: *로 설정하면 모든 도메인 허용)
    • Access-Control-Allow-Methods: 허용할 HTTP 메서드 (예: GET, POST, PUT, DELETE 등)
    • Access-Control-Allow-Headers: 허용할 커스텀 헤더 목록

 

서버는 적절한 CORS 헤더를 설정하여 클라이언트의 교차 출처 요청을 허용할 수 있습니다. 이를 통해 서버에서 명시적으로 어떤 출처에서 오는 요청을 허용할지 결정합니다.

 

설정방법: (전역설정, 스프링부트 기준)

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 모든 URL에 대해 CORS 적용
            .allowedOrigins("http://example.com")  // 허용할 출처 (특정 출처)
            .allowedMethods("GET", "POST", "PUT", "DELETE")  // 허용할 HTTP 메서드
            .allowedHeaders("*")  // 허용할 헤더
            .allowCredentials(true);  // 자격 증명(쿠키 등) 허용
    }
}

 

 

  • addMapping("/**"): 모든 엔드포인트에 대해 CORS 설정을 적용.
  • allowedOrigins("http://example.com"): 특정 출처를 허용. (*로 설정하면 모든 출처 허용).
  • allowedMethods("GET", "POST", ...): 허용할 HTTP 메서드를 지정.
  • allowCredentials(true): 인증 정보(쿠키, 헤더 등)를 포함한 요청 허용 여부.

 

 

특정 컨트롤러 설정:

@RestController
public class ApiController {

    @CrossOrigin(origins = "http://example.com")  // 특정 출처 허용
    @GetMapping("/api/data")
    public String getData() {
        return "CORS 설정 적용됨";
    }
}

@CrossOrigin(origins = "http://example.com"): 특정 출처에서 오는 요청만 허용. origins = "*" 로 설정하면 모든 출처 허용.