SSL 인증서의 작동원리와 자동갱신 구조

워드프레스, 도커, EC2, 클라우드플레어 등으로 사이트를 운영하다 보면
“SSL 인증서 설치 완료”, “HTTPS 적용됨”이라는 문구를 자주 보게 됩니다.
목차
그런데, 한 번쯤은 이런 의문이 들죠.
“SSL 인증서는 정확히 뭐고,
왜 이걸 설치해야 하는 거지?”
이번 글에서는 SSL의 원리부터 자동갱신(certbot) 구조까지,
실무에서 바로 쓸 수 있는 내용을 중심으로 정리합니다.
HTTPS와 SSL의 관계
SSL(Secure Sockets Layer)은
웹 브라우저와 서버 간의 데이터를 암호화해 주는 기술입니다.
HTTP는 데이터를 “평문”으로 전송하지만,
HTTPS는 SSL을 통해 데이터를 “암호화”해서 전송합니다.
👉 즉,
- HTTP → 누군가 네트워크에서 내용을 가로볼 수 있음
- HTTPS → 내용이 암호화되어 외부에서 볼 수 없음
예를 들어
로그인 비밀번호나 결제 정보가 HTTP로 전송되면 그대로 노출되지만,
HTTPS에서는 안전하게 암호화되어 전송됩니다.
SSL 인증서가 하는 일
SSL 인증서는 “이 사이트는 진짜 맞습니다” 라는 신분증 역할을 합니다.
즉, 브라우저가 접속할 때 이렇게 확인합니다 👇
1️⃣ 사이트에 SSL 인증서가 있는지 확인
2️⃣ 인증서를 발급한 기관(CA, Certificate Authority)이 신뢰할 수 있는 곳인지 검사
3️⃣ 인증서 안의 공개키(Public Key)로 암호화 통신 시작
이 과정을 TLS 핸드셰이크(TLS Handshake) 라고 부릅니다.
(TLS는 SSL의 최신 버전으로, 지금은 SSL 대신 TLS가 쓰입니다.)
SSL 통신 과정 (핸드셰이크 요약)
1️⃣ 클라이언트(브라우저) → “서버야, 인증서 보여줘!”
2️⃣ 서버 → 인증서(공개키) 전달
3️⃣ 브라우저 → 인증서 유효성 검사 (발급기관, 기간, 도메인 일치 여부)
4️⃣ 검증 완료 시 → 세션키 생성 후 암호화된 연결 시작
이후 모든 데이터는 세션키로 암호화되어 교환됩니다.
그래서 중간에 누가 데이터를 훔쳐도 내용을 해독할 수 없습니다.
SSL 인증서의 종류
| 종류 | 설명 | 예시 |
|---|---|---|
| DV (Domain Validation) | 도메인만 검증, 무료/자동 발급 가능 | Let’s Encrypt, ZeroSSL |
| OV (Organization Validation) | 기업 정보 포함, 상업용 | GeoTrust, Comodo |
| EV (Extended Validation) | 회사명까지 표시, 신뢰도 최고 | DigiCert, Sectigo |
일반적인 블로그·기업 사이트라면 DV형(무료) 으로 충분합니다.
워드프레스, Nginx, Cloudflare 모두 DV형을 기본 지원합니다.
SSL 인증서 파일 구성
서버에 설치되는 SSL 인증서는 보통 다음 3가지 파일로 구성됩니다.
| 파일명 | 역할 |
|---|---|
.crt 또는 .pem | 인증서 본문 (공개키 포함) |
.key | 개인키 (Private Key) — 절대 유출 금지 |
.ca-bundle | 상위 인증기관의 체인 파일 (CA Chain) |
이 3개가 함께 있어야 브라우저에서 “자물쇠 아이콘 🔒”이 뜹니다.
실무에서 인증서를 설치하는 방법
1️⃣ Let’s Encrypt + Certbot (가장 일반적인 방법)
리눅스 / Nginx / Apache 환경에서는 다음 명령으로 자동 발급이 가능합니다.
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d modoomo.net -d www.modoomo.net
→ Certbot이 자동으로 Nginx 설정을 수정하고 HTTPS 적용까지 끝냅니다.
이후 브라우저에서 https://modoomo.net 접속 시
자물쇠 아이콘이 표시됩니다.
2️⃣ cPanel에서 설치하기
호스팅 환경(cPanel, ChemiCloud, Hostinger 등)은
“SSL/TLS → 무료 Let’s Encrypt 설치” 메뉴에서 클릭 한 번으로 설정 가능.
갱신 또한 자동으로 진행됩니다.
SSL 자동갱신 구조 (Certbot Renewal)
SSL 인증서는 유효기간이 90일입니다.
그래서 갱신을 자동으로 돌려야 합니다.
Certbot은 아래 명령으로 자동갱신을 설정합니다 👇
sudo crontab -e
그리고 다음 줄 추가:
0 3 * * * /usr/bin/certbot renew --quiet
➡ 매일 새벽 3시에 갱신을 확인하고,
➡ 만료 30일 전이면 자동으로 새 인증서를 발급받습니다.
갱신 후 웹서버 재시작도 자동 적용됩니다.
Cloudflare의 SSL 프록시 구조
Cloudflare를 쓰면,
실제로 내 서버에 SSL을 직접 설치하지 않아도 HTTPS가 동작합니다.
이유는 Cloudflare가 중간에서 프록시(Proxy) 역할을 하기 때문입니다.
| 구간 | 암호화 여부 | 설명 |
|---|---|---|
| 사용자 ↔ Cloudflare | ✅ HTTPS 적용됨 | |
| Cloudflare ↔ 내 서버 | 선택 (Flexible / Full / Full Strict) |
- Flexible: 서버는 HTTP여도 OK
- Full: 서버도 HTTPS 필요 (인증서 무관)
- Full Strict: 서버 인증서까지 검증 (가장 안전)
Cloudflare + Let’s Encrypt를 함께 쓰면
성능 + 보안을 모두 확보할 수 있습니다.
SSL 인증서가 안 될 때 확인할 것
| 문제 | 원인 | 해결 |
|---|---|---|
NET::ERR_CERT_DATE_INVALID | 인증서 만료 | sudo certbot renew 실행 |
ERR_CERT_COMMON_NAME_INVALID | 도메인 불일치 | 인증서 재발급 (-d example.com) |
| 자물쇠 대신 “주의 요함” | 체인(CA) 누락 | .ca-bundle 포함 확인 |
| Cloudflare 활성화 후 525 오류 | 서버 SSL 없음 | Flexible → Full 변경 |
마무리 — HTTPS는 사이트 신뢰의 기본
SSL 인증서는 이제 선택이 아니라 필수입니다.
검색엔진(특히 구글)은 HTTPS가 아닌 사이트를 검색 순위에서 제외하거나 낮추기도 합니다.
요약하자면 👇
- HTTPS = 암호화 + 신뢰 + SEO
- Let’s Encrypt = 무료 + 자동갱신
- Certbot = 1회 설치로 끝, cron으로 자동화
- Cloudflare = 중간 프록시로 IP 보호 + SSL 강화