CORS란 무엇일까
CORS란 무엇일까?
CORS(Cross-Origin Resource Sharing)의 줄임말로, 한국어로 직역하면 교차 출처 리소스 공유라고 해석할 수 있다. Spring Security 적용하며 CORS 정책을 적용함에 앞서 정리하고자 한다.
Origin
Origin는 출저의 뜻이다. 여기서 Origin을 뜻하는 것은 protocol, host, port가 포함된 내용이다.
하지만 설정할 경우에는 도메인 이름과 프로토콜만 사용한다. http
, https
를 쓰게되면 말하지 않아도 기본값의 포트(port) 값은 80
, 443
이라고 인지하기에 개발환경에서는 다른 포트를 사용하므로 고려해야한다.
CORS 설정할 경우 이런 출처를 알아야한다.
SOP(Same Origin Policy)
같은 출저만 허용하는 정책도 있다. SOP는 지난 2011년, RFC 6454에서 처음 등장한 보안 정책으로 말 그대로 “같은 출처에서만 리소스를 공유할 수 있다”라는 규칙을 가진 정책이다.
그러나 웹이라는 오픈스페이스 환경에서 다른 출처에 있는 리소스를 가져와서 사용하는 일은 굉장히 흔한 일이라 무작정 막을 수도 없는 노릇이니 몇 가지 예외 조항을 두고 이 조항에 해당하는 리소스 요청은 출처가 다르더라도 허용하기로 했는데, 그 중 하나가 “CORS 정책을 지킨 리소스 요청”이다.
SOP의 예외 정책인 CORS 정책을 지키면서 다른 출저의 리소스를 요청해야하는 것이다.
CORS 동작 원리
기본적으로 웹 클라이언트 어플리케이션이 다른 출처의 리소스를 요청할 때는 HTTP 프로토콜을 사용하여 요청을 보내게 되는데, 이때 브라우저는 요청 헤더에 Origin이라는 필드에 요청을 보내는 출처를 함께 담아보낸다.
이후 서버가 이 요청에 대한 응답을 할 때 응답 헤더의 Access-Control-Allow-Origin이라는 값에 “이 리소스를 접근하는 것이 허용된 출처”를 내려주고, 이후 응답을 받은 브라우저는 자신이 보냈던 요청의 Origin과 서버가 보내준 응답의 Access-Control-Allow-Origin을 비교해본 후 이 응답이 유효한 응답인지 아닌지를 결정한다.
CORS를 해결할 수 있는 방법
이때 와일드카드인 *
을 사용하여 이 헤더를 세팅하게 되면 모든 출처에서 오는 요청을 받아먹겠다는 의미이므로 당장은 편할 수 있겠지만, 바꿔서 생각하면 정체도 모르는 이상한 출처에서 오는 요청까지 모두 받아먹겠다는 오픈 마인드와 다를 것 없으므로 보안적으로 심각한 이슈가 발생할 수도 있다.
그러니 가급적이면 귀찮더라도 Access-Control-Allow-Origin: https://kwaktaemin.github.io
같이 출처를 명시해주도록 하자.
Spring Boot 3.대 버전에서는 다음과 같이 설정합니다.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// 기본적으로 corsConfigurationSource라는 이름으로 Bean을 사용합니다.
.cors(withDefaults())
...
return http.build();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("https://kwaktaemin.github.io"));
configuration.setAllowedMethods(Arrays.asList("GET","POST"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
댓글남기기