[S-HOOK] HTTPS 도메인 연결 과정
언젠가 또 해야할 과정 같아 전체적인 흐름을 기록해보았습니다!
HTTP 도메인 연결
1. 도메인을 구입한다. ( 가비아를 사용했습니다. )
2. DNS 설정을 진행한다 ( 가비아 DNS 관리 URL)
DNS 레코드를 추가한다.
DNS 레코드 : DNS에서 도메인에 관한 설정을 하기 위해 사용되는 일련의 문자들을 뜻한다.

DNS 레코드 데이터 주요 정보
- 타입 ( 주요 타입만 설명 )
- A 레코드 : 도메인 주소와 서버의 IP 주소를 직접 매핑해주는 레코드이다.
- CNAME 레코드 ( Canonical Name ) : 도메인 주소를 또 다른 도메인 주소와 매핑해주는 레코드이다.
- 호스트
- 도메인 앞에 붙을 호스트 이름 ( ex. www )
- 아무것도 없을 경우에는 @ 를 작성한다.
- TTL ( Time To Live ) : DNS 서버가 검색한 결과에 대한 캐시가 유지되는 시간 ( 초 단위 )
- 레코드가 수정, 삭제가 되어도 TTL 까지 캐시가 살아있기에 적용까지 시간이 걸린다.
추가해야할 레코드

위의 레코드를 추가해면 도메인과 실제 서버 IP 가 매핑된다.
사용하려는 서버의 포트에 접근하는 방법 ( http 로 접근시 80포트만 접속된다. )
- 직접 포트를 입력한다 ( ex. mydomain.com:8080 )
- 80 포트에서 WAS 포트를 향한 포트 포워딩 ( 리버스 프록시 )을 설정한다. ( 아래 에서 자세히 설명 )
HTTPS 적용 ( aws ec2 ubuntu 환경)
1. 사용하는 도메인의 SSL 인증서를 발급한다. ( Nginx, Certbot 사용)
Nginx란?
여러가지 기능을 제공하는 웹 서버 소프트웨어
내가 사용한 Nginx의 기능
- HTTPS 지원 : SSL 인증서를 사용하여 데이터를 암호화하고 보호하는 기능을 제공한다.
- 사용자가 접속 시 브라우저와 서버 사이에 안전한 암호화된 연결을 설정하여 데이터를 전송한다.
- 리버스 프록시 : 포트 포워딩을 통해 클라이언트와 웹 서버 사이에서 중간 역할을 한다.
Certbot 이란?
무료로 SSL 인증서를 발급받고 관리하는 도구 ( 주로 Nginx, Apache 와 함께 사용 된다.)
2. Nginx, certbot 을 설치한다. ( apt-get 패키지 매니저 업데이트 후 진행 추천 )
sudo apt-get update
sudo apt-get install nginx
sudo apt-get install certbot python3-certbot-nginx
3. Certbot 을 통해 SSL 인증서를 발급받는다.
( 명령어를 실행하면 설정파일이 수정되니 필요하다면 백업을 해놓으라는 내용 )
- 한 개의 도메인에 해당하는 인증서를 발급할 때
sudo certbot --nginx -d your_domain.com - 여러 도메인에 해당하는 인증서를 발급할 때
# You may specify multiple domains with -d and obtain and sudo certbot --nginx -d example.com -d www.example.com
발급한 뒤 아래 명령어를 실행시켜보자
cat /etc/nginx/sites-available/default
설정 파일을 확인 하면 중간 중간 코드들이 자동적으로 추가되어 있음을 확인할 수 있다. ( # managed by Certbot 주석이 달려있다. )
server {
server_name [서버 도메인]; # managed by Certbot
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/[서버 도메인]/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/[서버 도메인]/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
}
4. 적용을 위해 Nginx 테스트, 재시작
sudo nginx -t
sudo service nginx restart
Nginx 를 이용한 포트 포워딩
일단 nginx 설정 파일을 봐보자
cat /etc/nginx/nginx.conf
여기서 우리가 봐야할 주요 설정은 여기다.

Virtual Host Configs 즉 가상호스트 설정이다.
Nginx 는 가상호스팅 설정을 통해서 하나의 물리적 서버에서 여러 개의 도메인 또는 서브도메인을 호스팅할 수 있게 하며 이를 통해 포트 포워딩 ( 리버스 프록시 )을 진행한다.
아래 include에 해당하는 디렉토리로 이동해보자.


위에는 아무것도 없고 아래에는 default 라는 파일이 존재한다.
이 파일에서 사용가능한 간단한 기본 설정들에 대해서 알아보자
# 기본 서버 설정 블록
server {
listen 80; # IPv4 를 통해 80번 포트로 오는 요청에 대해서 처리한다.
listen [::]:80; # IPv6 를 통해 80번 포트로 오는 모든 요청에 대해서 적용한다.
server_name localhost; # 해당 설정이 적용될 호스트 이름
# 경로 / 에 대한 설정 블록
location / {
root /home/; # 해당 location 에서 사용할 정적 페이지들의 위치
index index.html; # 경로에 접속시 보여줄 페이지
try_files $uri $uri/ /index.html; # 경로가 없거나 경로가 / 인경우 /index.html 로 처리한다.
proxy_pass http://localhost:8080; # WAS와 연동하는 경우 사용되며 요청을 전달한다. ( 리버스 프록시 )
}
}
위에 설정들을 정리하면 아래와 같다.
- http://localhost ( http 기본 포트 80 ) 에 오는 모든 요청을 http://localhost:8080 로 전달한다.
- http://localhost:8080/hello.html 에 접속시 /home/ 경로에 있는 hello.html 을 띄워준다.
- http://localhost:8080 , http://localhost:8080/ , http://localhost:8080/index.html 에 요청시 모모두 /home/ 경로에 있는 index.html 을 띄워준다.
리버스 프록시 추가 설정 목록
-
proxy_redirect off;애플리케이션 서버가 리다이렉션 응답을 전송해도 Nginx는 해당 응답을 그대로 반환한다. -
charset utf-8;
Nginx가 UTF-8 인코딩을 사용하여 요청과 응답을 처리하도록 지정한다. 여러 언어의 인코딩을 올바르게 처리하기 위해 설정한다. -
proxy_set_header HOST $http_host;요청의Host헤더에 클라이언트 요청의Host헤더 값을 넣어서 전달하여, 서버 측에서 실제 요청이 어떤 도메인으로부터 들어온 것인지를 파악할 수 있다. -
proxy_set_header X-Real-IP $remote_addr;요청의 X-Real-IP 헤더에 클라이언트의 실제 IP 주소넣어서 전달하여 서버 측에서 클라이언트의 실제 IP를 파악할 수 있다. -
proxy_set_header X-Forwarded-Proto $scheme;요청의 X-Forwarded-Proto 헤더에 클라이언트 요청에 사용된 프로토콜을 넣어줌으로써 서버 측에서 실제 요청에 사용된 프로토콜을 알 수 있다. (HTTP, HTTPS) -
proxy_set_header X-NginX-Proxy true;요청의 X-NginX-Proxy 헤더를 설정하여 요청이 Nginx 에서 프록시로 처리되었는지 알 수 있다.
간단한 진행과정만 적으려했는데 프로젝트에서 팀원들과 같이 설정하면서 나온 키워드들이 궁금해서 찾고 공부하다 보니 글도 장황해지고 시간도 오래걸렸다. ㅎㅎ
하지만 nginx 는 앞으로도 많이 사용할 것 같고 앞으로 리버스 프록시 에서 생길만한 문제들에 대해 어떤 설정을 사용하면 좋을지 어떻게 해결할 수 있을지 어느정도 감이 오는 것 같아 만족스러운 포스팅이였다.