본문 바로가기

IT좋은지식

HTTP 접근제어 (CORS)란?

HTTP 접근제어 (CORS)란?

○  정의

브라우저와 서버간 외부 도메인 서버와 접근하기위한 권한을 알려주는 메커니즘이다.
브라우저와 서버가 정해진 헤더를 통해 요청 응답을 결정하는 방식으로 CORS라는 이름으로 표준화가 되었다.

○ Same-Origin Policy

동일 출처 정책으로 XMLHttpRequest로 다른 웹페이지에 접근 시 같은 출처(프로토콜, 호스트명, 포트) 가 같다는 것을 의미한다.

○ Cross-Origin

동일 출처 정책위반으로 XMLHttpRequest로 다른 웹페이지에 접근 시 접근이 되지않는다.
Cross-Origin 회피를 위해 JSONP를 사용하기도 한다.

○ PreFlight request(사전요청)

브라우저에서는 요청하려는 URL이 외부도메인일 경우 사전요청을 먼저 날리게된다.
HTTP METHOD OPTIONS 메서드를 이용해 날려보고 요청 권한이 있는지 확인한다.

 

○ Sequence Diagram

작동방식

○ 모든 외부 도메인에서요청을 받으려면

HTTP/1.1 204 No Content
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2
Access-Control-Allow-Origin: *  //모든 도메인에서 요청을 허용
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT //Methost 제한
Access-Control-Allow-Headers: Origin,X-Requested-With... //추가
Access-Control-Max-Age: 86400
Vary: Accept-Encoding, Origin
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive

결국에는 서버에서 아래와 같은 응답이 온다면 Cross-Origin 접근이 가능하다.

Access-Control-Allow-Origin: https://whydda.tistory.com

 

간단하게 API 서버 구성 시 CORS 설정 방법 (Spring Boot, Spring Security 사용)

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        // - (3)
        configuration.addAllowedOrigin("*"); //이 여부에 따라서 Cross-Origin 접속 여부를 판단한다.
        configuration.addAllowedMethod("*");
        configuration.addAllowedHeader("*");
        configuration.setAllowCredentials(true);
        configuration.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .anyRequest().permitAll().and()
                .cors() //spring security 에서 cors설정을 사용한다는 의미
                //.cors().disabled //임시적으로 이렇게도 처리 가능
        ;
    }
}

Spring Security를 사용하지 않을 경우

public class WebConfig extends WebMvcConfigurerAdapter {
@Override
        public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
        }
}

 

설정을 끝낸 후 Curl Command를 통해 확인 하도록 하자

curl \
--verbose \
--request OPTIONS \
'http://localhost:8080' \
--header 'Origin: https://naver.com' \
--header 'Access-Control-Request-Headers: Origin, Accept, Content-Type' \
--header 'Access-Control-Request-Method: GET'

cors설정을 이용하여 보안을 좀더 강화 할 수 있을 것이다.
잘 사용해 보도록 하겠다.

끄읏 :)