CORS(Cross Origin Resource Sharing)
Origin 이 다른 경우에 자원을 주고 받을 수 있도록 하는 http 통신 프로토콜
요청하는 클라이언트와 응답해야하는 서버의 Origin 이 다른 경우 CSRF(Cross-Site Request Forgery)나
XSS(Cross-Site Scripting) 같은 공격에 취약하기 때문에, 특정 Origin 과 request method 에만 요청을 허용하기 위함이다.
CORS 정책 설정은 Spring MVC 와 Spring Security 두 프레임워크에서 모두 설정이 가능하다.
둘 중 하나만 설정해도 충분한데, 가장 중요한 점은 Spring Security 가 가장 앞단에서 사용자 요청을 처리하기 때문에, Spring Security 에서 cors 를 활성화 시키자
1. Spring MVC
Spring MVC에서 CORS를 적용하는 방법은 크게 총 2가지로 나뉜다.
- 부분적으로 컨트롤러에서 CORS를 설정하는 방법 (Annotation based)
- 전역적으로 Spring MVC 설정에서 CORS를 설정하는 방법
Handler 메소드에 @CrossOrigin 애노테이션을 붙이는 방법
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@RequestMapping(method = RequestMethod.GET, path = "/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
JavaConfig를 통해 CORS 전역 설정(WebConfiguration.java)
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
.allowedOrigins("http://www.example.com")
.allowedMethods("*")
.allowCredentials(false)
.maxAge(3000);
}
}
2. Spring Security
Spring Security에서 CORS를 다루는 가장 확실하고 쉬운 방법은 CorsFilter를 사용하는 것이다. 사용자는 다음과 같이 CorsConfigurationSource를 제공하여 CorsFilter를 Spring Security와 통합 할 수 있다.
Spring Security 사용시 CORS에 걸리지 않으려면 Authentication Filter 인증 보다 앞단계의 필터/인터셉터에서 path 검증로직이 일어나야만 한다.
The CORS configuration in Spring Security
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOrigin("http://localhost:3000");
configuration.addAllowedOrigin("https://test.ssafy.io:3000");
configuration.addAllowedOrigin("https://test.ssafy.io");
configuration.addAllowedHeader("*");
configuration.addAllowedMethod("*");
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
'Backend > Spring' 카테고리의 다른 글
프로젝트 회고(경매중) + 질문 리스트 (1) | 2023.02.20 |
---|---|
[Spring Security] SecurityConfig 작성 (version. Jiwon) (0) | 2023.01.25 |
[SpringBoot] 빌드 및 배포 (0) | 2022.12.27 |
[SpringBoot] 구동 속도 향상 시키기 (0) | 2022.12.27 |
[IntelliJ] IntelliJ Lombok 설치 및 설정 (0) | 2022.12.27 |