본문 바로가기

학습/Java_Spring

Spring Boot 애플리케이션에서 CORS(Cross-Origin Resource Sharing)를 설정

Spring Boot 애플리케이션에서 CORS(Cross-Origin Resource Sharing)를 설정하여 Access-Control-Allow-Origin: * 헤더를 추가하는 방법을 소개한다. 이렇게 하면 모든 출처(origin)에서 해당 서버에 요청을 보낼 수 있게 된다.


1. **Global CORS Configuration:**

   `WebMvcConfigurer`를 구현하여 애플리케이션의 모든 경로에 대해 CORS 설정을 전역적으로 적용할 수 있다.

   ```java
   import org.springframework.context.annotation.Bean;
   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("/**")
                   .allowedOrigins("*")
                   .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
                   .allowedHeaders("*")
                   .allowCredentials(false);
       }
   }
   ```

2. **Controller-Level CORS Configuration:**

   특정 컨트롤러나 특정 엔드포인트에 대해서만 CORS 설정을 적용할 수 있다. 이를 위해 `@CrossOrigin` 애너테이션을 사용한다.

내가 주로 사용하는 방법이다. 개발계에서 로컬 테스트 진행할때 CORS 에러가 발생하면, @CrossOrigin(origin="*")를 작성하고, git push 할때 주석 처리하거나 삭제한다.

   ```java
   import org.springframework.web.bind.annotation.CrossOrigin;
   import org.springframework.web.bind.annotation.GetMapping;
   import org.springframework.web.bind.annotation.RequestMapping;
   import org.springframework.web.bind.annotation.RestController;

   @RestController
   @RequestMapping("/api")
   public class ApiController {

       @CrossOrigin(origins = "*")
       @GetMapping("/data")
       public String getData() {
           return "Hello, World!";
       }
   }
   ```

3. **Filter-based CORS Configuration:**

   만약 특정 조건에 따라 동적으로 CORS 설정을 적용하고 싶다면, 필터를 사용하여 설정할 수 있다.

   ```java
   import javax.servlet.Filter;
   import javax.servlet.FilterChain;
   import javax.servlet.FilterConfig;
   import javax.servlet.ServletException;
   import javax.servlet.ServletRequest;
   import javax.servlet.ServletResponse;
   import javax.servlet.http.HttpServletRequest;
   import javax.servlet.http.HttpServletResponse;
   import org.springframework.stereotype.Component;

   import java.io.IOException;

   @Component
   public class CorsFilter implements Filter {

       @Override
       public void init(FilterConfig filterConfig) throws ServletException {
       }

       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
               throws IOException, ServletException {
           HttpServletResponse httpResponse = (HttpServletResponse) response;
           httpResponse.setHeader("Access-Control-Allow-Origin", "*");
           httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
           httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
           chain.doFilter(request, response);
       }

       @Override
       public void destroy() {
       }
   }
   ```

위의 방법 중 하나를 사용하여 CORS 설정을 적용할 수 있다. 일반적으로 전역 설정이 가장 많이 사용되며, 컨트롤러별 설정이나 필터를 사용하는 방법은 특정 요구사항이 있을 때 유용하다.