Spring Boot 및 React 앱의 CORS 오류 이해
다음을 사용하여 웹 애플리케이션을 개발할 때 반응하다 프론트엔드와 스프링 부트 백엔드의 경우 개발자가 직면하는 일반적인 문제는 악명 높은 CORS 오류입니다. 이 오류는 보안상의 이유로 브라우저가 요청을 차단할 때, 특히 다른 포트나 도메인에서 호스팅되는 백엔드 서비스에 연결을 시도할 때 발생합니다. 이 경우 CORS 문제를 처리하는 동안 GET 요청 React에서 Spring Boot API로.
오류 메시지는 일반적으로 브라우저가 요청을 차단하고 있음을 나타냅니다. 액세스 제어-허용-원본 헤더가 없거나 잘못 구성되었습니다. 다음과 같은 도구에 주목할 가치가 있습니다. 우편 집배원 이러한 보안 제한을 적용하지 마십시오. 따라서 요청이 Postman에서는 완벽하게 작동하지만 브라우저에서는 실패할 수 있습니다.
귀하의 시나리오에서 오류 메시지는 실행 전 요청이 액세스 제어 검사를 통과하지 못했음을 나타냅니다. 이는 일반적으로 서버의 CORS 정책에서 특정 헤더나 메서드가 허용되지 않거나 적절하게 구성되지 않은 경우에 발생합니다. CORS 구성이 서버 측에 있는 것처럼 보이지만 브라우저 요청을 처리하는 방법에 특정 문제가 있을 수 있습니다.
이 문서는 문제의 근본 원인을 이해하는 데 도움이 되며 문제를 해결하기 위한 가능한 해결 방법을 안내합니다. CORS 오류 React 및 Spring Boot 애플리케이션에서.
명령 | 사용예 |
---|---|
@WebMvcConfigurer | CORS, 인터셉터 및 포맷터와 같은 웹 설정을 구성하는 데 사용되는 Spring Boot 주석입니다. 이 문제의 맥락에서 이는 특정 출처와 방법을 허용하는 CORS 매핑 규칙을 정의하는 데 사용됩니다. |
allowedOrigins() | 이 방법은 CORS 구성의 일부이며 서버에 액세스하도록 허용되는 원본을 지정합니다. 이 경우 'http://localhost:8081'에서 실행되는 프런트엔드가 백엔드와 통신할 수 있도록 보장합니다. |
withCredentials() | 쿠키 및 HTTP 인증과 같은 자격 증명을 포함하도록 교차 출처 요청을 허용하는 Axios 구성입니다. 이는 사용자별 데이터가 필요한 보안 요청을 처리할 때 중요합니다. |
MockMvcRequestBuilders.options() | HTTP OPTIONS 요청을 시뮬레이션하는 데 사용되는 Spring Boot의 MockMvc 프레임워크의 메서드입니다. 이는 일반적으로 CORS에서 실행 전 요청을 처리하고 실제 요청이 전송되기 전에 서버 권한을 확인하는 데 사용됩니다. |
HttpHeaders.ORIGIN | 이 헤더는 CORS에서 요청의 출처를 지정하는 데 사용됩니다. 교차 원본 시나리오에서는 원본이 허용되는지 확인하기 위해 프런트엔드에서 서버로 전송됩니다. |
MockMvcResultMatchers.header() | 이는 응답에서 특정 HTTP 헤더를 확인하기 위해 단위 테스트에 사용되는 방법입니다. 이는 실행 전 요청에 대한 응답으로 'Access-Control-Allow-Origin' 헤더가 올바르게 반환되도록 보장합니다. |
Authorization: Bearer | Axios 요청에서 이 헤더는 인증을 위해 Bearer 토큰을 전달합니다. 이는 백엔드가 요청하는 클라이언트의 신원을 확인할 수 있도록 보장합니다. |
useEffect() | 구성 요소가 렌더링된 후 실행되는 React Hook입니다. 이 경우 백엔드에 대한 API 호출을 트리거하여 구성 요소가 탑재될 때 프로젝트 데이터를 가져오는 데 사용됩니다. |
axios.get() | HTTP GET 요청을 만들기 위해 Axios에서 제공하는 메서드입니다. 이 시나리오에서는 Spring Boot API에 요청을 보내고 프로젝트 데이터를 검색하는 데 사용됩니다. |
React 및 Spring Boot 애플리케이션에서 CORS 오류 처리
위에 제공된 스크립트는 다음 문제를 해결하는 것을 목표로 합니다. CORS 오류 React 프론트엔드와 Spring Boot 백엔드 설정에서. 이 오류는 'http://localhost:8081'에서 호스팅되는 프런트엔드가 'http://localhost:8080'에서 호스팅되는 Spring Boot API에 대해 GET 요청을 시도할 때 발생합니다. 브라우저는 승인되지 않은 교차 출처 요청을 방지하기 위해 엄격한 보안 규칙을 시행하므로 이러한 CORS 정책이 존재합니다. 그만큼 WebMvcConfigurer Spring Boot 백엔드 구성의 클래스는 특정 출처와 메서드를 허용하는 CORS 규칙을 정의하여 궁극적으로 문제를 해결하는 데 도움이 됩니다.
백엔드에서 `CorsConfig.java` 파일은 Spring Boot 구성 클래스를 정의합니다. 그만큼 @콩 그리고 @보수 주석은 CORS 구성을 삽입하고 사용자 정의하는 데 사용됩니다. `addCorsMappings()` 메서드에서 `allowedOrigins()` 함수는 'http://localhost:8081'의 요청을 명시적으로 허용하여 브라우저가 이 출처를 신뢰할 수 있는 소스로 인식하도록 합니다. `allowedMethods()`를 포함하면 GET, POST 및 OPTIONS를 포함한 모든 HTTP 메서드가 허용됩니다. 브라우저는 일반적으로 실제 GET 요청이 허용되는지 확인하기 위해 실행 전 OPTIONS 요청을 보내기 때문에 이는 매우 중요합니다.
프론트엔드에서 React는 다음을 사용하여 요청을 처리합니다. 액시오스, 널리 사용되는 HTTP 클라이언트입니다. `ProjectPage.tsx` 파일의 `fetchData` 함수에서 `axios.get()` 함수는 Spring Boot 백엔드에 GET 요청을 보냅니다. 'withCredentials' 옵션이 true로 설정되어 요청과 함께 쿠키 및 인증 자격 증명을 보낼 수 있습니다. 또한 사용자의 토큰을 전달하기 위해 Authorization 헤더가 포함되어 요청이 올바르게 인증되었는지 확인합니다. 이러한 구성이 없으면 브라우저는 보안상의 이유로 요청을 차단합니다.
마지막으로 단위 테스트 파일 `CorsTest.java`는 CORS 구성이 예상대로 작동하는지 확인합니다. 이 테스트는 브라우저에서 수행된 실제 실행 전 요청을 모방하는 백엔드 API에 대한 HTTP OPTIONS 요청을 시뮬레이션합니다. 테스트에서는 응답에 다음과 같은 올바른 헤더가 포함되어 있는지 확인합니다. 액세스 제어-허용-원본, 프런트엔드의 교차 출처 요청을 허용합니다. `MockMvcResultMatchers.header()` 메서드는 서버가 실행 전 요청에 올바르게 응답하는지 확인합니다. 단위 테스트를 포함함으로써 개발자는 CORS 구성이 다양한 환경에서 안정적이고 작동하는지 확인할 수 있습니다.
구성 조정을 통해 React + Spring 부팅에서 CORS 오류 해결
접근법 1: 백엔드에서 Spring Boot CORS 구성 사용
// CorsConfig.java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/")
.allowedOrigins("http://localhost:8081")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true);
}
}
React에서 쿠키를 사용한 적절한 CORS 처리를 위해 Axios 사용
접근법 2: Cross-Origin 요청에 대한 React 프런트엔드 Axios 구성
// ProjectPage.tsx
const ProjectsPage = () => {
const [projectsData, setProjectsData] = useState<ProjectsData[]>([]);
const projectsUrl = 'http://localhost:8080/api/projects/admin/toinspection';
useEffect(() => { fetchData(); }, []);
const fetchData = async () => {
const token = Cookies.get('token');
try {
const response = await axios.get<ProjectsData[]>(projectsUrl, {
headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
withCredentials: true
});
setProjectsData(response.data);
} catch (error) {
console.error("Error fetching projects:", error);
}
};
return (
<div>
<AdminPageTemplate type="projects" children=<AdminModContent data={projectsData} />/>
</div>
);
};
export default ProjectsPage;
Spring Boot에서 단위 테스트로 CORS 정책 테스트
접근법 3: CORS 정책 검증을 위한 단위 테스트 작성
// CorsTest.java
@RunWith(SpringRunner.class)
@WebMvcTest
public class CorsTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testCorsHeaders() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.options("/api/projects/admin/toinspection")
.header(HttpHeaders.ORIGIN, "http://localhost:8081")
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.header().exists("Access-Control-Allow-Origin"))
.andExpect(MockMvcResultMatchers.header().string("Access-Control-Allow-Origin", "http://localhost:8081"));
}
}
보안 및 API 디자인의 맥락에서 CORS 탐색
다룰 때 CORS(교차 원본 리소스 공유) 최신 웹 애플리케이션에서는 그 뒤에 숨겨진 보안 의미를 이해하는 것이 중요합니다. CORS는 악의적인 웹사이트가 사용자를 대신하여 무단 API 요청을 하는 것을 방지하기 위해 브라우저의 보안 조치로 구현됩니다. 이는 인증 토큰 및 사용자 자격 증명과 같은 중요한 데이터가 프런트엔드 서비스와 백엔드 서비스 간에 교환되는 시나리오에서 특히 중요합니다. Spring Boot 백엔드에서 CORS를 설정할 때 신뢰할 수 있는 원본만 보호된 리소스에 액세스하도록 허용하는 것이 중요하므로 보안 구성을 시스템 아키텍처의 핵심 요소로 만듭니다.
또 다른 중요한 측면은 실제 GET 또는 POST 요청 전에 브라우저에서 자동으로 요청하는 실행 전 요청을 처리하는 것입니다. 이는 클라이언트가 서버가 원본 간 요청을 허용하고 특정 헤더나 메서드를 지원하는지 여부를 확인해야 할 때 발생합니다. 어떤 경우에는 이러한 문제를 처리하는 데 잘못된 구성이 발생합니다. 비행 전 요청 Postman과 같은 도구에서 실제 요청이 제대로 작동하는 경우에도 문제가 발생하여 CORS 오류가 발생할 수 있습니다. 올바른 헤더와 메소드로 Spring Boot의 'CorsRegistry'를 구성하면 실행 전 요청이 올바르게 처리되어 프런트엔드와 백엔드 간의 원활한 상호 작용이 가능해집니다.
또한 CORS 처리는 정적이거나 일률적으로 적용되어서는 안 됩니다. 마이크로서비스로 관리되는 동적 환경에서는 API마다 보안 요구 사항이 다를 수 있습니다. 일부 API는 특정 메소드만 노출해야 하는 반면 다른 API는 오리진에 대해 더 엄격한 제어가 필요할 수 있습니다. 여기에서는 각 엔드포인트에 대한 CORS 구성을 미세 조정하는 것이 중요합니다. 적절한 CORS 관리는 불필요한 실행 전 요청을 줄이고 원활한 사용자 상호 작용을 보장하여 API 성능을 최적화하는 데도 도움이 됩니다.
React 및 Spring Boot의 CORS에 대해 자주 묻는 질문
- CORS는 무엇이며 왜 필요한가요?
- CORS는 교차 출처 요청을 허용하거나 차단하기 위해 브라우저에서 시행하는 보안 메커니즘입니다. 신뢰할 수 있는 원본만 API에 액세스할 수 있도록 하려면 이 정보가 필요합니다.
- Spring Boot에서 CORS를 어떻게 활성화합니까?
- Spring Boot에서는 다음을 구성하여 CORS를 활성화할 수 있습니다. @WebMvcConfigurer 인터페이스를 사용하여 허용되는 출처, 메소드 및 헤더를 지정합니다. allowedOrigins 그리고 allowedMethods.
- 내 요청이 Postman에서는 작동하지만 브라우저에서는 실패하는 이유는 무엇입니까?
- Postman은 CORS와 같은 브라우저 보안 정책을 우회하지만 브라우저는 이를 엄격하게 시행합니다. 서버가 적절한 CORS 헤더를 브라우저에 보내는지 확인하세요.
- 비행 전 요청이란 무엇입니까?
- 실행 전 요청은 자동으로 수행됩니다. OPTIONS 특히 단순하지 않은 HTTP 요청의 경우 서버에서 실제 요청을 허용하는지 확인하기 위해 브라우저에서 보내는 요청입니다.
- CORS 설정을 어떻게 테스트할 수 있나요?
- 다음을 사용하여 CORS 구성을 테스트할 수 있습니다. MockMvcRequestBuilders.options() 실행 전 요청을 시뮬레이션하고 서버 응답을 확인하기 위한 단위 테스트에서.
React와 Spring Boot의 CORS에 대한 최종 생각
해결 CORS 오류 React 및 Spring Boot를 사용하는 애플리케이션에서는 브라우저에서 시행하는 보안 정책을 명확하게 이해해야 합니다. Spring Boot 백엔드에서 허용되는 원본과 메서드를 올바르게 구성하면 이러한 문제의 대부분을 예방할 수 있습니다.
또한 요청 시 토큰을 안전하게 처리하고 적절한 헤더가 전송되도록 하면 프런트엔드와 백엔드 시스템 간의 원활한 통신이 보장됩니다. 이 가이드는 개발자가 직면한 일반적인 문제를 해결하고 안전하고 기능적인 교차 출처 요청을 보장하는 데 도움이 됩니다.
React 및 Spring Boot의 CORS 솔루션에 대한 소스 및 참조
- 취급에 관한 자세한 정보 코르스 Spring Boot 애플리케이션의 오류는 공식 Spring 문서에서 확인할 수 있습니다. 스프링 프레임워크 CORS 문서
- Axios를 사용하여 React 애플리케이션에서 CORS를 관리하는 방법을 이해하려면 이 가이드를 참조하세요. Axios 요청 구성
- Baeldung의 이 기사에서는 Spring Boot 환경에서 CORS를 구성하는 방법에 대한 통찰력을 제공합니다. Baeldung - Spring Boot CORS 가이드
- MDN(Mozilla 개발자 네트워크)은 CORS와 웹 보안에서의 중요성에 대한 포괄적인 설명을 제공합니다. MDN 웹 문서 - CORS