프론트엔드와 백엔드를 따로 개발하다 보면 처음 맞닥뜨리는 문제가 바로 CORS 오류입니다. 이 글에서는 CORS 오류가 왜 발생하는지, 프론트와 백엔드에서 각각 어떻게 확인하고 해결해야 하는지를 간단하고 실용적인 코드와 함께 설명합니다.
CORS(Cross-Origin Resource Sharing)는 다른 도메인 간에 리소스를 공유할 수 있는지를 브라우저가 판단해 요청을 차단하거나 허용하는 보안 정책입니다.
예: 프론트가 http://localhost:3000
이고 백엔드가 http://localhost:8080
일 때, 브라우저는 출처가 다르다고 판단해 기본적으로 차단합니다.
주로 아래 조건에서 발생합니다:
브라우저 오류 예시:
Access to fetch at 'http://localhost:8080/api/data' from origin 'http://localhost:3000'
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present...
CORS 오류는 백엔드뿐 아니라 프론트엔드 설정이나 요청 방식 때문에 발생할 수 있어요. 다음 항목들을 꼭 확인해보세요:
// 예시: credentials 포함 시
fetch("http://localhost:8080/api/data", {
method: "GET",
credentials: "include" // 쿠키 포함 시 CORS 정책 강화됨
});
* 참고: 이 경우 백엔드에서 allowCredentials(true)
와 allowedOrigins
를 명확히 설정해야 합니다.
@RestController
public class ApiController {
```
@CrossOrigin(origins = "http://localhost:3000")
@GetMapping("/api/data")
public String getData() {
return "Hello from backend";
}
```
}
➡️ 빠르게 테스트하거나, 컨트롤러 단위로 적용할 때 간편합니다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
```
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true);
}
```
}
➡️ 전체 API에 공통 설정을 적용하고 싶을 때 유용합니다.
allowedOrigins = "*"
과 allowCredentials(true)
는 함께 사용할 수 없습니다.
✔️ 빠른 테스트는 @CrossOrigin
✔️ 프로젝트 전체에는 WebMvcConfigurer
로 CORS를 처리하는 것을 추천합니다.
프론트와 백을 분리한 구조에서는 CORS 오류가 자주 발생하지만, 원리만 이해하면 빠르고 안정적으로 해결할 수 있어요!
redis-cli 사용법 기초부터 실전까지: KEYS vs SCAN, 데이터 삭제까지 (2) | 2025.06.07 |
---|---|
초보 백엔드 개발자를 위한 HTTP 상태코드 (0) | 2025.06.01 |
비동기 처리란? 언제, 왜, 어떻게 사용하는가 (0) | 2025.05.29 |
Spring Boot에서 Redis 캐시 적용 전략과 실전 구현: 캐시 히트율 90% 달성하기 (0) | 2025.05.29 |
백엔드 개발자, 협업이 어렵다고요? 스몰토크부터 시작해봐요 (0) | 2025.05.27 |