본문 바로가기

Spring

Spring Boot에서 CORS 설정하기: 크로스 도메인 요청 허용을 위한 필수 가이드

728x90
반응형

웹 개발을 하다 보면 클라이언트와 서버가 서로 다른 도메인에서 통신해야 하는 상황이 자주 발생합니다. 이때 중요한 개념 중 하나가 **CORS(Cross-Origin Resource Sharing)**입니다. 이 글에서는 CORS의 기본 개념을 설명하고, Spring Boot에서 CORS를 설정하는 방법을 간단한 예제와 함께 알아보겠습니다. 초보자도 쉽게 따라 할 수 있도록 자세히 설명하겠습니다.

CORS(Cross-Origin Resource Sharing)란?

CORS는 한 도메인에서 실행 중인 웹 애플리케이션이 다른 도메인에서 리소스를 요청할 수 있게 하는 보안 기능입니다. 기본적으로 웹 브라우저는 보안을 위해 동일 출처 정책(Same-Origin Policy)을 따르며, 이를 통해 다른 도메인의 리소스에 접근하는 것을 차단합니다. 하지만, CORS를 사용하면 이러한 제한을 완화하여 특정 도메인에서의 요청을 허용할 수 있습니다.

예를 들어, http://example.com에서 호스팅된 웹 애플리케이션이 http://api.example.com에 요청을 보내고자 할 때, 서버에서 CORS를 올바르게 설정하면 이 요청이 허용됩니다.

Spring Boot에서 CORS 설정 방법

Spring Boot에서는 CORS 설정을 매우 간단하게 할 수 있습니다. CORS 설정 방법은 크게 두 가지로 나눌 수 있습니다:

  1. 컨트롤러 레벨에서 설정
  2. 전역(Global) 설정
반응형

1. 컨트롤러 레벨에서 CORS 설정

특정 컨트롤러나 메서드에 대해 CORS를 설정할 수 있습니다. 이 방법은 특정 경로에 대해서만 CORS 설정이 필요할 때 유용합니다.

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 = "http://example.com")
    @GetMapping("/data")
    public String getData() {
        return "This is data from the server.";
    }
}

위의 예제에서는 /api/data 엔드포인트에 대해 http://example.com 도메인에서 오는 요청을 허용하도록 CORS를 설정했습니다.

2. 전역(Global) 설정

애플리케이션 전체에 대해 CORS를 설정하고 싶다면, WebMvcConfigurer를 사용하여 글로벌 설정을 할 수 있습니다.

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("http://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

위의 설정에서는 모든 경로(/**)에 대해 http://example.com 도메인에서 오는 요청을 허용하며, GET, POST, PUT, DELETE 메서드를 사용할 수 있도록 허용했습니다. 또한, 모든 헤더를 허용하고, 자격 증명(쿠키, 인증 정보 등)을 포함한 요청을 허용하도록 설정했습니다.

3. 간단한 예제 프로젝트

이제 간단한 예제 프로젝트를 통해 CORS 설정을 확인해보겠습니다. Spring Initializr를 사용하여 새로운 Spring Boot 프로젝트를 생성하고, 다음과 같은 기본 구조를 가집니다:

  1. Spring Web 의존성을 추가합니다.
  2. 위에서 설명한 CORS 설정을 프로젝트에 추가합니다.
  3. 간단한 REST API를 작성하여 CORS 설정이 작동하는지 확인합니다.

예제 REST 컨트롤러

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 {

    @GetMapping("/public-data")
    public String getPublicData() {
        return "This is public data, accessible to any domain.";
    }

    @CrossOrigin(origins = "http://example.com")
    @GetMapping("/restricted-data")
    public String getRestrictedData() {
        return "This is restricted data, accessible only to http://example.com.";
    }
}

CORS 전역 설정

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("/api/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}

테스트 방법

  1. 웹 브라우저 또는 curl 명령어를 사용하여 /api/public-data와 /api/restricted-data 엔드포인트에 요청을 보냅니다.
  2. http://example.com 도메인에서 요청을 보내는 경우에만 /api/restricted-data 엔드포인트에 접근이 가능해야 합니다.
curl -H "Origin: http://example.com" http://localhost:8080/api/restricted-data

위 명령어를 통해 restricted-data를 정상적으로 받을 수 있는지 확인합니다. 다른 도메인에서 요청을 시도할 경우 CORS 오류가 발생해야 합니다.

728x90

CORS는 웹 애플리케이션의 보안 측면에서 매우 중요한 개념이며, 잘못 설정하면 의도하지 않은 정보 유출 등의 보안 문제가 발생할 수 있습니다. Spring Boot에서는 CORS를 쉽게 설정할 수 있는 다양한 방법을 제공하므로, 애플리케이션의 요구사항에 맞게 적절히 설정하는 것이 중요합니다.

728x90
반응형