본문으로 건너뛰기

🔒 HTTPS와 SSL/TLS란?

📖 정의

HTTPS(HyperText Transfer Protocol Secure)는 HTTP에 보안 계층을 추가한 프로토콜입니다. SSL(Secure Sockets Layer)과 TLS(Transport Layer Security)는 인터넷 통신을 암호화하는 프로토콜로, TLS는 SSL의 후속 버전입니다. 이들은 웹사이트와 사용자 간의 데이터를 암호화하여 안전하게 전송합니다.

🎯 비유로 이해하기

일반 우편 vs 등기 우편

  • HTTP: 일반 엽서처럼 누구나 내용을 볼 수 있는 통신
  • HTTPS: 봉인된 등기우편처럼 본인만 열어볼 수 있는 안전한 통신
  • SSL/TLS 인증서: 우편물의 공식 인증 도장

일반 우편(HTTP)으로 비밀번호를 보내면 우체국 직원이나 다른 사람이 볼 수 있지만, 봉인된 등기우편(HTTPS)은 받는 사람만 열어볼 수 있습니다.

⚙️ 작동 원리

1. SSL/TLS 핸드셰이크 과정

1. 클라이언트 → 서버: "안전한 연결을 시작하고 싶어요"
- 지원하는 암호화 방식 목록 전송

2. 서버 → 클라이언트: "여기 제 인증서입니다"
- SSL/TLS 인증서와 공개키 전송

3. 클라이언트: 인증서 검증
- 신뢰할 수 있는 인증기관(CA)이 발급했는지 확인
- 인증서가 유효한지 확인

4. 클라이언트 → 서버: 암호화된 세션 키 생성
- 서버의 공개키로 세션 키를 암호화하여 전송

5. 서버: 세션 키 복호화
- 자신의 개인키로 세션 키를 복호화

6. 안전한 통신 시작
- 세션 키로 모든 데이터를 암호화하여 주고받음

2. 암호화 방식

비대칭 암호화 (핸드셰이크)
├─ 공개키: 데이터 암호화
└─ 개인키: 데이터 복호화

대칭 암호화 (실제 통신)
└─ 세션 키: 빠른 암호화/복호화

💡 실제 예시

HTTP vs HTTPS 비교

// ❌ HTTP - 안전하지 않음
// http://example.com/login
// 비밀번호가 평문으로 전송됨
POST /login
Content-Type: application/json

{
"username": "user123",
"password": "mypassword123" // 누구나 볼 수 있음!
}

// ✅ HTTPS - 안전함
// https://example.com/login
// 모든 데이터가 암호화됨
POST /login
Content-Type: application/json

{
"username": "user123",
"password": "mypassword123" // 암호화되어 전송됨
}

SSL/TLS 인증서 확인하기

브라우저에서 자물쇠 아이콘을 클릭하면:

✅ 안전한 사이트
- 발급 대상: example.com
- 발급자: Let's Encrypt (신뢰할 수 있는 CA)
- 유효 기간: 2024-01-01 ~ 2024-12-31
- 암호화: TLS 1.3

⚠️ 주의 필요
- 인증서가 만료됨
- 자체 서명된 인증서
- 인증서의 도메인과 사이트 도메인이 다름

Node.js에서 HTTPS 서버 만들기

const https = require('https');
const fs = require('fs');

// SSL/TLS 인증서 로드
const options = {
key: fs.readFileSync('private-key.pem'), // 개인키
cert: fs.readFileSync('certificate.pem') // 인증서
};

// HTTPS 서버 생성
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('안전한 HTTPS 연결입니다!');
}).listen(443);

console.log('HTTPS 서버가 포트 443에서 실행 중입니다');

🤔 자주 묻는 질문

Q1. SSL과 TLS의 차이는?

A: SSL은 오래된 프로토콜이고, TLS는 SSL을 개선한 최신 버전입니다. 하지만 관습적으로 "SSL 인증서"라고 부르며 실제로는 TLS를 사용합니다.

SSL 1.0 (사용 안 함)
SSL 2.0 (사용 안 함)
SSL 3.0 (사용 안 함)
TLS 1.0 (레거시)
TLS 1.1 (레거시)
TLS 1.2 (현재 사용) ✅
TLS 1.3 (최신, 가장 안전) ✅

Q2. 왜 모든 사이트가 HTTPS를 사용해야 하나요?

A: HTTPS는 다음을 보호합니다:

1. 기밀성 (Confidentiality)
└─ 제3자가 데이터를 볼 수 없음

2. 무결성 (Integrity)
└─ 데이터가 중간에 변조되지 않았음을 보장

3. 인증 (Authentication)
└─ 접속한 사이트가 진짜임을 증명

4. SEO 이점
└─ 구글은 HTTPS 사이트에 가산점 부여

Q3. Let's Encrypt는 무엇인가요?

A: 무료로 SSL/TLS 인증서를 발급해주는 인증기관(CA)입니다.

# Certbot으로 자동 설치
sudo certbot --nginx -d example.com

# 인증서 자동 갱신 (90일마다)
sudo certbot renew --dry-run

Q4. 혼합 콘텐츠(Mixed Content) 경고는?

A: HTTPS 페이지에서 HTTP 리소스를 로드할 때 발생하는 보안 경고입니다.

<!-- ❌ 혼합 콘텐츠 - 보안 경고 -->
<html>
<head>
<!-- HTTPS 페이지 -->
</head>
<body>
<!-- HTTP 이미지 로드 - 경고 발생! -->
<img src="http://example.com/image.jpg">

<!-- HTTP 스크립트 - 차단됨! -->
<script src="http://example.com/script.js"></script>
</body>
</html>

<!-- ✅ 올바른 방법 -->
<html>
<body>
<!-- HTTPS 사용 -->
<img src="https://example.com/image.jpg">

<!-- 또는 프로토콜 상대 URL -->
<img src="//example.com/image.jpg">
</body>
</html>

Q5. HTTPS가 느리지 않나요?

A: 과거에는 그랬지만, 현대의 TLS 1.3과 하드웨어 가속으로 성능 차이가 거의 없습니다.

TLS 1.2 핸드셰이크: 2-RTT (왕복 시간)
TLS 1.3 핸드셰이크: 1-RTT
TLS 1.3 재연결: 0-RTT (즉시 연결!)

+ HTTP/2는 HTTPS만 지원 → 오히려 더 빠름

🎓 다음 단계

HTTPS를 이해했다면, 다음을 학습해보세요:

  1. CORS란? (문서 작성 예정) - HTTPS와 함께 중요한 웹 보안
  2. JWT 토큰 (문서 작성 예정) - 안전한 인증 방식
  3. DNS란? - 도메인과 보안

실습해보기

# 1. 자체 서명 인증서 만들기 (개발용)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

# 2. HTTPS 서버 실행
node https-server.js

# 3. 브라우저에서 확인
# https://localhost (자체 서명 경고 무시하고 진행)

🎬 마무리

HTTPS와 SSL/TLS는 현대 웹의 필수 보안 기술입니다:

  • HTTPS: HTTP에 보안 계층을 추가한 프로토콜
  • SSL/TLS: 데이터를 암호화하는 보안 프로토콜
  • 인증서: 웹사이트의 신원을 증명하는 디지털 신분증
  • 암호화: 데이터를 안전하게 보호하는 기술

모든 웹사이트는 사용자 보호를 위해 HTTPS를 사용해야 합니다. Let's Encrypt 덕분에 이제 무료로 쉽게 적용할 수 있습니다! 🔒✨