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설정을 이용하여 보안을 좀더 강화 할 수 있을 것이다.
잘 사용해 보도록 하겠다.
끄읏 :)
'IT좋은지식' 카테고리의 다른 글
로컬 개발 환경으로 웹서비스로 공유하기 (0) | 2022.12.16 |
---|---|
WebP 란? (0) | 2022.06.12 |
REST API (0) | 2022.02.16 |
생성자 보단 정적 팩토리 메서드! (왜 정적 생성자를 통해 객체를 생성하는것이 안티패턴인가?) (0) | 2021.06.23 |
Event Driven 이란? (0) | 2021.04.28 |