2020년 1월26일 새벽 1시 40분

이렇게 글을 쓰는 이유는 같은 실수를 반복하지 않기 위해서다.

최근 며칠동안 골머리를 썩이는 문제가 있었다. CORS(Cross Origin Resource Sharing) 관련한 문제인데 분명 한달전에는 쉽게 넘어간 문제였다.

문제의 발단

모든 발단은 Centos8로 부터 시작되었다. 2달전 Centos8이 배포되고 podman이라는 컨테이너 기술을 지원한다는 것에 큰 흥미를 느꼈었다. docker라는 강력하고 숙성된 컨테이너 기술이 있고 현재 사용중이었지만, podman의 rootless지원과 데몬(systemd) 수준이 아닌 kernel레벨인가?에서의 구동 방식이었다. 

도커의 경우 데몬으로 돌아가기 때문에 데몬이 죽으면 모든 컨테이너가 죽게된다. 또한 도커 방식이기 때문에 rootless가 아니다. 반면에 podman은 데몬 방식이 아니라(커널 레벨인가?) 보안 측면에서도 훨씬 안전하다. 그리고 podman 역시 어느정도 성숙된 프로젝트다.

하지만 한국에서는 많은 자료를 찾을 수 없을 뿐더러 docker와 비슷하지만 혼동되는 부분이 많고 centos8에 기본 설치된 버전은 network 미지원과 pod라는 녀석이 컨테이너마다 생성되어 docker와는 확실히 다르다. 여러가지를 분석하면서 이 녀석은 분명 kubernetes를 강력히 염두해 둔 녀석이며 초기단계의 마이크로서비스를 원한다면 docker-compose와 비슷한 podman-compose를 사용해야 하지만 이 녀석 생각보다 도커와 호환되지 않는다. 다시말해 kubernetes와 사용하지 않으면 험란할 것이 예상되었다.

그러던 와중에 centos8과 postgresql12의 충돌로 보이는 현상으로 부팅이 안되고 몇번이고 서버를 밀기를 반복했다.  이 걸로 몇일을 씨름하면서 배운 것도 많고 교훈도 얻었다. 하지만 너무 머리가 아퍼서 다시 이런 삽질은 하고싶지 않다.

왜 그렇게 많은 서비스들이 애플리케이션 버전에 대해 그렇게 보수적인지.. 그리고 새로운 기술은 쏟아져 나오지만 쉽게 건너가지 않는지 등등.. 비록 알고있는 사실이지만 이렇게 머리가 아퍼보니 두 번다시 겪고 싶지 않다.

하지만 podman은 점점 입지를 굳히고 있다. centos8부터 도커 지원이 중단되고 podman을 지원하는 것만봐도 그렇다. 언젠간 사용하게 되면 지금 삽질이 조금은 도움은 되리라.

문제 해결

어쨌든 이렇게 글을 쓰는 이유는 위와 같은 삽질을 끝내고 다시 Centos7으로 돌아와서 시작된 문제였다. CORS 문제였는데 정말 간단한 문제였다. 하지만 그 간단함을 생각하지 못하고 정말 많은 방식으로 문제해결을 하려고 했었다.  react에서 nginx 프락시 서버로 접속할 때 Access-Control-Allow-Origin: * 헤더가 먹지 않는 문제였다. 분명 주소를 정확히 사용했지만 도메인 주소로 접속할 때는 되는데 ip주소로 사용할 때는 CORS 에러가 뜨는 것이었다.

정말 머리가 터질거 같았는데, 내가 잘못한 것은 없어보였다. 

도저히 안풀릴 것 같아서 거의 포기하고 내일 일찍일어나 해결하고자 누웠지만 머리 속에서는 CORS를 해결하기 위해 에러를 찾아내는 회로가 열심히 돌어갔다. 3시간 정도 잠을 자는 듯 마는듯 하다가 갑자기 머리 속에서 떠오르는 것이 있었다. (nginx 컨테이너에서 설정한 port는  호스트 컴퓨터와 포트포워딩이 되어 있었는데 이걸 모르고 내부에서 저 포트로(80) 계속 연결햇던 것 같은데... nginx로 연결 포트를 아무렇게나 (8000)으로 바꿔볼까..?)

유레카?

같지만 컴퓨터를 키고 컨테이너를 생성하고 컨테이너에 접속하고 설정을 변경하고 하는데만 몇분이 걸리고 해결이 되지도 않으면 실망할 듯 싶었다. 

그래도?

언제나 그랬듯이 컴퓨터를 킨다. 그리고 아무렇지도 않은 듯 기계적인 움직임으로 모든 설정을 변경한 후... 리액트 코드에서 서버에 fetch를 날린다.... restfulAPI에서 데이터가 뽑힌다. OK!. 아...! 진짜 감사합니다. 


이 문제를 해결함으로써 많은 부분이 연결고리처럼 쉽게 해결되었다.  

뜻이 있는 곳에 길이 있음을 믿는다.

이 댓글을 비밀 댓글로