TLS 암호화 스위트 해부 — 키 교환부터 MAC까지
TLS 암호 스위트 이름 구조, ECDHE/DHE/RSA 키 교환, AES-GCM/ChaCha20 대칭키, SHA 해시의 역할, 권장·비권장 스위트 목록을 완전 정리합니다.
지난 글에서 TLS 1.2와 1.3의 차이를 비교했습니다. 이번 글에서는 TLS 통신에서 어떤 알고리즘이 어떤 역할을 하는지, 암호 스위트(Cipher Suite)를 분해해서 살펴봅니다.
암호 스위트란?
TLS 연결 한 개를 안전하게 만들기 위해 여러 종류의 암호 알고리즘이 협력합니다. 이를 하나의 이름으로 묶어 표현한 것이 암호 스위트입니다.
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
│ │ │ │ │ │
│ │ │ │ │ └─ 해시 (PRF/MAC)
│ │ │ │ └─────── 모드
│ │ │ └──────────── 대칭키 암호 + 키 크기
│ │ └───────────────────── 인증 방식
│ └──────────────────────────── 키 교환 방식
└────────────────────────────────── 프로토콜
구성 요소별 상세 설명
1. 키 교환 (Key Exchange)
클라이언트와 서버가 공통 비밀(shared secret)을 안전하게 만드는 과정입니다.
ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) — 권장
타원곡선 DH + 임시(Ephemeral) 키
- 세션마다 새 키 쌍 생성
- 세션 종료 후 키 폐기
- 결과: Forward Secrecy 보장
지원 그룹 (TLS 1.3):
X25519 ← 최고 권장 (빠름, 안전)
P-256 ← 널리 지원됨
P-384 ← 높은 보안 레벨
DHE (Diffie-Hellman Ephemeral) — 사용 가능
ECDHE보다 느리지만 Forward Secrecy 보장. TLS 1.2에서 RSA 대신 사용.
RSA 키 교환 — TLS 1.3에서 제거
# RSA 키 교환 (비권장, TLS 1.2)
클라이언트: pre_master_secret 생성
→ 서버 공개키로 암호화
→ 전송
서버: 개인키로 복호화
→ pre_master_secret 획득
문제: 서버 개인키 유출 시 과거 트래픽 전체 복호화 가능!
2. 인증 (Authentication)
서버(또는 클라이언트) 신원을 검증합니다.
| 방식 | 설명 | TLS 1.3 |
|---|---|---|
| RSA | RSA 인증서 서명 검증 | ✓ (키 교환과 분리) |
| ECDSA | 타원곡선 서명, RSA보다 빠름 | ✓ 권장 |
| Ed25519 | EdDSA, 최신 곡선 | ✓ 권장 |
3. 대칭키 암호화 (Bulk Encryption)
핸드셰이크 후 실제 데이터를 암호화합니다.
AES-256-GCM — 최고 권장
# AES-GCM 특징 (의사코드)
ciphertext, auth_tag = AES_GCM.encrypt(
key=session_key, # 256비트
nonce=write_iv, # 12바이트, 매번 증가
plaintext=data,
aad=record_header # 추가 인증 데이터
)
# auth_tag: 복호화 시 무결성 검증
# AEAD: 암호화 + 인증 동시 처리
ChaCha20-Poly1305 — AES 하드웨어 없는 환경 권장
ChaCha20: 스트림 암호 (AES보다 SW 구현 빠름)
Poly1305: MAC (무결성 보장)
사용 환경: 모바일, IoT (AES-NI 없는 장치)
AES-128-GCM vs AES-256-GCM
보안 강도 차이는 실제로 무시할 만하지만, 256이 표준 권고입니다. 128은 128비트 보안 레벨, 256은 256비트 보안 레벨로 양자 컴퓨터 위협 대비 256 권장.
4. 해시 / PRF (Pseudo-Random Function)
TLS 1.2에서는 키 파생 함수(PRF)와 MAC에 같은 해시를 씁니다. TLS 1.3에서는 HKDF의 해시 알고리즘으로 사용됩니다.
SHA-256: 256비트 출력, TLS_AES_128_GCM_SHA256에 사용
SHA-384: 384비트 출력, TLS_AES_256_GCM_SHA384에 사용
SHA-1: 완전 폐기 (충돌 공격 가능)
MD5: 완전 폐기 (충돌 공격 가능)
권장 vs 비권장 암호 스위트
# Nginx 암호 스위트 설정 (TLS 1.2 + 1.3)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off; # TLS 1.3에서는 off 권장
# 서버 지원 스위트 확인
openssl ciphers -v 'ECDHE+AESGCM:ECDHE+CHACHA20' | head -10
TLS 1.3 암호 스위트의 특징
TLS 1.3에서는 암호 스위트 이름 구조가 단순해졌습니다.
TLS 1.2: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
(키 교환 + 인증 + 대칭키 + 해시 모두 포함)
TLS 1.3: TLS_AES_256_GCM_SHA384
(대칭키 + 해시만 — 키 교환은 지원 그룹에서 별도 협상)
이유: TLS 1.3은 키 교환을 항상 ECDHE/DHE로 강제하므로
암호 스위트 이름에서 분리
TLS 1.3의 세 가지 필수 암호 스위트:
TLS_AES_128_GCM_SHA256 (필수 구현)
TLS_AES_256_GCM_SHA384 (권장)
TLS_CHACHA20_POLY1305_SHA256 (권장)
암호 스위트 강도 평가
# SSL Labs 등급 결정에 영향을 주는 요소
# 서버 스캔
sslyze --regular example.com
# 또는
testssl.sh --cipher-per-proto example.com
# 취약 스위트가 활성화된 서버 탐지
nmap --script ssl-enum-ciphers -p 443 192.168.1.1
마치며
암호 스위트는 TLS 보안의 핵심 구성 요소입니다. ECDHE로 키 교환하고, RSA/ECDSA로 인증하고, AES-GCM 또는 ChaCha20-Poly1305로 데이터를 암호화하는 조합이 현재의 표준입니다. 다음 글에서는 반복 연결의 성능을 높이는 TLS 세션 재개(Session Resumption) 메커니즘을 살펴봅니다.
지난 글: TLS 1.2 vs TLS 1.3 — 무엇이 달라졌는가?
다음 글: TLS 세션 재개 — Session ID, Session Ticket, PSK
읽어주셔서 감사합니다. 😊