SSL/TLS 설정은 크게 변화했습니다. 이 글은 2026년 기준 모범 사례의 현재 상태를 정리합니다 — 무엇을 활성화하고, 무엇을 비활성화하며, 앞으로 무엇이 달라지는지 알아보세요.
프로토콜 버전
| 프로토콜 | 상태 | 조치 |
|---|---|---|
| SSL 2.0, 3.0 | 취약 | 비활성화 — 심각한 취약점 (POODLE, DROWN) |
| TLS 1.0 | 지원 중단 (2021) | 비활성화 — BEAST 취약점 |
| TLS 1.1 | 지원 중단 (2021) | 비활성화 — 최신 암호화 스위트 미지원 |
| TLS 1.2 | 안전 | 활성화 — AEAD 암호화만 사용 |
| TLS 1.3 | 현재 표준 | 활성화 — 가장 빠르고 안전 |
Nginx: ssl_protocols TLSv1.2 TLSv1.3;
Apache: SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
암호화 스위트
TLS 1.3 (설정 불필요)
5개의 암호화 스위트 모두 안전합니다. 커스터마이징하지 마세요 — 더 좋게 만들 수 없습니다.
TLS 1.2 (AEAD만 허용)
# Nginx
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;
규칙:
ECDHE-*스위트만 사용 — 순방향 비밀성 보장*-GCM-*또는*-CHACHA20-*만 사용 — AEAD 암호화만 허용- CBC 암호화 제외 — BEAST, Lucky13 취약점
ssl_prefer_server_ciphers off— 클라이언트가 선택하도록 허용 (최신 클라이언트가 최적의 옵션을 선택)
인증서 관리
| 사례 | 이유 |
|---|---|
| ECDSA P-256 키 사용 | RSA 2048보다 작고 빠름 |
| 갱신 자동화 | 2029년까지 47일 유효 기간으로 수동 갱신 비현실적 |
fullchain.pem 제공 | 인증서 체인 오류 방지 |
| 인증서 만료 모니터링 | 90일 중 60일에 알림 설정 |
| 인증서 투명성 모니터링 사용 | 무단 인증서 감지 |
| 갱신 시 키 교체 | 인증서 간에 개인키를 재사용하지 않기 |
보안 헤더
# HSTS — 항상 HTTPS 사용 (짧은 max-age로 시작, 이후 증가)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
# MIME 타입 스니핑 방지
add_header X-Content-Type-Options "nosniff" always;
# 클릭재킹 방지
add_header X-Frame-Options "SAMEORIGIN" always;
# 안전하지 않은 하위 리소스 업그레이드
add_header Content-Security-Policy "upgrade-insecure-requests" always;
성능 최적화
| 설정 | 구성 | 효과 |
|---|---|---|
| HTTP/2 | listen 443 ssl http2; | 멀티플렉싱, 헤더 압축 |
| 세션 캐싱 | ssl_session_cache shared:SSL:10m; | 재방문자의 재핸드셰이크 방지 |
| 세션 티켓 비활성화 | ssl_session_tickets off; | 더 나은 순방향 비밀성 |
| OCSP 스테이플링 | ssl_stapling on; | 더 빠른 인증서 검증, 더 나은 프라이버시 |
| 조기 데이터 (0-RTT) | TLS 1.3 기본값 | 제로 레이턴시 재개 (주의해서 사용) |
완전한 Nginx 설정 (프로덕션용)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
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;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
root /var/www/html;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
테스트: SSL Labs에 도메인을 입력하세요 — 이 설정이면 A+ 등급을 받을 수 있습니다.
하지 말아야 할 것
| 잘못된 사례 | 이유 | 대신 해야 할 것 |
|---|---|---|
ssl_protocols TLSv1 TLSv1.1; | 지원 중단, 취약 | TLS 1.2 + 1.3만 사용 |
ssl_ciphers ALL; | 약한 암호화 포함 | 명시적 ECDHE + AEAD 목록 |
ssl_prefer_server_ciphers on; (TLS 1.3) | 불필요 — TLS 1.3 암호화는 모두 안전 | off |
cert.pem 대신 fullchain.pem 미사용 | 체인 누락 → 신뢰 오류 | Nginx에서는 항상 fullchain.pem |
| 프로덕션에서 자체 서명 인증서 사용 | 브라우저 경고, 신뢰 없음 | Let’s Encrypt (무료) |
| 동일한 개인키를 수년간 사용 | 피해 범위 제한 불가 | 갱신 시마다 교체 |
| HSTS 미사용 | 다운그레이드 공격에 취약 | 테스트 후 활성화 |
HSTS에 max-age=0 | 사실상 HSTS 비활성화 | 300에서 시작하여 63072000으로 증가 |
자주 묻는 질문
SSL 설정을 어떻게 테스트하나요?
SSL Labs Server Test — 도메인을 입력하면 A-F 등급이 포함된 상세 보고서를 받을 수 있습니다. 프로토콜 지원, 암호화 강도, 체인 유효성, 알려진 취약점을 확인하세요.
어떤 등급을 목표로 해야 하나요?
프로덕션 사이트는 A+. 이를 위해 필요한 것: TLS 1.2+ 전용, AEAD 암호화, 유효한 체인, 긴 max-age의 HSTS. 위의 설정으로 A+를 달성할 수 있습니다.
SSL 설정을 얼마나 자주 검토해야 하나요?
매년, 또는 새로운 취약점이 발표될 때. Let’s Encrypt 상태 페이지를 구독하고 Mozilla SSL 설정 생성기에서 최신 권장 사항을 확인하세요.
올바른 설정을 자동 생성하는 도구가 있나요?
네 — Mozilla SSL 설정 생성기. 서버(Nginx, Apache 등)와 서버 버전을 선택하면 권장 설정을 생성합니다. “Modern” 프로필이 이 글의 사례와 일치합니다.