대부분의 웹 서비스들은 HTTPS를 사용하고 있다.
HTTP는 단순히 텍스트 기반 프로토콜이기 때문에 로그인 정보나 쿠키 등이 네트워크를 지나는 동안 그대로 노출될 수 있다.
반면, HTTPS는 SSL/TLS 암호화로 도청을 막고, 무결성으로 데이터 변조를 방지하며, 인증으로 신뢰할 수 있는 서버임을 보장한다.
이번 포스팅에서는 운영 중인 웹서버에 HTTPS를 적용하는 과정을 나열하려고 한다.
HTTPS는 HTTP 위에 TLS(Transport Layer Security) 계층을 얹은 프로토콜이다. 즉, 서버와 클라이언트가 통신할 때 이 서버가 진짜 맞는지와 데이터를 안전하게 주고받을 수 있는지를 TLS가 보장해주는 구조이다.
그렇다면 왜 도메인이 필요할까?
TLS 인증서를 발급할 때, 인증 기관은 특정 도메인에 대한 소유권을 검증한다.
예를 들어 example.com 에 대한 인증서를 발급받는 경우 CA는 다음을 확인한다.
example.com 의 DNS를 제어할 수 있는가?example.com 의 주인이 맞는가?이 검증 과정을 Domain Vaildation(DV)이라고 부른다.
인증서는 ip주소가 아니라 도메인 이름 단위로 신뢰를 보장한다.
공인 IP는 ISP 클라우드 사업자가 관리하는 자원이다. 따라서 IP는 언제든지 다른 사용자에게 재할당될 수 있다.
이 때문에 인증 기관은 IP 주소만으로 신뢰할 수 있는 소유권을 검증할 수 없다고 판단한다. 즉, IP 주소로는 인증서를 발급받을 수 없다.
하나의 서버가 여러 사이트를 운영할 때, 브라우저는 어떤 도메인에 접속하려는지를 TLS Handshake 초기에 알려준다.
example.com 으로 접속하려고해example.com 용 인증서야!이 과정을 거치기 때문에, 서버는 도메인별로 올바른 인증서를 선택할 수 있고, 클라이언트는 그 인증서가 해당 도메인에 맞는지 검증할 수 있다.
IP만 있다면 이런 매칭이 불가능하다.
나는 가비아에서 도메인을 구입하였다.
가비아에 접속하여 다음 과정으로 도메인과 Web Server를 연결한다.




nslookup [domain]
Non-authoritative answer:
Name: [도메인]
Address: [ip주소]
형태로 출력된다면 정상적으로 등록된 것을 확인할 수 있다.
가장 많이 사용되는 무료 인증서 발급 도구는 Certbot이다.
Let’s Encrypt에서 인증서를 자동으로 발급하고 갱신까지 지원한다.
sudo snap install core
sudo snap install certbot --classic
sudo certbot --nginx -d [domain]
sudo systemctl reload nginx
명령어만 실행하면 /etc/nginx/sites-available/defalut 위치에 SSL 관련 설정을 자동으로 채워주게 된다.