13강 / 20강
HTTPS — 자물쇠는 어떻게 채우나
TLS 인증서를 이해하고 붙이기
2강의 tcpdump 를 기억하시나요? 80 포트로 오간 요청은
GET / 이 글자 그대로 보였습니다. 로그인 비밀번호도 마찬가지예요.
전자상거래에서는 이게 그냥 위험한 정도가 아니라 법적으로 불가능합니다. 결제 정보를 평문으로 실어 나를 수는 없으니까요. 그래서 HTTPS를 씁니다.
GET / HTTP/1.1 이 그대로 읽히는지 확인하세요.
🖥️ 내 가상 서버
브라우저 안에서 실행 (계산용)
같은 도구로 봐도 본문이 암호문입니다.
🖥️ 내 가상 서버
브라우저 안에서 실행 (계산용)
TLS 핸드셰이크 — 자물쇠를 채우는 순서
손님── ClientHello ──▶서버
제가 아는 암호 방식은 이것들입니다
손님◀── 인증서 ──서버
이건 제 신분증입니다. 공개키도 들어 있어요
손님🔍 검증
이 신분증, 내가 믿는 기관이 발급했나? 이름이 맞나? 기간이 남았나?
손님── 열쇠 교환 ──▶서버
그럼 이 대화에만 쓸 열쇠를 만듭시다
손님🔒 이후 전부 암호화서버
이제 GET / 을 보내도 아무도 못 읽습니다
핵심은 검증 단계입니다. 암호화만 하는 것이라면 인증서 없이도 됩니다. 인증서가 필요한 이유는 "이 서버가 정말 mallshop.kr 인가" 를 확인하기 위해서예요. 그게 없으면 중간에 누가 끼어들어 가짜 사이트를 보여 줘도 알 수 없습니다.
인증서 세 종류 — 무엇을 고를까
| 종류 | 브라우저가 믿나? | 비용 | 언제 쓰나 |
|---|---|---|---|
| Let's Encrypt | ○ 믿음 | 무료 | 대부분의 경우 정답. 90일마다 자동 갱신 |
| Cloudflare Origin | × (브라우저는 안 믿음) | 무료 | Cloudflare 뒤에 숨은 오리진 전용. 15년짜리 |
| 자가서명 | × 경고 뜸 | 무료 | 개발·테스트용. 손님에게 보이면 안 됨 |
쇼핑몰이라면 Let's Encrypt + certbot 이 정석입니다. 명령 한 줄이면 끝나요.
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d mallshop.kr -d www.mallshop.kr
certbot 은 인증서를 받아 오는 것뿐 아니라 nginx 설정까지 알아서 고쳐 주고, 갱신 타이머까지 등록해 줍니다.
Verify return code 가 0 (ok) 인지 확인합니다.
💻 손님 노트북
브라우저 안에서 실행 (계산용)
HTTP로 온 손님은 HTTPS로 보냅니다
인증서를 붙였다고 끝이 아닙니다. 손님이 주소창에 mallshop.kr 만 치면
브라우저는 아직 80번으로 갑니다. 이걸 443으로 넘겨 줘야 해요.
server {
listen 80;
server_name mallshop.kr www.mallshop.kr;
return 301 https://$host$request_uri; # 영구 이사 안내
}
301 은 "영구 이사"입니다(9강). 브라우저가 이 답을 기억해서
다음부터는 처음부터 443으로 갑니다.
위젯에서 인증서를 붙인 뒤 실행해 보세요.
💻 손님 노트북
브라우저 안에서 실행 (계산용)
🤔 확인 문제
Let's Encrypt 인증서 자동 갱신이 실패하는 가장 흔한 원인은?
해설 HTTP-01 검증은 Let's Encrypt 서버가
http://도메인/.well-known/… 에 직접 접속해 확인하는 방식입니다. 방화벽에서 80을 닫으면 갱신이 조용히 실패해요.🤔 확인 문제
PC 크롬에서는 사이트가 정상인데 일부 안드로이드 폰에서만 인증서 오류가 납니다. 원인은?
해설 PC 브라우저는 중간 인증서를 이미 캐시하고 있어 넘어가지만, 캐시가 없는 기기는 체인을 못 이어 실패합니다. 기기마다 다르게 나타나는 인증서 오류는 거의 항상 체인 문제예요.