AWS HTTPS 구현 및 프로젝트 개괄

donchanee·2021년 3월 27일
0

딥러닝 프로젝트

목록 보기
1/3
post-thumbnail

프로젝트 개요👋!

Django, Gunicorn, Nginx 를 사용한 웹 서버, WAS 구성

Front 단의 웹캠 캡쳐 사진을 MediaDevices.getUserMedia()로 띄우고, drawImage() 메소드로 캡쳐합니다.

그 후, 캡쳐한 사진을 base64 encoding을 하고 fetch를 사용해 POST로 Django에게 보냅니다.

Django는 view에서 POST로 인코딩된 데이터를 받아 base64.b64decode로 디코딩을 하고

이미지를 저장합니다. 저장한 이미지를 토치서브로 전송하고 requests.post로 요청합니다.

받아온 응답을 r이라고 할 때, r.json()으로 json형식으로 만들어서 classes에 1의 값이 있다면

마스크를 안쓴 사람이 판별된 것이기에 상황에 맞게 alert 및 redirect합니다.

난관 : HTTPS 적용

MediaDevices.getUserMedia()라는 메소드를 사용했는데,
이 함수는 Secure 환경 즉, https 환경을 요구했습니다.

아래는 MediaDevices.getUserMedia() 함수의 지원 환경입니다.

AWS ec2에 이미 배포가 되었다는 전제가 깔려있습니다.

HTTP는 인터넷상의 무수히 존재하는 웹사이트의 데이터를 송수신하는데 필요한 통신 프로토콜입니다.

이 http통신을 보다 안전하게 수행하기 위한 프로토콜 및 URI스킴을 https라고 하는데,

엄밀하게 말하면 https 자체는 프로토콜이 아니고, SSL/TLS프로토콜에 의해 제공되는 시큐어한 접속상태에서 http통신을 수행하는 것을 말합니다.

이렇게 시큐어한 접속상태를 유지하기 위하여 SSL인증서의 발행이 필요하게 됩니다.

SSL 인증서란?

SSL 인증서는 클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서인데

중간에 어떤 신뢰있는 기관이 인증서를 발급해주면 우리는 그 인증서를 받아다가 우리의 서버에 인증서를 두면 외부에서 이 서버는 SSL 인증이 된 것이라고 대신 말해주는 뭔가 자격증 발급기관 같은 일을 한다. 다른 접속하려는 주체는 진위확인을 할 수 있는? 그런 방식

도메인 얻기

일단 먼저 도메인을 얻어야합니다. 도메인이라면 저희가 아이피를 작성해서 배포한 페이지에 들어가는 것이 아닌, 영어로 된 외우기 쉬운 문자들로 된 naver.com과 같은 조합입니다.

https://www.freenom.com/en/index.html?lang=en 이라는 도메인을 무료로 제공해주는 사이트가 있습니다.

여기에 접속하셔서 회원가입을 해주시고 가운데에 보이는 Find a new FREE domain란에 원하는 도메인을 대충이나마 검색을 해주시면 됩니다.

제 닉네임으로 검색했을 때 4가지의 무료 도메인이 사용가능하다고 나옵니다.

여기서 아무거나 골라서 Get it now!를 눌러주시고, Checkout의 단계로 넘어가주시면 됩니다.

Use DNS를 누르고 사용하고 싶은 IP address를 입력합니다. EC2 였다면 EC2의 Public IP 이겠죠?

그 후 여기서 3 Months @ FREE 부분에서 최대 12개월까지 무료가 가능하니 12개월로 연장해주고 Continue를 누릅니다.

그 후 약관이 나오는데 체크를 하고 Complete Order를 하면 주문이 완료가 되게 됩니다.

Let's Encrypt

Let's Encrypt라는 쉽고 편하고 무료인 Certificate Authority가 있습니다. 위에서 말했던 인증기관입니다.

certbot 이라는 소프트웨어를 사용해서 편하게 SSL 적용을 도와줍니다.

1. Ubuntu

Ubuntu 16.04 (LTS), Ubuntu 18.04 (LTS)

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update

Ubuntu 20.04 (LTS) 저장소 세팅

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo apt-get update

위의 우분투 버전대로 설치를 하신다음,

$ sudo apt-get install certbot python3-certbot-nginx

위의 명령어로 certbot을 설치해줍니다.

2. Nginx 세팅

그 다음으로 Nginx 설정을

ertbot이 자동으로 SSL을 세팅해주기 때문에 server block과 server_name을 설정해주면 됩니다.

$ sudo vim /etc/nginx/sites-available/[your server block]

아래는 제 예시입니다. kdt-a1.ml에 블록들이 있기 때문에 아래처럼 되었습니다.

$ sudo vim /etc/nginx/sites-available/kdt-a1.ml

이제 서버 블록 파일 안에 server_name을 설정하고자 하는 도메인 이름으로 변경해주시면 됩니다. 저는 아래와 같습니다.

...
# configuration of the server
server {
  server_name kdt-a1.ml www.kdt-a1.ml;

  location = /favicon.ico { access_log off; log_not_found off; }

  location /static {
    alias /home/ubuntu/a1/web/static;
  }

  location / {
    include proxy_params;
    proxy_pass http://unix:/tmp/gunicorn.sock;
  }
}

설정이 완료 되었다면 저장하고 아래 명령어를 통해서 재시작합니다.

$ sudo nginx -t
$ sudo service nginx reload

3. SSL 인증

아래 명령어를 사용하면 nginx plugin을 통해서 SSL 인증이 가능합니다.

$ sudo certbot --nginx -d example.com -d www.example.com

저는 아래와 같습니다.

$ sudo certbot --nginx -d kdt-a1.ml -d www.kdt-a1.ml

그러면 아래와 같이 1과 2를 선택하는 화면이 나오는데 모든 경우를 https로 하고 싶어서 redirect를 허용하는 2번을 하였습니다.

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

설정한 certbot은 90일 동안만 유효하기 때문에 갱신을 해줘야합니다.
아래 입력한 명령어로 자동 갱신이 가능하게 됩니다.

$ sudo certbot renew --dry-run

참고자료

위와 같이 진행한 후 url으로 SSL LABS에서 평가한 결과 위와 같이 https 적용이 완료되었고, 실제로 접속해도 https 사용이 되고있다고 출력됩니다.

0개의 댓글