목차9개 항목
출처와 참고
Vladislav Denishev의 「HTTP에서 HTTPS로 전환하기 위한 완벽 가이드」(웹액츄얼리 번역, 2018.11)를 바탕으로 재구성한 노트다. 혼합 콘텐츠는 web.dev의 「What is mixed content?」, 「Fixing mixed content」, 「Why HTTPS matters」를 바탕으로 보강했다.
HTTPS 전환이란
HTTPS는 HTTP를 TLS로 감싸 기밀성·무결성·인증을 보장한다. 원리(대칭키·공개키, 핸드셰이크, HSTS)는 HTTPS와 TLS에 있다. 이 노트는 이미 HTTP로 운영하던 사이트를 HTTPS로 옮기는 절차를 다룬다.
HTTPS는 선택 사항이 아니다. 브라우저는 HTTP 페이지를 "안전하지 않음"으로 표시하고, 서비스 워커·위치·카메라·클립보드 같은 API는 보안 컨텍스트에서만 동작하며, HTTP/2와 HTTP/3도 사실상 TLS 위에서만 쓴다.
인증서 고르기
검증 수준
웹사이트에는 도메인 통제만 확인하는 DV 인증서면 충분하다. OV·EV는 법인 확인을 더할 뿐 암호화 강도는 같고, 브라우저도 더는 구별해 보여 주지 않는다. 세 수준의 비교는 HTTPS와 TLS에 있다.
도메인 범위
| 종류 | 덮는 이름 | 비고 |
|---|---|---|
| 단일 도메인 | example.com, www.example.com | 주체 대체 이름(SAN) 필드에 둘 다 넣는 것이 보통이다 |
| 다중 도메인 (SAN) | 목록에 적은 서로 다른 도메인·서브도메인 | 인증서를 보면 묶인 도메인이 다 드러난다. 관련 있는 도메인끼리만 묶는다 |
| 와일드카드 | *.example.com의 한 단계 서브도메인 | a.b.example.com은 덮지 않는다. ACME에서는 DNS 검증으로만 받는다 |
키 종류
ECDSA(ECC) 키는 RSA보다 작고 빠르다. P-256이면 충분하다. RSA는 호환성이 필요할 때 2048비트를 쓴다. 4096비트는 핸드셰이크 비용만 늘린다.
발급과 갱신
flowchart LR a["개인 키 생성"] --> b["CSR<br/>(인증서 서명 요청: 공개 키 + 도메인 정보)"] b --> c["CA 검증"] --> d["서명된 인증서"] --> e["서버 설치"]
- 개인 키는 서버 밖으로 내보내지 않고, 권한을 최소(600)로 둔다. 유출이 의심되면 즉시 폐기(revoke) 하고 새로 받는다.
- 파일 형식은 텍스트(Base64)인 PEM과 바이너리인 DER이 있다. 확장자(
.crt,.cer,.key)는 관례일 뿐이다. - 수동 발급·갱신은 하지 않는다. ACME로 자동화한다. certbot, Caddy, Traefik, 클라우드 로드 밸런서, Vercel·Netlify·Cloudflare 같은 호스팅이 이 일을 대신한다. 공개 인증서의 유효 기간이 47일까지 줄어드는 흐름은 HTTPS와 TLS에 있다.
- 한 IP에서 여러 HTTPS 사이트를 운영하는 것은 SNI(Server Name Indication)로 해결된다. 모든 현대 클라이언트가 지원한다.
전환 체크리스트
| 순서 | 할 일 | 이유 |
|---|---|---|
| 1 | 인증서 설치 후 HTTPS로 모든 페이지가 열리는지 확인 | |
| 2 | 혼합 콘텐츠(mixed content) 제거 | HTTPS 페이지가 http:// 이미지·스크립트를 부르면 브라우저가 차단하거나 경고한다. 자원 URL을 https://나 상대 경로로 바꾸고, 남은 것은 CSP upgrade-insecure-requests로 올린다(하위 리소스만 올리고 페이지 자체는 올리지 않으며 브라우저가 기억하지도 않으므로, 링크를 고치기 전 임시 보강이다). 남은 혼합 콘텐츠는 DevTools 보안 패널이나 Network 필터 mixed-content:all로 찾는다(DevTools Network 패널) |
| 3 | HTTP → HTTPS 301 리다이렉트 | 검색 엔진이 새 URL로 신호를 옮긴다. canonical·사이트맵·내부 링크도 https로 바꾼다(SEO 기초) |
| 4 | HSTS 헤더 추가 | 첫 요청 이후 브라우저가 스스로 HTTPS로만 접속한다. 짧은 max-age로 시작해 늘리고, 안정되면 preload 목록 등록을 검토한다 |
| 5 | 쿠키에 Secure 속성 | 인증 쿠키가 평문으로 새지 않게 한다 |
| 6 | 서버 TLS 설정 점검 | TLS 1.2 이상만 허용하고 1.3을 우선한다. Mozilla SSL Configuration Generator로 설정을 만들고, Qualys SSL Labs 서버 테스트로 확인한다 |
| 7 | 외부 연동 갱신 | 분석 도구·검색 콘솔·결제·웹훅에 등록된 URL을 https로 바꾼다 |
혼합 콘텐츠의 두 종류
혼합 콘텐츠는 HTTPS로 받은 페이지가 하위 리소스를 HTTP로 부르는 상태다. 그 요청은 도청·변조될 수 있어 페이지 전체의 보안이 그 리소스 수준으로 떨어진다. 경고가 뜰 때는 이미 요청이 나간 뒤라 늦다.
| 종류 | 대상 | 위험 | 브라우저 처리 |
|---|---|---|---|
| 능동(active, 차단 대상) | 스크립트, 스타일시트, iframe, fetch·XHR, 폰트 등 페이지를 바꾸거나 코드를 실행할 수 있는 것 | 공격자가 페이지 전체를 장악한다(로그인 정보·세션 쿠키 탈취, 다른 사이트로 이동) | 차단한다 |
| 수동(passive, 업그레이드 대상) | <img>, <audio>, <video> | 이미지 바꿔치기, 어떤 페이지·상품을 보는지 추적 | 주요 브라우저는 https://로 자동 업그레이드해 요청하고, HTTPS로 제공되지 않으면 불러오지 않는다 |
자동 업그레이드는 HTTPS 버전이 없으면 리소스가 깨지는 것으로 끝나므로, 결국 URL을 고쳐야 한다. Chromium 계열은 DevTools Issues 탭에, Firefox·Safari는 콘솔에 막히거나 업그레이드된 리소스를 남긴다.
정리
- HTTPS는 보안·SEO·최신 API 사용의 전제다.
- 웹사이트 인증서는 DV면 충분하다. EV의 시각적 이점은 사라졌다.
- 범위는 단일·다중(SAN)·와일드카드 중 고르고, 키는 ECDSA를 우선한다.
- 발급·갱신은 ACME로 자동화한다. 유효 기간은 계속 짧아진다.
- 설치로 끝나지 않는다. 혼합 콘텐츠, 301, HSTS, Secure 쿠키, TLS 설정까지 챙겨야 전환이 끝난다.
관련 노트: HTTPS와 TLS, 로컬 개발 환경에 HTTPS 적용하기, SEO 기초, 웹 서버, WAS, 그리고 Nginx, 프라이버시를 위한 암호화, 웹 PKI의 변천: 인증서 생태계는 왜 바뀌었나