let's encrypt에서 감사하게도 3개월짜리 무료 https 인증서를 발급해준다.
또 이 인증서는 기간내에 재발급만 받으면 연장하여 사용할 수 있다.
(자동 갱신 코드를 작성하여 자동으로 연장되도록 만들 수도 있다.)
letsencrypt를 통해 https 설정을 해보자!
우선 nginx라는 리버스프록시서버를 이용할것이다.
프록시서버에 대한 자세한 설명은 이 포스트에서는 하지 않겠다.
서버에서 직접 https를 처리하는대신,
리버스프록시서버를 사용하여 https로 만들어줄 것이다.
흐름도는 다음과 같다.
(혹시 오류가 있다면 덧글로 알려주세요~🙏)
1. Nginx를 사용하여 프록시 서버를 만든다.
2. Nginx에 SSL 인증서(https적용)를 받는다.
3. 80번 포트로 접근하면 프록시에서 440번포트(https)로 리다이렉팅시키고,
440번 포트로 접근한 요청을 서버로 보내준다.
ubuntu 16.04.4, 18.04, 20.04 버전에서는 snap이 이미 설치되어있으므로 따로 설치할 필요가 없다.
snap install certbot --classic
sudo apt-get install nginx
nginx가 설치되면, etc/nginx/nginx.conf 파일이 생성된다.
이 파일로 들어가서 nginx의 설정을 바꿔주자.
i(수정)을 눌러 아래쪽에 다음과 같은 코드를 입력하고,
Esc를 누른 후, :wq(저장후 종료)를 눌러 수정된 파일을 저장한다.
server{
server_name {https를 적용하고 싶은 도메인이름};
listen 80;
location / {
proxy_set_header HOST $host;
proxy_pass http://127.0.0.1:3050;
proxy_redirect off;
}
}
server_name에 입력한 도메인으로 HTTPS 인증서가 발급된다.
listen 80으로 요청을 보내면, 현재서버에서 실행되고있는 127.0.0.1:3050포트로 요청을 보내준다.
nginx가 80번포트(http)포트를 사용하여,
80번포트로 들어오는 모든 요청을 proxy_pass로 보내준다.
즉 nginx가 80번 포트를 사용하고, 프론트엔드에서는 proxy_pass로 설정한 포트를 사용해야한다.
**
nginx가 80번 포트를 사용하므로,
프론트서버로 80번 포트를 사용하고 있다면, 80번포트서버를 종료하자.
프론트서버는 80번포트대신 proxy_pass 포트에서 실행할 예정이다.
그리고 certbot을 실행하여 https인증을 받자!
sudo certbot --nginx
그럼 설치가 완료되면서 아래쪽 로그들이 뜬다. 이메일을 입력하고, y 를 선택한다.
마지막 which names would you like to activate HTTPS for?
에는 1번에 nginx.conf에서 설정한 도메인이 입력되어있다. 1번을 눌러서 진행하자.
만약 nginx.conf에서 설정하지 않았다면, 여기서 입력할 수 있다.
** 만약 80번 포트를 종료하지 않은채 실행했다면,
중간에 80번포트가 이미 사용되고있다는 에러가 발생할 것이다.
그럴땐 80번포트를 종료한 후, 다시 nginx를 실행한다.
다음과 같은 로고가 뜨면 성공적으로 https 인증서를 다운 받았다!
다시 한번 nginx.conf 파일을 열어보자.
vim /etc/nginx/nginx.conf
아까 입력한 코드 아래에 certbot이 자동으로 생성해준 코드가 들어가 있는 것을 확인 할 수 있다.
host가 {도메인}라면, https://{도메인}으로 리다이렉트(301)해주는 코드이다.
즉 http로 주소를 입력해도 https로 접속된다.
80번포트는 nginx가 사용하므로,
proxy_pass로 설정해준 {포트번호}로 프론트서버를 실행하도록 수정했으므로,
프론트서버가 들어간 코드를 모두 {포트번호}로 바꾸어준다.
그리고 프론트서버를 재실행하자. : )
사이트에 접속해보면 인증서가 적용된 것을 확인 할 수 있다.
또한 http 요청은 http로, https요청은 https에서만 응답이 가능하므로,
백서버도 위와같은 방법으로 인증서를 발급받자.
백엔드서버 도메인주소랑 포트번호만 다르고 나머지는 동일하다.
** 더이상 http를 사용하지 않으므로, http로 작성된 코드를 https로 바꾸어주자.
** 서버에서 proxy서버(nginx)를 사용하고있으므로,
proxy: true 로 세션을 설정한다.
(프록시 설정을 하지 않으면 쿠키를 주고받을 수 없다.)
** 백서버의 proxy header를 X-Forwarded-Proto로 설정해주어야
클라이언트 접속이 http인지 https인지 알려준다.
proxy_set_header X-Forwarded-Proto $scheme;
nginx.conf를 수정한 후에는 nginx를 재시작해야한다.
sudo systemctl restart nginx
참고
- nginx: https://velog.io/@jeff0720/2018-11-18-2111-%EC%9E%91%EC%84%B1%EB%90%A8-iojomvsf0n
- certbot: https://blog.buffashe.com/2020/09/get-ssl-cert-via-letsencrypt/
- certbot : https://www.zerocho.com/category/NodeJS/post/5ef450a5701d8a001f84baeb
댓글 영역