'리액트'에 해당되는 글 1건

 
  1. 2020.11.17 Access to fetch at 'https://도메인/엔드포인트' from origin 'https://호출한도메인' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
2020. 11. 17. 17:00 DEV ENVIRONMENT
Access to fetch at 'https://도메인/엔드포인트' from origin 'https://호출한도메인' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

포스트맨으로는 잘되던게 실제 브라우저에서는 오류가 발생했습니다.

알아보니까 실제로는 OPTIONS라는 메소드로 먼저 호출을 한다고 하는데,

그 이름이 PREFLIGHT라고 하네요.

 

그래서 오류가 일반적인 CORS오류가 아니고

blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

라고 적혀있습니다.

 

Access to fetch at 'https://도메인/엔드포인트' from origin 'https://호출한도메인' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

 

스프링프레임웤(스프링부트)에서 해결하는 방법

 

1. 파일중에 WebSecurityConfigurerAdapter를 상속받은 클래스를 찾는다.

 

 

2. 오버라이드 된 configure(HttpSecurity http)메소드를 편집한다. (없으면 만듦)

@Override
protected void configure(HttpSecurity http) throws Exception {

 

 

3. http에 코드 추가

.cors().and()
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()

 

 

* 리액트프론트용 자바스크립트 코드

브라우저에 붙여서 테스트

var Data = {
  METHOD : {
    GET : 'GET',
    POST : 'POST',
    PUT : 'PUT',
    DELETE : 'DELETE'
  },
  TYPE : {
    FILE_UPLOAD : 'Data.TYPE.FILE_UPLOAD'
  },
  load : ( option ) => {
    const accessToken = localStorage.getItem('access.token');
    let parameters = {
      headers : { Authorization : accessToken ? `Bearer ${ accessToken }` : '' },
      method : option.method || Data.METHOD.GET
    };
    switch ( option.method ) {
      case Data.METHOD.POST :
      case Data.METHOD.PUT :
        option.type !== Data.TYPE.FILE_UPLOAD && ( parameters = { ...parameters, headers : { 'Content-Type' : 'application/json' } } );
        break;
      default :
    }
    if ( option.data ) {
      let data;
      if ( option.type === Data.TYPE.FILE_UPLOAD ) {
        data = new FormData();
        for ( let i in option.data ) {
          data.append( i, option.data[ i ] );
        }
      } else {
        data = JSON.stringify( option.data );
      }
      parameters = { ...parameters, body : data };
    }
    window.fetch( option.url, parameters )
      .then( response => response.json() )
      .then(
        ( data ) => {
          if ( data.code === 'S000000' ) {
            option.success && option.success( data.data );
          } else if ( data.hwrErrorCode?.code === 'ERR_SUCCESS' ) {
            option.success && option.success( data.candidates[ 0 ] )
          } else {
            option.error && option.error( data );
          }
        }
      );
  }
};
Data.load({url:'http://localhost/주소'});

 

 

최근에 올라온 글

최근에 달린 댓글