본문으로 건너뛰기

SSL/TLS 개념 완전 정복

웹 서비스를 운영하면서 HTTPS는 이제 선택이 아닌 필수입니다. 검색 엔진 순위, 브라우저 보안 경고, 사용자 신뢰 모두 HTTPS에 달려 있습니다. 이 챕터에서는 SSL/TLS의 동작 원리부터 실제 서버에 적용하는 방법까지 체계적으로 학습합니다.


SSL과 TLS의 차이

**SSL(Secure Sockets Layer)**은 넷스케이프가 1990년대에 개발한 암호화 프로토콜입니다. SSL 3.0까지 개발되었으나 심각한 보안 취약점(POODLE 등)이 발견되어 현재는 사용이 금지되어 있습니다.

**TLS(Transport Layer Security)**는 SSL을 계승한 표준 프로토콜입니다. TLS 1.0, 1.1도 이미 deprecated 되었으며, 현재는 TLS 1.2와 TLS 1.3만 사용해야 합니다.

관행적으로 "SSL 인증서", "SSL 설정"이라고 말하지만, 실제로는 모두 TLS입니다.

버전상태
SSL 2.0, 3.0🚫 사용 금지
TLS 1.0, 1.1🚫 Deprecated (RFC 8996)
TLS 1.2✅ 현재 사용 가능
TLS 1.3✅ 권장 (최신, 가장 빠름)

암호화의 두 가지 방식

대칭키 암호화 (Symmetric Encryption)

같은 키로 암호화하고 복호화합니다. 속도가 빠르지만 키를 안전하게 교환하는 것이 문제입니다.

[Alice] ──(같은 키로 암호화)──▶ 암호문 ──▶ [Bob] ──(같은 키로 복호화)──▶ 평문

대표 알고리즘: AES-128, AES-256, ChaCha20

비대칭키 암호화 (Asymmetric Encryption, 공개키 암호화)

공개키(Public Key)로 암호화하고, 개인키(Private Key)로 복호화합니다. 공개키는 누구에게나 공개해도 됩니다.

[Alice]  공개키로 암호화 ──▶ 암호문 ──▶ [Bob]  개인키로 복호화 ──▶ 평문

대표 알고리즘: RSA-2048, RSA-4096, ECDSA (P-256, P-384)

TLS는 두 가지를 조합합니다:

  1. 비대칭키 암호화로 세션 키(대칭키)를 안전하게 교환
  2. 이후 실제 데이터는 빠른 대칭키 암호화로 전송

TLS 핸드셰이크 흐름

TLS Handshake Flow

TLS 1.2 핸드셰이크 (4번의 왕복)

[클라이언트]                              [서버]
│ │
│── ClientHello ────────────────────▶ │ TLS 버전, 지원 암호 스위트, 랜덤값
│ │
│ ◀──────────────── ServerHello ──────│ 선택된 TLS 버전, 암호 스위트, 랜덤값
│ ◀──────────────── Certificate ──────│ 서버 인증서 (공개키 포함)
│ ◀──────────────── ServerHelloDone ──│
│ │
│── ClientKeyExchange ──────────────▶ │ 대칭키 재료를 서버 공개키로 암호화
│── ChangeCipherSpec ───────────────▶ │ 이제부터 암호화 사용
│── Finished ──────────────────────▶ │
│ │
│ ◀──────────────── ChangeCipherSpec ─│
│ ◀──────────────── Finished ─────────│
│ │
│══════ 암호화된 HTTP 통신 시작 ════════│

TLS 1.3 핸드셰이크 (1번의 왕복)

TLS 1.3은 핸드셰이크를 대폭 단순화해 왕복 횟수를 1회로 줄였습니다.

[클라이언트]                              [서버]
│ │
│── ClientHello + KeyShare ──────────▶ │ TLS 버전, 키 재료 동시 전송
│ │
│ ◀── ServerHello + KeyShare ─────────│
│ ◀── {Certificate} ──────────────────│ (이미 암호화된 채로 전송)
│ ◀── {Finished} ─────────────────────│
│ │
│── {Finished} ──────────────────────▶ │
│ │
│════ 암호화된 HTTP 통신 시작 ══════════│

TLS 1.3은 레거시 기능을 제거하고 Forward Secrecy를 기본으로 적용합니다.


인증서 체계: 신뢰 사슬 (Chain of Trust)

인증서는 계층적인 신뢰 구조를 형성합니다.

[Root CA]  ← 운영체제/브라우저에 내장된 최상위 인증기관
│ 서명

[Intermediate CA] ← 중간 인증기관
│ 서명

[서버 인증서] ← 도메인 소유자가 발급받는 인증서
공개키, 도메인, 유효기간, CA 서명

브라우저는 서버 인증서의 서명을 중간 CA로, 중간 CA의 서명을 Root CA로 검증합니다. 운영체제에 내장된 Root CA를 신뢰하므로 전체 체인이 신뢰됩니다.

인증서 체인 구성:

# 올바른 인증서 체인 구성
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 서버 인증서 + 중간 CA 포함
ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 개인키

암호 스위트(Cipher Suite)

TLS 핸드셰이크에서 협상하는 암호화 알고리즘 조합입니다.

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
│ │ │ │ │
│ │ │ │ └── MAC 알고리즘 (HMAC-SHA384)
│ │ │ └─────────────── 대칭 암호화 (AES-256-GCM)
│ │ └─────────────────────── 인증 (RSA)
│ └─────────────────────────────── 키 교환 (ECDHE)
└──────────────────────────────────── 프로토콜

TLS 1.3 암호 스위트 (간소화됨):

  • TLS_AES_256_GCM_SHA384 (권장)
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256

Forward Secrecy (전방향 비밀성)

일반 RSA 키 교환에서는 서버의 개인키가 유출되면 과거에 녹화한 트래픽도 복호화할 수 있습니다.

ECDHE(Ephemeral Diffie-Hellman) 키 교환 방식은 매 세션마다 임시 키를 생성하고, 세션 종료 후 즉시 파기합니다. 개인키가 유출되어도 과거 트래픽은 안전합니다.

# Forward Secrecy를 제공하는 암호 스위트만 허용
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...';

TLS 1.3은 모든 키 교환에 Forward Secrecy가 기본 적용됩니다.


챕터 학습 순서

  1. 인증서 종류와 발급 — DV/OV/EV, Let's Encrypt Certbot
  2. Nginx SSL 설정 — ssl_certificate, ssl_protocols, HTTP→HTTPS 리다이렉트
  3. Apache SSL 설정 — mod_ssl, SSLEngine, VirtualHost
  4. HTTPS 오프로딩 — 로드밸런서에서 TLS 종료
  5. 보안 강화 헤더 — HSTS, OCSP Stapling, CSP
  6. TLS 고급 설정 — TLS 1.3, 취약 암호 비활성화
  7. 실전 고수 팁 — SSL Labs A+ 달성, 만료 모니터링