
HTTPS는 HTTP에 SSL/TLS 암호화 계층을 추가한 통신 방식이다.
즉, HTTPS는 HTTP + TLS(Transport Layer Security) 로 구성되어 있으며,
다음 세 가지 목표를 동시에 만족하도록 설계되었다.
- 서버 인증(Authentication)
- 기밀성(Confidentiality)
- 무결성(Integrity)
HTTP의 한계
기본 HTTP 통신은 다음과 같은 문제를 가진다.
- 데이터가 평문으로 전송됨
- 중간자 공격(MITM)에 의해 데이터 도청·변조 가능
- 접속한 서버가 진짜 서버인지 검증 불가
HTTPS는 이러한 문제를 TLS Handshake + 암호화 통신으로 해결한다.
HTTPS 통신 과정
HTTPS 통신은 최초 연결 시 TLS Handshake를 수행한 뒤, 암호화된 HTTP 통신을 진행한다.
전체 흐름
- 클라이언트(브라우저)가 서버에 HTTPS 연결 요청
- 서버가 CA가 서명한 인증서 전달
- (도메인 정보, 서버 공개키, CA 전자서명 포함)
- 클라이언트가 인증서를 검증
- CA 서명 유효성, 인증서 체인 무결성, 도메인 일치 여부, 인증서 유효 기간
- 인증서 검증 성공 시,
- 클라이언트가 대칭키(Session Key) 생성
- 서버의 공개키로 암호화하여 전달
- 이후 모든 HTTP 요청/응답은 대칭키로 암호화되어 통신
정리
- 인증서로 서버 신원 검증
- 비대칭키로 대칭키를 안전하게 교환
- 실제 데이터 전송은 대칭키 기반 암호화
CA란
CA(Certificate Authority)는 특정 공개키가 특정 도메인(또는 조직)에 속해 있음을 보증하는 신뢰 기관이다.
CA의 역할
- 인증서 발급 요청자의 도메인 소유권 또는 신원 확인
- 공개키와 도메인 정보를 결합
- 해당 정보에 대해 CA의 개인키로 전자서명
- 서명된 결과를 X.509 인증서 형태로 발급
브라우저는 미리 내장된 신뢰 가능한 CA 목록을 통해 인증서를 검증한다.
HTTPS 인증서 발급 과정
HTTPS 인증서 발급은 크게
① 도메인 소유권 검증 → ② 공개키 서명 단계로 이루어진다.
1. 서버 키 쌍 생성
- 서버에서 개인키(Private Key) 와 공개키(Public Key) 생성
2. CA에 인증서 발급 요청
- 공개키와 도메인 정보를 포함해 CA에 요청
3. 도메인 소유권 검증
▪ HTTP-01 방식
- CA가 임의의 토큰 생성
- 서버에 특정 경로에 파일 생성 요청
- /.well-known/acme-challenge/...
- CA가 해당 URL로 접근해 파일 내용 검증
▪ DNS-01 방식
- CA가 검증 문자열 제공
- 도메인 DNS에 TXT 레코드 등록
- CA가 DNS 조회로 값 일치 여부 확인
4. 인증서 발급
- CA가 도메인 정보 + 서버 공개키를 묶어
- CA의 개인키로 전자서명
- HTTPS 인증서 발급
Certbot이란
Certbot은 Let’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 방식으로 도메인을 검증한다.
동작 흐름은 다음과 같다.
- Certbot이 인증 파일 생성
- Let’s Encrypt가로 직접 접근
- <http://도메인/.well-known/acme-challenge/>...
- 파일 확인 → 도메인 소유 증명 완료
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 |
댓글