UMC 프로젝트로 개발하고 있는 공작소 서비스에 https 설정을 진행해야 하는데, AWS 내에서 도메인을 구매하는 것이 아닌 호스팅 케이알에서 구매한 이후 연결을 진행하고 있어 관련된 내용을 정리해본다. 하나의 도메인에서 프론트 도메인과 백엔드 도메인을 같이 사용할 것이기에, 관련된 사항도 같이 진행할 것이다.
기본 상황은 아래와 같다.
진행 내용
이번 서비스에서는 ALB를 사용하지 않는다. 그 이유로는 ALB를 사용 시, 별도의 과금이 추가적으로 부과되는데 서버 비용 부담을 최소화하는 것이 더 우선순위가 높은 프로젝트이고, 실제 트래픽의 양이 많지 않기에 Nginx에서의 https 설정으로 인한 서버 성능 저하는 문제가 발생하지 않을 것이라고 판단했기 때문이다. 관련해서 트래픽의 양이 많아지게 된다면, ALB로의 전환을 고려할 예정이다.
프론트엔드는 Netlify를 기반으로 배포되어 있기에, netlify에서 자체 생성해준 도메인이 존재한다. 그렇기에 해당 도메인으로 연동될 수 있도록 포워딩 설정을 진행해주면 된다. 포워딩 설정을 진행해준 결과, http는 정상적으로 접속되지만, https는 접속되지 않는 상황이 발생하여 netlify에서도 관련된 추가 설정이 필요한 것으로 판단되어 업데이트를 진행하고 있다. 이 부분은 유의해서 진행해야 할 것 같다.
백엔드 서버의 경우, 서브도메인으로 dev가 붙어있는 도메인이 연결되도록 설정하고자 했기에, A 레코드를 이용하여 DNS 설정을 진행했다.
Nginx로 해야하는 설정은 아래와 같다.
처음엔 EC2 내 apt-get으로 nginx를 설치하여 연동을 시도했지만, 정상적으로 진행되지 않았다. 그렇기에, docker container로 nginx를 올리고자 시도했지만 정상적으로 진행되지 않았었다.
열심히 원인을 찾아가보니 보안그룹 때문이였다. 혹시 저와 동일하게 진행하고 계시는 분들이 있다면, 꼭 EC2 보안그룹에 80포트가 열려있는지 확인하고 진행하셨으면 한다.
sudo apt-get install nginx
위 명령어를 입력하여 nginx를 설치하면 된다.
default 파일은 비활성화시키기 위해 아래와 같이 444를 반환시키도록 수정했다. 그 이유는 이 사이트를 참고하길 바란다.
# default file
location {
return 444;
}
이후, nginx.conf 파일의 http 블록 안에 server 블록을 아래와 같이 설정했다. server_name은 요청이 들어오는 서버 도메인 주소이며, 80포트로 열려있다는 의미이다. 이렇게 들어오는 모든 요청을 스프링부트 서버 포트인 8080으로 포워딩되도록 설정했다.
# nginx.conf
http {
server {
listen 80;
server_name [server domain];
location / {
proxy_pass http://127.0.0.1:8080;
}
}
}
수정이 완료되었다면 nginx를 재시작한다.
sudo service nginx restart
위와 같이 도메인만 입력해도, 정상적으로 springboot server의 error page가 로드되는 것을 확인할 수 있다.
Nginx with certbot을 보면 certbot을 활용하여 SSL/TLS 설정이 가능하다고 안내되어 있다. 안내된 방식과 유사하게 진행하고자 한다.
Cerbot 공식문서에 안내된 방식 또한 참고해서 진행한다.
Certbot 공식문서에서는 "You'll need to install snapd and make sure you follow any instructions to enable classic snap support."라고 작성되어 있다. 그렇기에, apt-get이 아닌 snap을 사용할 수 있도록 새롭게 설치를 진행해야 한다.
sudo snap install core
sudo snap refresh core
이후 apt-get으로 설치된 certbot이 있을 수 있으므로 제거해야 한다.
sudo apt-get remove certbot
snap으로 certbot을 설치한다. 두 번째 줄은 "Execute the following instruction on the command line on the machine to ensure that the certbot command can be run."를 목적으로 하는 명령어로, certbot 명령어가 실행될 수 있도록 보장하기 위한 명령어이다.
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
--nginx를 통해 nginx 환경에 대해서 실행될 수 있도록 하며, 뒤는 서버 도메인 주소이다.
sudo certbot --nginx -d dev.gongjakso.xyz
certbot으로 진행하게 되면, 무료 SSL/TLS 인증서 발급과 관련된 Let's Encrypt를 사용하게 된다. 이 무료의 단점은 90일마다 재발급을 진행해야 한다는 것인데, certbot은 이를 지원하고 있다. 이를 확인하기 위해서는 아래의 두 명령어를 통해서 확인해볼 수 있다.
sudo certbot renew --dry-run
systemctl list-timers
주석과 기본적인 내용들은 제거하고 변경된 사항들만 가져왔다.
http {
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
server {
server_name dev.gongjakso.xyz;
location / {
proxy_pass http://127.0.0.1:8080;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/dev.gongjakso.xyz/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/dev.gongjakso.xyz/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = dev.gongjakso.xyz) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name dev.gongjakso.xyz;
return 404; # managed by Certbot
}}
listen 443을 통해 https 포트에 대해 응답한다는 것을 확인할 수 있고, if 내의 listen 80을 https로 리다이렉트 시킨다는 부분을 통해 http(80)으로 오는 요청에 대해 https로 리다이렉트함을 확인할 수 있다.
위와 같이 connection in secure이 잡히는 것을 확인할 수 있다.
레퍼런스