web/Spring

Spring Boot Cross Domain 처리

반응형

웹 브라우저에서 같은 도메인을 사용하는 서비스에 대한 요청은 정상적으로 처리가 되나 도메인이 같지 않은 서비스에 요청을 할경우에 오류가 발생한다.

이는 동일 출처 정책(Same Origin Policy) 라는 정책을 두어 다른 도메인의 서버에 요청하는 것을 보안 문제로 간주하고 이를 차단하는 것 때문에 발생한다.

Spring Boot에서 간단한 방식으로 해결할 수 있다.



1. 요청에 @CrossOrigin 애노테이션 붙히기

1
2
3
4
5
@GetMapping("/greet")
@CrossOrigin
public Greet greeting() {
    return new Greet("test");
}
cs


2. 특정 도메인에서 오는 요청만 받고 싶을 경우.

-> 특정 도메인에서 오는 요청만 받고 싶은경우에는 도메인 주소를 기입해주면 된다.

1
2
3
4
5
@GetMapping("/greet")
@CrossOrigin("http://www.naver.com")
public Greet greeting() {
    return new Greet("test");
}
cs


3. 서비스 전체에 대한 요청 허용

-> 하나하나 모든 요청에 마다 @CroossOrigin 애노테이션을 부여하는건 정말 의미없는 짓이다. 그래서 모든 부분에 대한 요청을 처리하기 위해서는 WebMvcConfigurer 빈을 사용하고 addCorsMappings(CorsRegistry registry) 매소드를 재정의하면 애플리케이션 전체에 걸쳐 효력을 미치는 CORS를 적용할 수 있다.

해당 설정에는 다음 내용이 포함되어 있다.

이름
내용
Access-Control-Allow-Orgin
요청을 보내는 도메인 주소 (모든 도메인 대상인 경우 *)
Access-Control-Allow-Methods
요청 메소드 (Default : GET, POST, HEAD)
Access-Control-Max-Age
클라이언트에서 pre-flight의 요청 결과를 저장할 시간 지정. 해당 시간 동안은 pre-flight를 다시 요청하지 않는다. 
Access-Control-Allow-Headers
요청을 허용하는 헤더

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.wedul.microservice.rabbit.dto.config;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
/**
 * microservice
 *
 * @author wedul
 * @since 2018. 8. 24.
 **/
@Configuration
public class ServletContextConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/")
                .allowedOrigins("http://www.naver.com")
                .allowedMethods(HttpMethod.GET.name())
                .allowCredentials(false)
                .allowedHeaders("Content-Type""x-xsrf-token")
                .maxAge(200);
    }
}
 
cs


반응형