barded

[CMS] Preflight란? 본문

프로젝트/CMS

[CMS] Preflight란?

barded 2024. 3. 18. 04:26

CORS를 설정하고 요청을 보냈으나 Preflight에러가 떳었다. 이를 알아보자.

Preflight란?

Preflight는 단어 그 자체에서 알 수 있듯, 실제 통신을 하기 전에 미리 통신을 한 번 하는 것이다. 미리 통신을 보내서 Access-Control-Allow-Origin 설정은 되어있는지, 우리가 지금 보내려고 하는 메서드가 이 서버에서 사용 가능한지 확인할 수 있다.

위의 이미지 처럼 진행되는데, OPTIONS 요청으로 전송되고, Access-Control-Request-Method 로 앞으로 할 POST를 보내주고 있다. 서버에서는 해당 데이터를 받고 응답으로 Access-Control-Allow-Methods: POST, GET, OPTIONS 를 보내주고 있다. 이는 이 서버에서 처리하는 메서드는 POST, GET, OPTIONS이라고 알려주는 것이라고 생각할 수 있다.

여기서 받은 POST, GET, OPTIONS라는 정보는 브라우저가 캐싱하고 있다가 따로 Preflight가 필요한 경우에도 직접 요청하지 않고 캐싱한 데이터로 처리한다고 한다.

따라서 이런 Preflight 요청은 서버와 클라이언트가 서로 합의하게 동작을 하고 있는지 확인하는 것이 목적이고, 이로 인해 웹 페이지의 보안성을 챙기고, 서버 입장에서도 당혹스러운 요청을 받지 않도록 막아주는 이점이 있다고 한다.

Spring에서는 한줄을 추가하여 에러를 해결할 수 있엇다.

@EnableWebSecurity
@Configuation
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .requestMatchers(CorsUtils::isPreFlightRequest).permitAll() 
            .anyRequest().authenticated().and()
            .cors().and();
    }
}

이를 통해 요청이 preflight인 경우 모두 허락하여 이후의 요청을 계속 진행되게 할 수 있엇다.