문제) 비동기 처리 과정에서 CORS 에러 확인
CORS (Cross-Origin Resource Sharing)는 웹페이지의 리소스가 다른 도메인, 프로토콜, 또는 포트가 달라도 안전하게 접근할 수 있도록 허용하는 보안 기능입니다. CORS 정책은 웹 브라우저가 기본적으로 구현하고 잇으며, 웹 보안의 중요한 부분입니다.
CORS 에러 발생 원인
CORS 에러는 웹 애플리케이션이 다른 출처의 리소스에 접근하려 할 때 해당 출처에서 적절한 CORS 헤더를 포함하지 않은 응답을 반환하면 발생합니다. 예를 들어, http://domain-a.com에서 실행 중인 웹 페이지가 http://domain-b.com/data.json을 요청하고, domain-b.com에서 Access-Control-Allow-Origin 헤더 없이 응답하면 브라우저는 CORS 에러를 발생시키고 요청을 차단합니다.
1. 전역 설정
- Global 설정을 적용하는 방법입니다.
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("/**") // 모든 URL 패턴에 대해 CORS 정책을 적용합니다.
.allowedOrigins("*") // 모든 출처에서의 접근을 허용합니다. (특정 도메인으로 제한하고 싶다면 "*" 대신 "http://example.com"과 같이 구체적으로 명시할 수 있습니다.)
.allowedMethods("GET", "POST", "PUT", "DELETE") // 허용할 HTTP 메소드를 명시합니다. 여기서는 GET, POST, PUT, DELETE 메소드를 허용합니다.
.allowedHeaders("Authorization", "Content-Type") // 서버가 요청에서 허용하는 HTTP 헤더를 명시합니다. 여기서는 Authorization과 Content-Type 헤더를 허용합니다.
.exposedHeaders("Custom-Header") // 응답에 포함시킬 수 있는 추가적인 헤더를 명시합니다. 클라이언트가 읽을 수 있도록 "Custom-Header"를 노출시킵니다.
.allowCredentials(false) // 쿠키나 인증 관련 헤더를 포함한 요청을 허용하지 않습니다. 이 설정은 보안 상의 이유로 중요할 수 있습니다.
.maxAge(3600); // 사전 요청 (preflight request) 결과를 캐시하는 시간을 초 단위로 설정합니다. 여기서는 3600초, 즉 1시간 동안 캐시합니다.
}
}
2. Controller 설정
- Controller 또는 Controller의 메소드에 annotation을 통해 적용하는 방법입니다.
1. Controller class에 설정
@Slf4j
@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class FetchApiTest {
@PostMapping("/save")
public SaveDTO save(@RequestBody SaveDTO saveDTO){
log.info("name={}, age={}", saveDTO.getId(), saveDTO.getPw());
return saveDTO;
}
}
2. method에 설정
@Slf4j
@RestController
public class FetchApiTest {
@CrossOrigin(origins = "*")
@PostMapping("/save")
public SaveDTO save(@RequestBody SaveDTO saveDTO){
log.info("name={}, age={}", saveDTO.getId(), saveDTO.getPw());
return saveDTO;
}
}
'SpringBoot' 카테고리의 다른 글
[Spring Boot] @Configuration vs @Component (0) | 2024.04.30 |
---|---|
[Spring Boot] Validation Annotation (DTO) (0) | 2024.04.29 |
[Spring Boot] fetch API와 Server 데이터 서버 (0) | 2024.04.29 |