웹 개발을 하다 보면 클라이언트와 서버가 서로 다른 도메인에서 통신해야 하는 상황이 자주 발생합니다. 이때 중요한 개념 중 하나가 **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 설정 방법은 크게 두 가지로 나눌 수 있습니다:
- 컨트롤러 레벨에서 설정
- 전역(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 프로젝트를 생성하고, 다음과 같은 기본 구조를 가집니다:
- Spring Web 의존성을 추가합니다.
- 위에서 설명한 CORS 설정을 프로젝트에 추가합니다.
- 간단한 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);
}
}
테스트 방법
- 웹 브라우저 또는 curl 명령어를 사용하여 /api/public-data와 /api/restricted-data 엔드포인트에 요청을 보냅니다.
- http://example.com 도메인에서 요청을 보내는 경우에만 /api/restricted-data 엔드포인트에 접근이 가능해야 합니다.
curl -H "Origin: http://example.com" http://localhost:8080/api/restricted-data
위 명령어를 통해 restricted-data를 정상적으로 받을 수 있는지 확인합니다. 다른 도메인에서 요청을 시도할 경우 CORS 오류가 발생해야 합니다.
CORS는 웹 애플리케이션의 보안 측면에서 매우 중요한 개념이며, 잘못 설정하면 의도하지 않은 정보 유출 등의 보안 문제가 발생할 수 있습니다. Spring Boot에서는 CORS를 쉽게 설정할 수 있는 다양한 방법을 제공하므로, 애플리케이션의 요구사항에 맞게 적절히 설정하는 것이 중요합니다.
'Spring' 카테고리의 다른 글
Spring Cloud Gateway로 API 관문 열기: 기본 개념부터 프로젝트 실습까지 (0) | 2024.09.03 |
---|---|
실패를 견디는 서비스 만들기: Spring Boot에서 Circuit Breaker 패턴 완벽 가이드 (0) | 2024.09.03 |
Spring Boot Actuator를 활용한 애플리케이션 모니터링 (0) | 2024.09.02 |
Spring Boot의 보안 강화: OAuth2와 JWT를 활용한 인증 및 권한 관리 (0) | 2024.09.02 |
"프로메테우스와 스프링의 만남: 실시간 모니터링으로 애플리케이션의 상태를 한눈에 파악하기" (0) | 2024.08.30 |