SSL과 TLS는 모두 인터넷에서 데이터를 암호화해서 안전하게 전송하기 위한 보안 프로토콜
쉽게 말하면, 웹사이트와 사용자의 통신을  도청이나 위조 없이 안전하게 지켜주는 기술
🧩 1. SSL (Secure Sockets Layer)
- 초기 버전의 보안 프로토콜
- 1990년대 중반 Netscape에서 개발
- 주 목적: 클라이언트(브라우저)와 서버(웹사이트) 사이의 데이터 암호화
- 하지만 보안 취약점이 발견되면서 현재는 더 이상 사용되지 않음
📌 버전
| 버전 | 상태 | 
| SSL 1.0 | 내부 테스트, 공개 안 됨 | 
| SSL 2.0 | 1995년 출시 → 취약점으로 폐기 | 
| SSL 3.0 | 1996년 출시 → POODLE 공격으로 폐기 | 
🔐 2. TLS (Transport Layer Security)
- SSL의 업그레이드 버전이에요.
- 1999년 IETF(인터넷 표준화 기구)가 SSL을 개선해 만든 표준이다.
- 현재 HTTPS에서 사용하는 암호화는 모두 TLS 기반
📌 TLS 버전
| 버전 | 특징 | 
| TLS 1.0 | SSL 3.0 기반, 보안 강화 | 
| TLS 1.1 | 약한 암호 알고리즘 제거 | 
| TLS 1.2 | 가장 널리 사용 (현재 대부분 이 버전) | 
| TLS 1.3 | 최신 버전 (2018년), 속도 향상 + 강력한 보안 | 
⚙️ 3. 작동 원리 (핸드셰이크 과정)
- 클라이언트 → 서버: “보안 연결하고 싶어요” (지원하는 암호 알고리즘 목록 전송)
- 서버 → 클라이언트: “좋아요, 이 암호 방식으로 합시다” (서버 인증서와 공개키 전송)
- 클라이언트: 서버 인증서 확인 → 세션 키 생성 → 암호화해서 서버에 전송
- 서버: 세션 키 복호화
- 이후 통신은 대칭키 암호화로 빠르고 안전하게 진행
🌐 4. HTTPS와의 관계
- HTTP + TLS = HTTPS
 → 웹사이트 주소가 https://로 시작하면 TLS로 보호되고 있다는 뜻이다.
 → 🔒 자물쇠 아이콘이 브라우저 주소창에 표시되죠.
✅ 5. 요약 비교
| 구분 | SSL | TLS | 
| 시대 | 1990년대 | 1999년 이후 | 
| 개발자 | Netscape | IETF | 
| 보안 수준 | 낮음 | 높음 | 
| 사용 여부 | 사용 안 함 | 현재 표준 | 
| HTTPS 사용 | ❌ | ✅ | 
🧩 1️⃣ TLS 1.2 vs TLS 1.3 차이점
| 구분 | TLS 1.2 | TLS 1.3 | 
| 출시년도 | 2008 | 2018 | 
| 핸드셰이크 단계 | 6단계 이상 (복잡, 느림) | 3단계로 단축 (빠름) | 
| 암호 알고리즘 | RSA, DH, ECDHE 등 다양 | ECDHE만 허용 (보안 강화) | 
| 암호 스위트 구성 | 키 교환 + 인증 + 암호화 + MAC 조합 | 단순화 (AEAD 암호화만 지원) | 
| 세션 재사용 | Session ID / Ticket 사용 | 0-RTT 핸드셰이크로 즉시 복원 가능 | 
| 보안성 | 중간자 공격(MITM) 방어 미흡 | 강력한 암호화와 Forward Secrecy 필수 | 
| 속도 | 상대적으로 느림 | 약 30~40% 빠름 | 
📌 핵심 요약
- TLS 1.3은 보안 강화 + 속도 향상을 동시에 달성한 버전이다.
- 낡은 암호 알고리즘(예: RSA, SHA-1)은 모두 제거됨.
- 핸드셰이크가 간소화되어 HTTPS 연결이 훨씬 빠름.
- Forward Secrecy(키가 유출되어도 과거 통신은 복호화 불가능)가 기본 적용됨.
⚙️ 2️⃣ Spring / 웹 서버에서 TLS 적용 방법
🧱 (1) SSL 인증서 준비
먼저, TLS는 SSL 인증서를 기반으로 동작한다.
인증서를 얻는 방법은 두 가지이다.
- 공인 인증서 (CA 발급)
- 예: Let’s Encrypt (무료), Digicert, Sectigo 등
- 실제 서비스용으로 권장 ✅
 
- 자체 서명 인증서 (Self-signed)
- 테스트용으로 가능 (브라우저에서 “안전하지 않음” 경고 뜸)
 
🧩 (2) Spring Boot 설정 예시
# application.yml
server:
  port: 8443
  ssl:
    enabled: true
    key-store: classpath:keystore/mykeystore.p12
    key-store-password: yourpassword
    key-store-type: PKCS12📘 참고:
- mykeystore.p12는 인증서 파일.
- .p12 또는 .jks 형식 가능.
🔑 (3) Keystore 생성 명령어 (JDK 기본 keytool 이용)
keytool -genkeypair \
  -alias myalias \
  -keyalg RSA \
  -keysize 2048 \
  -storetype PKCS12 \
  -keystore mykeystore.p12 \
  -validity 3650
→ Spring Boot에서 해당 경로를 지정하면 HTTPS가 활성화돼요.
🌐 (4) Nginx / Apache 연동 (Spring을 리버스 프록시로 운영할 때)
✅ Nginx 예시
server {
    listen 443 ssl;
    server_name yourdomain.com;
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    location / {
        proxy_pass http://localhost:8080;
    }
}
🔒 (5) 적용 후 HTTPS 테스트
브라우저에서
👉 https://localhost:8443
또는
👉 https://yourdomain.com
으로 접속하면 🔒 자물쇠 아이콘이 나타나면 성공!
✅ 정리 요약
| 항목 | 설명 | 
| 최신 표준 | TLS 1.3 | 
| 주요 개선점 | 속도 향상, 보안 강화, 단순화 | 
| Spring 적용 | application.yml에서 SSL 설정 | 
| 테스트용 인증서 | keytool 명령으로 생성 가능 | 
| 운영환경 | Let’s Encrypt 등 공인 CA 인증서 권장 | 
| 웹서버 연동 | Nginx/Apache로 리버스 프록시 구성 가능 |