전체 목록
네트워크Easy#22

HTTP와 HTTPS의 차이점은 무엇인가요?

#네트워크#HTTP#HTTPS#보안
힌트

암호화, 포트, 인증서를 키워드로 생각해보세요.

정답 및 해설

HTTP와 HTTPS의 차이점은 무엇인가요?

HTTP(HyperText Transfer Protocol)와 HTTPS(HTTP Secure)는 웹에서 데이터를 주고받는 프로토콜입니다. 가장 큰 차이는 보안으로, HTTPS는 HTTP에 TLS/SSL 암호화 계층을 추가하여 통신의 기밀성, 무결성, 인증을 보장합니다.

HTTP란?

HTTP는 1991년에 만들어진 웹의 근간 프로토콜입니다. 클라이언트(브라우저)와 서버 사이에 요청(Request)과 응답(Response) 형태로 데이터를 주고받습니다.

클라이언트 → 서버: GET /index.html HTTP/1.1
서버 → 클라이언트: 200 OK, <html>...</html>

HTTP의 문제점

HTTP는 데이터를 평문(plain text) 으로 전송합니다. 즉, 중간 경로의 누구든 패킷을 가로채면 내용을 그대로 읽을 수 있습니다.

-- HTTP 패킷 (패킷 스니핑으로 볼 수 있는 내용) --
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

username=admin&password=1234secret  ← 그대로 노출!

이런 공격을 중간자 공격(Man-in-the-Middle Attack, MITM) 이라 합니다. 공격자가 클라이언트와 서버 사이에서 트래픽을 도청하거나 변조할 수 있습니다.

HTTPS란?

HTTPS는 HTTP 통신 위에 TLS(Transport Layer Security) 계층을 추가한 것입니다. (TLS의 이전 버전이 SSL이며, 현재는 TLS 1.2/1.3이 표준입니다.)

HTTPS가 보장하는 세 가지

  1. 기밀성(Confidentiality): 데이터를 암호화하여 도청을 방지
  2. 무결성(Integrity): 데이터가 전송 중 변조되지 않았음을 보장 (MAC 사용)
  3. 인증(Authentication): 서버가 실제로 해당 도메인의 소유자임을 인증서로 검증

TLS 핸드셰이크 과정

HTTPS 연결이 수립되는 과정을 이해하면 보안 원리를 파악할 수 있습니다.

1. Client Hello
   클라이언트 → 서버: 지원하는 TLS 버전, 암호화 방식(cipher suites), 랜덤값 전송

2. Server Hello + Certificate
   서버 → 클라이언트: 선택한 암호화 방식, 랜덤값, SSL/TLS 인증서 전송

3. 인증서 검증
   클라이언트: 인증서가 신뢰할 수 있는 CA(Certificate Authority)의 것인지 확인
              도메인 이름이 일치하는지 확인
              인증서 유효기간 확인

4. 키 교환 (Key Exchange)
   클라이언트 → 서버: 대칭키 생성을 위한 정보 전송 (서버의 공개키로 암호화)

5. 세션 키 생성
   양측: 교환한 정보로 동일한 세션 키(대칭키) 생성

6. Finished
   이후 모든 통신은 세션 키로 대칭 암호화

디지털 인증서와 CA

HTTPS의 인증 체계는 PKI(Public Key Infrastructure) 를 기반으로 합니다.

Root CA (최상위 인증 기관)
 └─ Intermediate CA (중간 인증 기관)
     └─ End-Entity Certificate (서버 인증서)
          - 발급 대상 도메인
          - 공개키
          - 유효기간
          - 발급자(CA) 서명

브라우저는 신뢰할 수 있는 Root CA 목록을 내장하고 있습니다. 서버가 제시한 인증서의 서명 체인을 Root CA까지 검증합니다. 이 과정이 성공하면 브라우저 주소창에 자물쇠 아이콘이 표시됩니다.

인증서 종류

종류검증 수준발급 기간주요 용도
DV (Domain Validation)도메인 소유 확인수 분일반 웹사이트, 블로그
OV (Organization Validation)도메인 + 기업 정보 확인수 일기업 웹사이트
EV (Extended Validation)엄격한 기업 심사수 주금융, 전자상거래

HTTP vs HTTPS 비교

항목HTTPHTTPS
포트80443
암호화없음 (평문)TLS/SSL 암호화
데이터 기밀성보장 안 됨보장
데이터 무결성보장 안 됨보장
서버 인증없음인증서로 검증
성능빠름핸드셰이크 오버헤드 있음 (미미)
SEO불리유리 (Google 랭킹 요소)
브라우저 표시"주의 요함" 경고자물쇠 아이콘

실제 코드에서의 HTTPS 관련 설정

Next.js에서 HTTP → HTTPS 리다이렉트

// next.config.js
module.exports = {
  async redirects() {
    return [
      {
        source: '/:path*',
        has: [{ type: 'header', key: 'x-forwarded-proto', value: 'http' }],
        destination: 'https://yoursite.com/:path*',
        permanent: true,
      },
    ];
  },
};

HSTS (HTTP Strict Transport Security)

HSTS는 브라우저에게 "이 사이트는 항상 HTTPS로 연결하라"고 알려주는 헤더입니다.

// Next.js headers 설정
module.exports = {
  async headers() {
    return [
      {
        source: '/(.*)',
        headers: [
          {
            key: 'Strict-Transport-Security',
            value: 'max-age=31536000; includeSubDomains; preload',
          },
        ],
      },
    ];
  },
};

fetch에서 HTTPS와 인증서 관련

// Node.js에서 자체 서명 인증서(개발 환경)를 허용할 때
// (프로덕션에서는 절대 사용 금지)
const https = require('https');
const agent = new https.Agent({ rejectUnauthorized: false });

fetch('https://localhost:3000/api', { agent });

현대 웹에서 HTTPS의 중요성

HTTPS가 필수인 기능들:
- Service Workers (PWA)
- Geolocation API
- Camera/Microphone API
- Web Crypto API
- HTTP/2 (실질적으로 HTTPS 필요)
- 쿠키 Secure 플래그

2024년 기준으로 Chrome은 HTTP 사이트에 "주의 요함(Not Secure)" 경고를 표시하며, Google은 HTTPS 사이트를 SEO에서 우대합니다. Let's Encrypt 등의 무료 인증서 서비스 덕분에 HTTPS 도입의 비용 장벽도 사라졌습니다.

정리

HTTP는 데이터를 암호화 없이 전송하여 도청, 변조, 위장 공격에 취약합니다. HTTPS는 TLS 암호화를 통해 기밀성, 무결성, 인증을 모두 보장합니다. 포트는 HTTP가 80, HTTPS가 443을 사용합니다. 현대 웹에서는 모든 사이트에 HTTPS 적용이 표준이며, SEO 혜택과 브라우저 기능 접근에도 필수입니다.