Develop
Nginx SSL/HTTPS 설정 완벽 가이드 — Let's Encrypt로 무료 인증서를 발급하는 방법
보안 경고 없는 안전한 웹 서비스를 위해, Nginx 프록시 서버에 Let's Encrypt 무료 SSL 인증서를 장착하고 Certbot 크론잡을 통한 90일 만료 대비 자동 갱신 체계를 수립하는 HTTPS 실무 셋업법을 정리했습니다.

- ·Let's Encrypt는 무료 SSL 인증서를 발급하는 비영리 CA로 Certbot으로 자동 발급과 갱신이 가능하다
- ·Let's Encrypt 인증서의 유효기간은 90일이며 Certbot의 자동 갱신 설정으로 만료 30일 전에 자동 갱신된다
- ·HSTS(HTTP Strict Transport Security) 헤더를 설정하면 브라우저가 해당 도메인에 항상 HTTPS로만 접속하게 강제한다
- ·TLS 1.2 이하는 보안 취약점이 있어서 TLS 1.2와 1.3만 허용하는 것이 권장 설정이다
처음 서비스를 런칭하고 HTTP(80포트) 상태로 그냥 방치했다가, 크롬 브라우저 주소창 왼쪽에 빨간색으로 '주의 요함(Not Secure)'이라는 경고 딱지가 큼지막하게 붙어 유저들이 해킹 사이트 아니냐며 불안해했던 씁쓸한 기억이 있습니다. 게다가 모바일 앱과의 통신도 암호화 규격 미달로 다 튕겨나갔죠. 급히 공부해서 Let's Encrypt와 Certbot 도구를 내려받아 HTTPS를 얹고 자물쇠 마크를 띄우자마자 경고가 싹 사라지던 순간의 짜릿함을 잊지 못합니다. 현대 웹 개발에서 HTTPS는 유저의 신뢰와 SEO 노출을 결정하는 최소한의 예의이자 입장권이더군요.
1. Certbot 설치 및 인증서 발급
Nginx 환경에서 Certbot을 활용해 Let's Encrypt SSL 인증서 원클릭 발급받는 방법
SSL 인증서 발급을 수동으로 하려면 도메인 소유권을 수동 챌린지 텍스트로 등록하고 서버에 업로드하느라 번잡함의 극치를 달립니다. 우분투 환경이라면 패키지 매니저인 snap을 통해 certbot을 내리고 certbot-nginx 플러그인을 깔아주는 것이 지름길입니다. 이후 sudo certbot --nginx -d 내도메인 명령어만 쳐주면, Certbot이 도메인 소유권을 실시간 HTTP 챌린지 방식으로 자동 검증하고, 발급 완료된 PEM 인증서 파일들을 /etc/letsencrypt/live/ 경로 밑에 배치한 뒤, Nginx의 가상 호스트 설정 파일까지 알아서 쓱 수정해 배포 준비를 끝마쳐 줍니다.
# Certbot 설치 (Ubuntu)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# Nginx 설정 자동 수정 포함 인증서 발급
sudo certbot --nginx -d example.com -d www.example.com
# 발급 후 자동 갱신 테스트
sudo certbot renew --dry-run
# 인증서 만료일 확인
sudo certbot certificates2. Nginx HTTPS 리다이렉션 최적화
보안 강화를 위해 Nginx에서 HTTP 요청을 HTTPS로 강제 리다이렉트하는 설정법
인증서를 발급했다 하더라도 유저가 http:// 주소로 쳐서 들어오면 여전히 암호화되지 않은 경로로 연결되는 허점이 있습니다. 이를 원천 봉쇄하려면 Nginx 80 포트 블록 내부에 return 301 https://$host$request_uri; 영구 리다이렉트 코드를 심어야 합니다. 나아가 보안 품질을 최고 등급으로 올리려면, 오래된 TLS 1.0/1.1 프로토콜 접근은 완벽히 사장시키고 ssl_protocols TLSv1.2 TLSv1.3;만 안전하게 강제 허용해야 합니다. 추가로 브라우저에게 '앞으로 이 사이트는 무조건 HTTPS로만 들어오렴' 하고 굳건히 기억시키는 HSTS 헤더 옵션까지 더해주면 최고의 안전성 방어벽이 마련됩니다.
Let's Encrypt 인증서 자동 갱신 설정과 만료 방지 방법
Let's Encrypt가 주는 유일한 단점은 인증서 만료 수명이 단 90일이라는 점입니다. 이 90일 주기를 수동으로 챙기다가 깜빡 잊고 넘어가면 어느 날 갑자기 사이트가 마비되어 방문자를 에러 페이지로 반겨주게 되죠. 이를 미연에 타파하기 위해 Certbot은 시스템에 자동 데몬 타이머를 심어 하루 2번 만료 임박 여부를 체크합니다. 여기서 한 발짝 더 나아가, 인증서가 실제로 연장 갱신되는 순간 Nginx 웹서버가 새 PEM 키를 다시 메모리에 로드하도록 --deploy-hook 'systemctl reload nginx' 옵션을 걸어두는 것이 프로덕션 자동화의 핵심 디테일입니다.
3. Nginx SSL 성능 최적화
Nginx SSL 세션 캐시와 HTTP/2 설정으로 HTTPS 성능을 높이는 방법
HTTPS 암호화 셰이크는 서버 측에 연산 부담을 지우고 첫 응답 속도를 깎아먹는 단점이 있죠. Nginx 세션 캐시 설정을 활성화하여 이미 서명이 끝난 브라우저의 키값을 shared 메모리에 일정 수준 박아두면, 재접속 핸드셰이크 연산 시간을 획기적으로 줄여줄 수 있습니다. 또한 하나의 TCP 커넥션을 뚫어 여러 정적 에셋 파일들을 실시간 멀티플렉싱 전송하는 HTTP/2 혹은 HTTP/3 프로토콜을 Nginx listen 구문에 꼭 수반해주어야 지연 속도가 최소화됩니다.
자주 묻는 질문
Certbot 인증서 발급 도중 'Connection refused' 또는 'Timeout' 오류가 나면서 발급이 멈춰요.+
Let's Encrypt 서버가 본인 웹서버의 도메인 80 포트로 본인 인증 챌린지 파일을 조회하러 접근했는데 방화벽이 막아서고 있는 상태입니다. AWS Security Group(보안 그룹) 설정이나 Linux UFW 방화벽 단에서 80번(HTTP) 및 443번(HTTPS) 인바운드 규칙이 전 세계 퍼블릭 방향으로 개방되어 있는지 제일 먼저 점검하셔야 합니다.
여러 서브도메인을 아우르는 와일드카드 인증서(*.domain.com)도 무료 발급이 되나요?+
네, 가능합니다. 다만 와일드카드 인증은 HTTP 웹서버 챌린지 방식으로 불가하고, 도메인의 DNS 정보 자체에 TXT 레코드를 심어 검증하는 DNS 챌린지만 허용됩니다. Cloudflare나 AWS Route 53 같은 도메인 DNS 제공업체의 API 키를 Certbot DNS 플러그인에 물려두면 DNS TXT 레코드 변경 및 인증서 갱신까지 무난하게 올 클리어 자동화할 수 있습니다.
관련 글
Nginx 리버스 프록시로 Node.js 앱을 도메인에 연결하는 방법
Node.js 앱을 직접 80 포트로 띄우는 대신 Nginx를 리버스 프록시로 앞에 세우면 도메인 연결과 HTTPS 적용이 깔끔해진다. 설정 파일 작성부터 Certbot SSL 적용까지 정리했다.
Ubuntu 서버 초기 설정 완벽 가이드 — SSH 키 인증, UFW 방화벽, fail2ban 설정
새 Ubuntu 서버를 할당받으면 가장 먼저 취해야 할 보안 기본기를 정리했습니다. root 직접 로그인 차단, SSH 키 기반 인증 등록 방법, UFW 방화벽 규칙 지정 요령 및 fail2ban을 통한 브루트포스 방어까지 한 번에 다룹니다.
Docker Compose로 Node.js 개발 환경을 구성하는 방법 — 앱과 DB를 한 번에 올리는 방법
Node.js 앱과 PostgreSQL을 docker-compose.yml 하나로 묶어서 실행하면 팀원 누구나 동일한 개발 환경을 docker compose up 한 줄로 구성할 수 있습니다. 볼륨, 핫 리로드, 환경변수 설정까지 정리했습니다.