본문 바로가기

SpringBoot

[Spring Boot] CORS 설정하기

 

문제) 비동기 처리 과정에서 CORS 에러 확인

 

 

CORS (Cross-Origin Resource Sharing)는 웹페이지의 리소스가 다른 도메인, 프로토콜, 또는 포트가 달라도 안전하게 접근할 수 있도록 허용하는 보안 기능입니다. CORS 정책은 웹 브라우저가 기본적으로 구현하고 잇으며, 웹 보안의 중요한 부분입니다.

CORS 에러 발생 원인

CORS 에러는 웹 애플리케이션이 다른 출처의 리소스에 접근하려 할 때 해당 출처에서 적절한 CORS 헤더를 포함하지 않은 응답을 반환하면 발생합니다. 예를 들어, http://domain-a.com에서 실행 중인 웹 페이지가 http://domain-b.com/data.json을 요청하고, domain-b.com에서 Access-Control-Allow-Origin 헤더 없이 응답하면 브라우저는 CORS 에러를 발생시키고 요청을 차단합니다.

 

1. 전역 설정

- Global 설정을 적용하는 방법입니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@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 메소드를 명시합니다. 여기서는 GET, POST, PUT, DELETE 메소드를 허용합니다.
                .allowedHeaders("Authorization", "Content-Type")  // 서버가 요청에서 허용하는 HTTP 헤더를 명시합니다. 여기서는 Authorization과 Content-Type 헤더를 허용합니다.
                .exposedHeaders("Custom-Header")  // 응답에 포함시킬 수 있는 추가적인 헤더를 명시합니다. 클라이언트가 읽을 수 있도록 "Custom-Header"를 노출시킵니다.
                .allowCredentials(false)  // 쿠키나 인증 관련 헤더를 포함한 요청을 허용하지 않습니다. 이 설정은 보안 상의 이유로 중요할 수 있습니다.
                .maxAge(3600);  // 사전 요청 (preflight request) 결과를 캐시하는 시간을 초 단위로 설정합니다. 여기서는 3600초, 즉 1시간 동안 캐시합니다.
    }

}

 

 

2. Controller 설정

- Controller 또는 Controller의 메소드에 annotation을 통해 적용하는 방법입니다.

 

1. Controller class에 설정

@Slf4j
@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class FetchApiTest {

    @PostMapping("/save")
    public SaveDTO save(@RequestBody SaveDTO saveDTO){
        log.info("name={}, age={}", saveDTO.getId(), saveDTO.getPw());

        return saveDTO;
    }

}

 

 

2. method에 설정

@Slf4j
@RestController
public class FetchApiTest {

    @CrossOrigin(origins = "*")
    @PostMapping("/save")
    public SaveDTO save(@RequestBody SaveDTO saveDTO){
        log.info("name={}, age={}", saveDTO.getId(), saveDTO.getPw());

        return saveDTO;
    }

}