Deployment/Cloudflare

Cloudflare를 사용하여 EC2 웹서버에 HTTPS 적용하기(3)

연향동큰손 2025. 9. 26. 17:20

개요

 

Cloudflare를 사용하여 EC2 웹서버에 HTTPS 적용하기(2)

1. 도메인 구매 가비아에서 테스트용으로 'woohyeon.store'를 구입했다. 2. Cloudflare에 도메인 등록 도메인을 등록하고, 도메인에 대한 DNS관리에서 DNS 레코드를 수정해줘야 한다. 도메인과 EC2 서버를

developerwoohyeon.tistory.com

 

앞서 HTTPS를 적용할때는 '가변'(Flexible)' 모드를 사용했기 때문에 클라이언트 -> Cloudflare 구간은 암호화가 되었지만,

Cloudflare -> 원본 서버 로 요청은 암호화가 되지 않아 보안상 안전하지 않았다.

이번에는 암호화 모드를 '전체'(Full)'로 변경하여 Cloudflre -> 원본 서버 구간까지 암호화를 적용해보고자 한다.


SSL이란?

SSL(Secure Socket Layer)은 웹브라우저와 서버간 암호화 통신을 위한 프로토콜이다.

SSL 인증서란?

인터넷 상에서 클라이언트와 웹서버간의 데이터를 안전하게 주고 받기 위해서는 서로 암호화하여 통신을 해야하는데,

SSL 인증서는 SSL 기반하에서 사용자의 웹브라우저와 인터넷 사이트의 웹서버간 암호화 통신을 가능하게 하는 제3의 신뢰기관이 인증한 인증서를 말한다.

 

암호화 모드를 '가변'으로 설정하면 브라우저와 cloudflare 사이에서는 HTTPS 통신이 이루어지고 cloudfalre에서 원본 서버는 HTTP통신을 하기 때문에 원본 서버에 따로 SSL인증서가 필요 없었다.

 

하지만 암호화 모드를 '전체'로 변경하게 되면, Cloudflare와 원본 서버 간의 통신 또한 HTTPS로 암호화되기 때문에 원본 서버에서도 유효한 SSL 인증서를 가지고 있어야 한다. 이 인증서를 통해 Cloudflare는 원본 서버의 신원을 확인하고, 양쪽 구간 모두 암호화된 안전한 통신을 보장할 수 있게 된다.

 

SSL Handshake

클라이언트와 서버가 HTTPS 통신을 하기 위해서는 SSL Handshke를 하게 된다.

 

SSL Handshake의 궁극적 목표 2가지

  • 서버와 클라이언트가 주고받을 데이터의 암호화 알고리즘 결정
  • 서버와 클라이언트가 주고받을 데이터의 암호화를 위한 동일한 대칭키를 얻음

SSL Handshake는 Client Hello, Server Hello, Certificate, Server key Exchange, Client key Exchange를 통해 이루어 진다.

wireshark를 통해 각 단계에 대하여 알아보자.

 

Client Hello

Client Hello는 브라우저가 서버로 "이런 암호화 방식(TLS 버전, Clipher Suite, 압축 방식 등)을 지원해" 라고 서버로 보내는 과정이다.

Clipher Suit는 클라이언트가 지원 가능한 암호화 알고리즘 목록을 의미하고, AES,SHA 등의 알고리즘이 포함되어 잇는것을 확인할 수 있다.

 

 

Server Hello

Server Hello는 서버가 "이 암호화 방식을 사용할게"라고 클라이언트에게 응답을 해주는 과정이다.

패킷의 내용을 확인해보면 클라이언트로 부터 받은 Clipher suite 목록중 선택된 1개의 Clipher suite가 있고, 그 외에 Session ID, TLS version 정보가 포함되어 있는 것을 확인해볼 수 있다. 

 

 

Certificate

Server Hello를 보낸후 서버가 클라이언트에게 자신의 SSL 인증서가 담긴 Certificate 패킷을 전송한다.

이를 통해 클라이언트는 이 서버가 신뢰할 수 있는 기관에 의해 발급된 건지 검증할 수 있다.

 

Server Key Exchange,  Server Hello Done

서버의 공개키가 SSL 인증서에 없는 경우, 서버가 직접 전달하는 과정이다.

SSL 인증서 내부에 공개키가 있는 경우에는 Server Key Exchange는 생략된다.

만약 인증서 내부에 공개키가 있다면 CA(Certificate Authority 인증기관)의 공개키를 통해 인증서를 복호화 한 후 Server의 공개키를 확보할 수 있다.

 

 

Client Key Exchange

대칭키(비밀키)를 클라이언트가 생성하여 SSL인증서 내부에서 추출한 서버의 공개키를 이용해 암호화한 후 서버에게 전달하는 과정이다.

이 대칭키를 통해 클라이언트와 서버가 교환하고자 하는 데이터를 암호화 할 수 있게 된다.

 

키교환 과정

 

1. 서버 → 클라이언트 : 서버 인증서(공개키 포함) 전송

2. 클라이언트 : 대칭키(Premaster Secret) 생성 → 서버의 공개키로 암호화

3. 클라이언트 → 서버 : 암호화된 대칭키 전송

4. 서버 : 개인키로 복호화해서 Premaster Secret 획득

5. 클라이언트 + 서버 : 서로 교환한 Random 값과 Premaster Secret으로 최종 세션 대칭키 생성

6. 이후 : 모든 데이터는 세션 대칭키로 암호화

 

왜 대칭키 방식과 비대칭키 방식을 혼용해서 사용할까?

키 교환 교환할때는 비대칭키(공개키/개인키)를 사용하고 데이터를 암호화 할때는 대칭키를 이용하는 이유는 비대칭키로 암호화 하여 데이터를 주고받게 되면 연산속도가 느리고 대량의 데이터를 암호화 하기에 비효율적이기 때문에 키 교환에는 비대칭키 암호화를 사용하고, 데이터 암호화에는 대칭키 암호화 방식을 사용한다. 


SSL 인증서 발급, Nginx 서버에 적용

 

1. SSL 인증서 발급

certbot은 Let's Encrypt SSL 인증서를 발급/갱신하는 툴이고, python3-certbot-nginx는 cerbot이 Nginx 설정을 자동으로 인식하고 SSL 설정까지 해주는 플러그인이다.

아래 명령어를 실행시켜 SSL 인증서 발급과 Nginx 자동 설정 도구를 서버에 설치 해줬다.

sudo apt update 
sudo apt install -y certbot python3-certbot-nginx

 

 

2. 도메인의 SSL 인증서를 Nginx에 적용

이제 나의 도메인 "youthjob.site"의 인증서를 발급받고 싶다고 요청을 보내면 Nginx 설정을 수정하여 임의의 경로에 토큰 파일을 올리고, Let's Encrypt 서버가 그 URL에 접근하여 제대로 응답하면 SSL 인증서를 발급해주고 서버에 저장되며, certbot이 자동으로 Nginx 설정에 적용해준다.

sudo certbot --nginx -d youthjob.site -d www.youthjob.site \ 
--email 인증서갱신 알림 받을 이메일 --agree-tos --redirect

 

위 명령어를 실행 후 Nginx 설정파일을 확인해보면 certbot이 발급한 인증서를 Nginx에서 사용하도록 자동으로 적용된 것을 확인할 수 있다.