TL;DR

  • 무료로 SSL 적용이 가능함
  • certbot 이용
  • 장고/플라스크는 wsgi.py를 아파치 설정에 연결
  • 트러블슈팅은 각자의 환경에 따라 구글링 필요

최근 용역했던 웹사이트에 SSL를 적용해달라는 요구가 있어서 이를 실제로 적용하는 단계까지 이르게 되었다. 웹 표준이 점차 자리잡게 되면서, HTTPS 프로토콜을 사용할 경우 브라우저의 주소창에 초록색으로 표시해주는 방식이 보편화되었다. 반대로 HTTPS를 이용하지 않는 경우에는 경고 문구가 표시되면서 일반 사용자가 불안감을 느끼게 되는 원인이 되기도 한다.

용역을 받았던 사이트였기에 SSL 인증서를 구매할 생각으로 검색을 했는데, 가격이 천차만별이고, 기본적으로 가격이 저렴하지 않았다. 보통 단일 도메인 기준 연간 $50에서 $150 정도가 소요되는데, 사용자가 인증서를 확인한다고 가정해보면 신뢰성이 있는 업체의 인증서를 구매해야겠다고 생각을 했다. 꽤나 큰 비용을 고려하다가 문득 GitHub Pages의 SSL를 살펴보았다. “Let’s Encrypt”이라는 곳에서 발급이 되어있어 찾아보니, 무료 인증서 발급 사이트였다. 그리고 몇몇 사이트를 더 검색해보고 나니 무료로 제공되는 오픈소스의 많은 페이지가 이 인증서를 이용하고 있다는 것을 알게되었다.

그래서 SSL를 서버에 적용해야겠다고 생각하고 작업을 시작하였다. HTTPS로 사이트를 바꿀 때 예상치 못한 가장 큰 문제는 모든 html에서 링크로 호출되는 코드 역시 모두 HTTPS 프로토콜을 이용해야 한다는 것이다. 내가 만든 많은 데모 사이트가 장고와 플라스크를 이용한 API를 이용하는데, 이 API 역시 SSL로 바꾸어주어야 한다는 뜻이다. 그리고 장고와 플라스크를 HTTPS로 서비스하기 위해서는 특정포트를 사용하는 데모서버를 쓰면 안되고, wsgi를 이용하여 웹서버를 경유해서 서비스되도록 해야 하며, 웹서버에서 SSL 설정을 해주어야 한다.

우선 웹서버에 HTTPS를 입히는 것은 매우 간단하다. certbot이라는 프로그램을 이용하면 인증서를 다운받고, 설정하는 과정이 매우 간단히 해결된다. 해당 사이트를 참조하여, OS와 웹서버를 선택하고, 안내하는대로 따라서 하면 별 문제없이 설정 가능하다. 중간에 입력하는 것도 이메일 주소와 HTTPS를 적용하려고 하는 도메인 주소 정도만 넣어주면 된다. 이렇게 하면 웹서버를 통해서 서비스되는 대부분의 페이지는 HTTPS로 서비스되는 것을 확인할 수 있다.

다음 문제는 플라스크로 서비스되는 API를 HTTP에서 HTTPS 프로토콜로 바꾸는 일이다. 이를 위해서는 먼저 wsgi 설정이 필요하다. 플라스크 공식 페이지를 참조하여 설정이 가능하다. 다만 가상환경과 경로 설정이 잘 안된다. 파이썬라이브러리 경로를 추가하는 방식으로 서버 환경에 맞추어 이리저리 고쳐보면서, 겨우 돌아가도록 만들었다. 또 다른 문제로 wsgi의 실행ID와 실행그룹을 지정하는데, 이 부분 역시 존재하지 않는 유저로 에러가 발생하기도 한다. 또 하나 신경써야할 점은, API를 사용할 때는 특정포트를 이용하므로 URI에 크게 신경쓰지 않았으나, 웹서버를 경유하게 되면, 플라스크 웹앱의 고유한 링크를 잡아주어야 한다. 즉 동일한 URI에서 포트가 생략되는대신, 해당 앱을 지칭하기 위한 최상위 디렉토리가 하나 더 필요하게 된다. 또 다른 방식으로는 가상호스트(도메인)를 통해서 도메인에 따라서 분기시킬 수도 있다. 즉 api.taegon.kr은 플라스크로 project.taegon.kr은 웹서버의 문서 디렉토리로 향하게 할 수 있다. 하지만 추후 앱이 추가될 것을 생각하면, 여전히 최상위 디렉토리명을 통한 앱 구분이 필요하다.

(업데이트 2018년 9월 1일) 장고가 깔린 서버도 SSL 적용을 완료하였다. 장고는 wsgi.py 파일을 제공하는데, 실행 경로가 프로젝트 루트에서 wsgi.py가 있는 하위디렉토리로 바뀌면서 데이터베이스 위치(sqlite를 썼다)를 못찾는 것을 제외하면, 고칠 부분이 거의 없었다. mediastatic 디렉토리는 아파치 설정에서 alias를 해주어야 한다.

이렇게 지난한 과정을 거치고 나면, 모든 웹페이지를 열여서 http로 구성된 주소를 모두 https로 바꾸어주어야 한다. 혹은 경로를 작성할 때, 프로토콜을 생각하고, //project.taegon.kr처럼 //부터 시작하는 방법도 있다. 이 모든 과정을 마치고 나면 비로소 HTTPS로 초록색 정보아이콘을 가진 주소창을 볼 수 있을 것이다.

(업데이트 2019년 1월 21일) apt-get으로 ssl 모듈이 설치되지 않으면, pythonpip로 설치가능한데, 아나콘다 배포판 버전이 낮을 경우, 아파치에서 ssl 라이브러리를 읽지 못하는 문제가 발생하기도 하였다. 아나콘다 배포판을 업데이트하고 나서 문제가 해결되었다.