13강 / 20강

HTTPS — 자물쇠는 어떻게 채우나

TLS 인증서를 이해하고 붙이기

HTTPS — 자물쇠는 어떻게 채우나
자물쇠 아이콘은 암호화와 신원 확인 두 가지를 동시에 뜻합니다.

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 인증서 자동 갱신이 실패하는 가장 흔한 원인은?
🤔 확인 문제
PC 크롬에서는 사이트가 정상인데 일부 안드로이드 폰에서만 인증서 오류가 납니다. 원인은?