No 'Access-Control-Allow-Origin' header is present on the requested resource
/ 2 min read /
0 views
Problem
웹 프론트엔드에서 다음과 같은 에러가 발생했다.
Access to XMLHttpRequest at 'http://dev.site.co.kr/login' from origin 'http://dev.site.co.kr' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Possible Causes
위 에러는 백엔드 개발자라면 필연적으로 만나게 된다는 CORS(Cross-Origin Resource Sharing) 에러다. CORS는 웹 브라우저에서 보안상의 이유로 다른 출처의 리소스에 접근하는 것을 제한하는 정책인데, 이로 인해 다른 출처의 리소스에 접근하려고 할 때, 브라우저가 요청을 차단하게 된다. 이 글에서 CORS를 설명하기엔 조금 길어서, 자세한 설명은 MDN Web Docs에서 확인하면 된다.
Solution
CORS 에러를 해결하기 위해서는 백엔드에서 CORS 정책을 설정해줘야 한다.
Spring Boot에서는 @CrossOrigin 어노테이션을 사용하여 사용되는 controller에 직접 CORS를 설정할 수 있다.
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://dev.site.co.kr")
public class ApiController {
// ...
}
하지만 이렇게 설정하면 모든 API에 대해 CORS를 직접 설정해줘야 하므로, 전역으로 설정할 수 있는 방법을 사용하면 좋다.
Spring Boot에서는 WebMvcConfigurer를 구현한 클래스를 만들어서 CORS를 전역으로 설정할 수 있다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://dev.site.co.kr")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true);
}
}
위 코드를 설명하면
addMapping("/**"): 모든 경로에 대해 CORS를 설정한다.allowedOrigins("http://dev.site.co.kr"): 허용할 출처를 설정한다.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS"): 허용할 HTTP 메서드를 설정한다.allowedHeaders("*"): 허용할 헤더를 설정한다.allowCredentials(true): 인증 정보를 포함한 요청을 허용한다.
이렇게 설정하면 모든 API에 대해 CORS를 전역으로 설정할 수 있다.
Loading Comments...