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/주소'});

 

 

2009. 12. 17. 17:11 PROGRAMMING
[FLASH/AS2] 플래시 액션스크립트2 크로스도메인 설정, AS2 CrossDomain
플래시에서 XML 데이타를 읽어들여야할때
로컬에선 잘 됬을지 모르나,
인터넷상에선 서버가 서로 틀리게 되면 보안정책 위반으로 읽어오지 못함

1. xml이 위치한 서버에 crossdomain.xml을 생성
2. swf를 로딩하는 곳에서 allowScriptAccess 확인
* 스크립트에서 직접 보안정책파일(crossdomain.xml)을 지정할 수도 있다.

crossdomain.xml
<?xml version="1.0" encoding="utf-8"?>
<cross-domain-policy>
 <allow-access-from domain="*" />
</cross-domain-policy>
allow-access-from은 아래와 같이 쓸수 있음
<allow-access-from domain="*.kaudo.com" to-ports="*" />
<allow-access-from domain="kaudo.com" to-ports="80" />
<allow-access-from domain="www.kaudo.com" />


특별한 파일명으로 직접 설정할때에는 Flash 스크립트창에 직접 써줘도 된다.
System.security.allowDomain("*");
System.security.loadPolicyFile(http://도메인/crossdomain.xml);


그리고 swf를 로딩하는 <object나 <embed태그에 allowScriptAccess는 always로 명시해줘야한다.
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="984" height="855" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="allowFullScreen" value="true" />
<param name="movie" value="플래시파일.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#FFFFFF" />
<param name="wmode" value="transparent" />
<embed src="플래시파일.swf" quality="high" bgcolor="#FFFFFF" width="984" height="855" align="middle" allowScriptAccess="always" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" />
</object>
allowScriptAccess = always, sameDomain, never 기본값은 sameDomain
2009. 6. 26. 11:01 PROGRAMMING
javascript cross domain access
도메인이 서로 다른 페이지들끼리 통신하려면,
보안문제로 "사용 권한이 없습니다"라는 오류가 발생합니다.

www.kaudo.com과 blog.kaudo.com이 자바스크립트로 통신하려면 도메인을 맞춰주면 됩니다.
둘다 www와 blog의 서브도메인들이기때문에,
양쪽 페이지에
<script>
document.domain="kaudo.com";
</script>

처럼 코딩하면 문제없이 사용할 수 있습니다.

* www없는 kaudo.com과 같은 도메인도 www와는 다른도메인으로 인식합니다. www와 루트도메인을 섞어쓸때는 페이지 상단에 항상 document.domain="[루트도메인]";을 써주는게 좋습니다. (물론 도메인을 하나만 쓰는게 가장 이상적이죠__)

최근에 올라온 글

최근에 달린 댓글