본문 바로가기
기타/HTTP

HTTPS 동작 원리와 Certbot을 이용한 적용 방법

by 방배킹 2026. 1. 11.

HTTPS는 HTTP에 SSL/TLS 암호화 계층을 추가한 통신 방식이다.

즉, HTTPS는 HTTP + TLS(Transport Layer Security) 로 구성되어 있으며,

다음 세 가지 목표를 동시에 만족하도록 설계되었다.

  • 서버 인증(Authentication)
  • 기밀성(Confidentiality)
  • 무결성(Integrity)

HTTP의 한계

기본 HTTP 통신은 다음과 같은 문제를 가진다.

  • 데이터가 평문으로 전송됨
  • 중간자 공격(MITM)에 의해 데이터 도청·변조 가능
  • 접속한 서버가 진짜 서버인지 검증 불가

HTTPS는 이러한 문제를 TLS Handshake + 암호화 통신으로 해결한다.

HTTPS 통신 과정

HTTPS 통신은 최초 연결 시 TLS Handshake를 수행한 뒤, 암호화된 HTTP 통신을 진행한다.

전체 흐름

  1. 클라이언트(브라우저)가 서버에 HTTPS 연결 요청
  2. 서버가 CA가 서명한 인증서 전달
  3. (도메인 정보, 서버 공개키, CA 전자서명 포함)
  4. 클라이언트가 인증서를 검증
    • CA 서명 유효성, 인증서 체인 무결성, 도메인 일치 여부, 인증서 유효 기간
  5. 인증서 검증 성공 시,
    • 클라이언트가 대칭키(Session Key) 생성
    • 서버의 공개키로 암호화하여 전달
  6. 이후 모든 HTTP 요청/응답은 대칭키로 암호화되어 통신

정리

  • 인증서로 서버 신원 검증
  • 비대칭키로 대칭키를 안전하게 교환
  • 실제 데이터 전송은 대칭키 기반 암호화

CA란

CA(Certificate Authority)는 특정 공개키가 특정 도메인(또는 조직)에 속해 있음을 보증하는 신뢰 기관이다.

CA의 역할

  • 인증서 발급 요청자의 도메인 소유권 또는 신원 확인
  • 공개키와 도메인 정보를 결합
  • 해당 정보에 대해 CA의 개인키로 전자서명
  • 서명된 결과를 X.509 인증서 형태로 발급

브라우저는 미리 내장된 신뢰 가능한 CA 목록을 통해 인증서를 검증한다.

HTTPS 인증서 발급 과정

HTTPS 인증서 발급은 크게

① 도메인 소유권 검증 → ② 공개키 서명 단계로 이루어진다.

1. 서버 키 쌍 생성

  • 서버에서 개인키(Private Key)공개키(Public Key) 생성

2. CA에 인증서 발급 요청

  • 공개키와 도메인 정보를 포함해 CA에 요청

3. 도메인 소유권 검증

▪ HTTP-01 방식

  1. CA가 임의의 토큰 생성
  2. 서버에 특정 경로에 파일 생성 요청
  3. /.well-known/acme-challenge/...
  4. CA가 해당 URL로 접근해 파일 내용 검증

▪ DNS-01 방식

  1. CA가 검증 문자열 제공
  2. 도메인 DNS에 TXT 레코드 등록
  3. CA가 DNS 조회로 값 일치 여부 확인

4. 인증서 발급

  • CA가 도메인 정보 + 서버 공개키를 묶어
  • CA의 개인키로 전자서명
  • HTTPS 인증서 발급

Certbot이란

CertbotLet’s Encrypt 인증서를 자동으로 발급·갱신해주는 클라이언트 도구이다.

Certbot이 담당하는 역할은 다음과 같다.

  • 도메인 소유권 증명
  • Let’s Encrypt와 통신
  • 인증서 발급
  • 만료 전 자동 갱신

정리하면,

  • Let’s Encrypt → 인증서 발급 기관 (CA)
  • Certbot → 인증서 자동화 도구

현재 서버 구성

서버는 Docker Compose 기반으로 구성되어 있다.

컨테이너 구성

  • Nginx
    • 리버스 프록시
    • 80 / 443 포트 처리
    • HTTPS 종료(TLS Termination)
  • Next.js
    • 프론트엔드
  • Spring Boot
    • 백엔드 API

Certbot + Nginx 설정 방식

1. 인증서 저장 볼륨 구성

인증서는 컨테이너 내부가 아닌 호스트 볼륨에 저장해야 한다.

/etc/letsencrypt

이 경로를:

  • Nginx 컨테이너
  • Certbot 컨테이너

에서 공유 볼륨으로 마운트한다.

2. 도메인 인증 방식 (HTTP-01)

Certbot은 HTTP-01 방식으로 도메인을 검증한다.

동작 흐름은 다음과 같다.

  1. Certbot이 인증 파일 생성
  2. Let’s Encrypt가로 직접 접근
  3. <http://도메인/.well-known/acme-challenge/>...
  4. 파일 확인 → 도메인 소유 증명 완료

80 포트는 반드시 외부에 열려 있어야 한다.

3. 인증서 발급 후 Nginx 적용

인증서 발급이 완료되면 다음 경로에 파일이 생성된다.

/etc/letsencrypt/live/도메인/
├─ fullchain.pem
└─ privkey.pem

Nginx에서 해당 인증서를 지정해:

  • 443 포트 HTTPS 활성화
  • HTTP → HTTPS 리다이렉트

를 설정한다.

4. Docker Compose 구성 추가하기

▪ Nginx가 80/443 직접 처리 (TLS Termination)

nginx:
ports:
-"80:80"
-"443:443"
  • 외부 요청은 모두 Nginx가 수신
  • HTTPS는 Nginx에서 종료
  • 내부 서비스(frontend/backend)는 HTTP로 통신

▪ 인증서/챌린지 볼륨 공유

nginx:
volumes:
-./certbot/conf:/etc/letsencrypt:ro
-./certbot/www:/var/www/certbot:ro

certbot:
volumes:
-./certbot/conf:/etc/letsencrypt
-./certbot/www:/var/www/certbot
  • conf → 인증서 저장 (live/, archive/, renewal/)
  • www → HTTP-01 인증 파일 위치

▪ Certbot 자동 갱신 (12시간 주기)

certbot:
entrypoint: >
    /bin/sh -c "trap exit TERM;
    while :; do
      certbot renew;
      sleep 12h & wait $${!};
    done;"
  • 12시간마다 certbot renew 실행
  • 만료가 가까울 때만 실제 갱신
  • live/ 심볼릭 링크 자동 갱신

▪ Nginx reload 루프 (6시간 주기)

nginx:
command: >
    /bin/sh -c "while :; do
      sleep 6h & wait $${!};
      nginx -s reload;
    done & nginx -g 'daemon off;'"
  • 인증서 갱신 후 Nginx 설정 반영 목적
  • 주기적 reload로 최신 인증서 적용

'기타 > HTTP' 카테고리의 다른 글

CS스터디 - 4주차 Network  (1) 2024.08.15
REST API  (0) 2024.01.29
[HTTP] HTTP 버전 별 차이, UDP기반 프로토콜을 사용하는 HTTP/3,  (1) 2024.01.19
Web Server 와 WAS  (1) 2024.01.17
[HTTP] HTTP 통신 과정  (2) 2024.01.16

댓글