사이드 프로젝트를 배포하고 나서 getCurrentPosition() 콜백이 호출이 안 됐다. 콘솔에 에러도 없었다. HTTPS 보안 설정을 빠뜨린 탓이었다. HTTP로 배포하면 브라우저가 Geolocation, Service Worker, getUserMedia를 에러 메시지도 없이 조용히 차단한다.
HTTP와 HTTPS의 실제 차이
차이는 하나다. TLS(Transport Layer Security) 암호화 유무다.
HTTP → 요청/응답 평문 전송. 네트워크 중간에서 누구나 읽을 수 있다.
HTTPS → TLS로 암호화. 중간에서 가로채도 해독 불가.
공개 Wi-Fi에서 HTTP 요청을 패킷 캡처하면 로그인 폼 데이터, 세션 쿠키, API 응답이 그대로 보인다. 프로토콜 자체는 동일하고, 포트만 80에서 443으로 바뀌고 TLS 핸드셰이크가 추가된다.

HTTPS 없이 막히는 브라우저 기능들
Secure Context(보안 컨텍스트) 가 없는 환경에서는 민감한 브라우저 API를 차단한다. localhost는 예외적으로 Secure Context로 취급하기 때문에 로컬에서는 동작하다가 배포 후 막히는 증상이 생긴다.
| 기능 | HTTPS 없으면 | Chrome 적용 버전 |
|---|---|---|
| Geolocation API | 차단 | Chrome 50+ |
| Service Worker | 등록 불가 (PWA 불가) | 모든 버전 |
| getUserMedia (카메라/마이크) | 차단 | Chrome 47+ |
| Web Crypto API | 일부 메서드 제한 | 모든 버전 |
| HTTP/2 | 사실상 지원 안 함 | 모든 주요 브라우저 |
Service Worker가 없으면 PWA를 구현할 수 없다. 오프라인 지원, 푸시 알림, 앱 설치 프롬프트가 전부 Service Worker에 의존한다.
쿠키 보안과 HTTPS의 관계
Secure 플래그가 붙은 쿠키는 HTTPS 연결에서만 전송된다. HTTP 환경에서는 쿠키 자체를 서버로 보내지 않는다.
// Express 세션 쿠키 설정
res.cookie('session', token, {
httpOnly: true,
secure: true, // HTTPS가 아니면 이 쿠키는 전송 자체가 안 됨
sameSite: 'Strict'
});
HTTP로 배포했을 때 “로그인이 안 된다”는 증상이 여기서 생긴다. 서버는 쿠키를 내려보냈지만 HTTP 환경이라 브라우저가 다음 요청에 전송하지 않는다.
httpOnly 플래그는 XSS 공격으로 세션 토큰이 탈취되는 경로를 막는다. 그러나 쿠키 자체가 평문으로 전송되면 HttpOnly가 있어도 의미가 없다. 쿠키 vs 세션 vs 토큰 차이에서 각 플래그의 동작 원리를 확인하자.
SEO와 사용자 신뢰에 미치는 영향
Google은 2014년부터 HTTPS를 랭킹 신호로 사용한다. HTTP 페이지에 폼이 있으면 Chrome 주소창에 “안전하지 않음”이 표시돼 이탈률에 직접 영향을 준다. HTTPS에서 HTTP로 유입된 트래픽은 Referer 헤더가 삭제돼 Google Analytics에서 (direct)로 잡힌다.
Let’s Encrypt로 5분 안에 HTTPS 설정하기
무료다. 설정이 5분이면 끝난다.
# Certbot 설치 (Ubuntu/Debian 기준)
sudo apt update
sudo apt install certbot python3-certbot-nginx
# 인증서 발급 + Nginx 설정 자동 적용
sudo certbot --nginx -d yourdomain.com
# 자동 갱신 테스트 (90일마다 갱신, cron/systemd 자동 설정됨)
sudo certbot renew --dry-run
Certbot이 443 포트, 80 → 443 리다이렉트, Nginx 설정을 자동으로 처리한다.
HSTS 헤더를 추가하면 이후 HTTP 요청을 브라우저 레벨에서 차단할 수 있다.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
배포 전 HTTPS 설정 확인 항목은 서버 배포 전 확인 체크리스트에 있다.
자주 묻는 질문
Q. Cloudflare를 쓰면 HTTPS가 자동으로 되는 건가?
Cloudflare “Flexible SSL”은 브라우저↔Cloudflare 구간만 HTTPS다. Cloudflare↔오리진 서버 구간은 HTTP일 수 있다. 오리진 서버까지 완전히 암호화하려면 Cloudflare SSL/TLS 설정을 “Full (strict)”으로 바꾸고 오리진에도 인증서를 설치해야 한다.
Q. 로컬에서는 Geolocation이 됐는데 배포 후 안 되는 이유는?
Chrome은 localhost와 127.0.0.1을 Secure Context로 취급한다. 실제 도메인은 HTTPS가 없으면 Secure Context가 아니다. MDN Secure Contexts에서 정확한 판단 기준을 확인할 수 있다.
Q. 인증서 만료되면 사이트가 죽나?
Let’s Encrypt 인증서는 90일 유효다. Certbot 설치 시 자동 갱신이 설정된다. sudo certbot renew --dry-run으로 갱신 설정을 확인해두자. 보안 관련 추가 방어 항목은 XSS 방어 체크리스트에서 확인하자.
한줄 정리: HTTPS 보안은 보안 때문만이 아니다. Geolocation, Service Worker, Secure 쿠키가 동작하게 하려면 HTTPS는 필수다. Let’s Encrypt로 무료로 설정할 수 있는데 안 하는 이유가 없다.