Origin이란?
Origin은 출처를 의미한다. URL에서 Protocol, Host, Port가 같으면 동일한 Origin임을 의미한다.

SOP(Same Origin Policy)
만약 Origin이 다른 두 애플리케이션이 자유롭게 소통할 수 있게되면 보안상 치명적인 문제가 생길 수 있다.
XSS(크로스 사이트 스크립팅), CSRF(사이트 요청 위조) 공격에 취약해질 수 있다.
따라서 같은 Origin만 끼리만 리소스를 공유할 수 있는 정책이 필요하다. 이 정책을 SOP(Same Origin Policy)라고 부른다.
하지만 다른 Origin에서의 요청을 허용해줘야 하는 경우도 존재한다.
예를 들면 프론트엔드 서버에서 백엔드 서버로 요청을 보낼 경우 이 요청을 막아버린다면, 프론트엔드와 백엔드간 통신이 불가능하게 된다.
이러한 경우 Origin이 다르더라도 특정 Origin과 리소스를 공유할 수 있도록 허용해줘야한다.
CORS(Cross-Origin Resource Sharing)
CORS는 웹 브라우저에서 다른 출처(Origin)의 리소스에 접근할 수 있도록 하는 보안 메커니즘이다.
브라우저는 본 요청을 보내기 전 예비 요청(Preflight Request)을 보내서 서버와 잘 통신할 수 있는지 확인하는 요청을 보낸다.
서버는 어떤 출처, 어떤 HTTP 메서드, 어떤 헤더를 허용할지 응답헤더로 알려준다.
Preflight 요청이 성공하면 Client에서 Main Request(본 요청)을 보내게 된다.

Spring Boot에서 CORS 정책 설정
프론트엔드와 백엔드가 다른 Origin에 있을 때 백엔드에서 CORS 허용 설정이 필요하다.
CorsConfig 클래스에서 Origin, Methods 등의 설정을 해주면 CORS 에러를 해결할 수 있다.
package com.example.RedisPractice.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import java.util.List;
@Configuration
public class CorsConfig {
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(List.of(
"http://localhost:3000" // 프론트엔드 개발 환경
// 운영 환경 추가
));
config.setAllowedMethods(List.of( // 허용 메서드
"GET",
"POST",
"PUT",
"DELETE",
"OPTIONS"
));
config.setAllowedHeaders(List.of("*")); // 모든 요청 헤더 허용
config.setAllowCredentials(true); // 쿠키, 인증정보 포함 여부 허용
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
}
SecurityConfig에서 빈으로 등록한 CORS 정책을 적용하면 된다.
.cors(Customizer.withDefaults())
'BackEnd > Spring Boot' 카테고리의 다른 글
| Jsoup을 활용한 웹 크롤링 (0) | 2025.09.19 |
|---|---|
| 대용량 데이터 수집을 병렬 처리로 최적화하기 (0) | 2025.09.15 |
| WebSocket + STOMP로 채팅 구현하기 (0) | 2025.05.30 |
| Spring Webocket을 이용한 실시간 채팅 구현(+ JWT 인증) (0) | 2025.05.14 |
| @Controller와 @RestController의 차이점 (0) | 2025.02.23 |