관심분야/모바일서버

CORS 해결하기(안드로메다 갔다옴)

을량 2019. 11. 5. 10:52

적용대상 시스템 구성도

EC2 구성

√ GW 서버 : nginx(Https)만 허용 uri/port 기반으로 시스템별 분배

지식관리시스템: Xwiki

프로젝트관리시스템: redMine

인증서버: open id 기반 sso 통신을 위한 keycloak

 

Xwiki 시스템을 http->https 로 적용하면서 Mix conent, Cross Domain 문제가 발생됐다.

오픈소스 내부에서 extension 설치 및 데이터 impor시 문제가 발생되었다.

처음은 분배하는 proxy 서버에서 CORS 문제를 해결하면 될거라 생각했다.

구글링 하다보면 다양한 방법의 CORS 해결 방법이 존재한다.

기본적인 Xwikitomca기반으로 기본설치시 아파치 웹서버가 설치되지 않는다.(추후에 확인된사항)

 

구글링과 지인에게 문의하여 확인한 방법

당연히 지금 현상태의 시스템과 동일하게 적용할수 있는것을 찾는것은 불가능하다.

수많은 정보 중 당 시스템과 비슷한 상황의 예제를 적용하여 문제를 해결하는 방법을 우리는 항상 선택하고

수많은 삽질을 하게된다. 그대로 적용할수 없으니

 

1) AWS CORS 적용방식

Amazon Simple Storage Service (S3)  에 설정하는 방식임

당사 AWS에 운영하고 있는 시스템도 아래와 같은 방식으로 적용

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example.com</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
  <MaxAgeSeconds>3000</MaxAgeSeconds>
  <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
  <ExposeHeader>x-amz-request-id</ExposeHeader>
  <ExposeHeader>x-amz-id-2</ExposeHeader>
 </CORSRule>
</CORSConfiguration>

2. Nginx 적용하는 방법

https://enable-cors.org/server_nginx.html

- Proxy 서버(SSL 적용방식) 이라 혹시나 하는 마음에 적용했으나 역쉬 처리 불가

- 그외 다른 구글링을 하여 적용해 보았으나 역쉬 처리 불가

 

3. Apache 적용하는 방법

https://sarc.io/index.php/httpd/1278-apache-how-to-cors

- Xwiki 기본 패키지에  설치 안되기에 처리 불가

 

4. Tomcat 적용하는 방법

- web.xml -

<filter>
    <filter-name>cors</filter-name>
    <filter-class>com.company.project.util.domain.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

- SimpleCORSFilter.java -
 

package com.company.project.util.domain;

 

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

 

@Component
public class SimpleCORSFilter implements Filter {
 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;


        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        
        response.setHeader("Access-Control-Allow-Origin", "*");
     


        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

- 가장 적절해 보였으나 소스 컴파일해서 jar묶어서 lib 폴더에 넣고 하기가 다른 삽질을 불러 올까봐

  최후에 보루로 생각했음.

- 설정만으로 해결할수 없을까 라는 생각으로 더 찾아봄.

- Xwiki는 외쿡에서 많은 사용사례가 존재하고 한국에서는 거의 찾아볼수 없기에 xwiki 포럼을 뒤짐

- 감이 왔다! 될거 같았음 

- 왜냐면 페이지 로딩하다가 CORS에 걸린것이기에 proxy 서버를 수정하는것을 해결이 안되고 xwiki 적용된

  tomcat에 적용해야 될거 같았다. 역쉬 번역기로 돌려보니 내가 찾던 것이었다! 적용하니 바로 해결

- XWIKI는 오픈소스라 커스텀마이징 하기가 굉장히 어렵다. 고로 삽질을 많이 하게된답니다....

 

- 하루가 걸린작업이다.

  이것저것 수정하다 보면 기존에 문제 없는것도 문제가 생기고 해서 안드로메다 갔다가 다시 두번정도 와서

  힘들게 해결하게 되었다.

  사실 이런게 싫어서 개발 안하고 싶었는데 그럼 발전이 없겠죠? 아싫다…..