junyeokk
Blog
Network·2025. 06. 19

TLS를 이용한 TCP 보안

TLS (Transport Layer Security)

TCP는 데이터를 신뢰성 있게 전달하지만, 보안은 제공하지 않는다. 패킷이 평문으로 전송되어 도청당할 수 있고, 중간에서 변조될 수도 있다. TLS는 TCP 위에서 동작하며 기밀성, 무결성, 인증을 제공한다.

SSL과 TLS의 관계

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.39.03.png

SSL(Secure Sockets Layer)은 Netscape가 1990년대에 개발한 프로토콜이다. SSL 3.0을 기반으로 IETF가 표준화한 것이 TLS다.

  • SSL 3.0 → TLS 1.0 (1999)
  • TLS 1.1 (2006)
  • TLS 1.2 (2008)
  • TLS 1.3 (2018)

SSL 3.0과 TLS 1.0/1.1은 보안 취약점이 발견되어 현재는 사용하지 않는다. TLS 1.2가 널리 사용되고, TLS 1.3이 점차 확산 중이다.

TLS의 위치

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.39.10.png

TLS는 애플리케이션 계층과 전송 계층 사이에 위치한다.

text
HTTP/SMTP/FTP (애플리케이션)

    TLS

    TCP (전송)

    IP (네트워크)

HTTPS는 HTTP + TLS다. 포트 443을 사용하고, HTTP 트래픽을 TLS로 암호화해서 전송한다.

TLS가 제공하는 것

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.39.17.png
  1. 기밀성(Confidentiality): 대칭키 암호로 데이터를 암호화. 도청자가 패킷을 캡처해도 내용을 읽을 수 없다.

  2. 무결성(Integrity): MAC(Message Authentication Code)으로 데이터 변조를 탐지. 중간에서 패킷을 수정하면 수신자가 알아챌 수 있다.

  3. 인증(Authentication): 인증서로 서버의 신원을 검증. 클라이언트가 진짜 서버에 연결되었는지 확인할 수 있다.

TLS Handshake 개요

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.39.25.png

TLS 연결을 수립하려면 먼저 Handshake를 거친다. 이 과정에서:

  • 사용할 암호화 알고리즘을 협상
  • 서버 인증서를 검증
  • 세션 키를 교환

Handshake가 완료되면 양쪽이 같은 세션 키를 가지게 되고, 이후 데이터는 이 키로 암호화된다.

TLS 1.2 Handshake

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.39.38.png

TLS 1.2 Handshake는 2-RTT가 필요하다:

  1. Client Hello: 클라이언트가 지원하는 TLS 버전, cipher suite 목록, 랜덤 값을 전송
  2. Server Hello: 서버가 선택한 cipher suite, 랜덤 값, 인증서를 전송
  3. Key Exchange: 클라이언트가 pre-master secret을 서버 공개키로 암호화해서 전송
  4. Finished: 양쪽이 세션 키를 계산하고 Handshake 완료

이후 양쪽은 pre-master secret + 양쪽 랜덤 값으로 master secret을 계산하고, 여기서 암호화 키와 MAC 키를 도출한다.

Cipher Suite

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.39.48.png

Cipher suite는 TLS에서 사용할 알고리즘 조합이다.

text
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

이 cipher suite는:

  • ECDHE: 키 교환 알고리즘 (Elliptic Curve Diffie-Hellman Ephemeral)
  • RSA: 인증에 사용할 알고리즘
  • AES_256_GCM: 대칭키 암호화 (256비트 AES, GCM 모드)
  • SHA384: MAC 알고리즘

클라이언트가 여러 cipher suite를 제안하면 서버가 하나를 선택한다.

인증서 검증

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.39.58.png

서버가 보낸 인증서를 클라이언트가 검증하는 과정:

  1. 인증서의 도메인이 접속하려는 도메인과 일치하는지 확인
  2. 인증서가 만료되지 않았는지 확인
  3. 인증서 체인을 따라가며 신뢰할 수 있는 CA까지 검증
  4. 각 인증서의 서명이 유효한지 확인

브라우저/OS에는 신뢰할 수 있는 Root CA 목록이 내장되어 있다.

TLS Record Protocol

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.40.07.png

Handshake 이후 실제 데이터는 TLS Record Protocol로 전송된다:

  1. 애플리케이션 데이터를 단편화(fragmentation) (최대 16KB)
  2. 각 단편에 MAC을 계산해서 붙임
  3. MAC이 붙은 데이터를 암호화
  4. TLS 레코드 헤더를 붙여서 TCP로 전송

수신측은 역순으로 복호화 → MAC 검증 → 재조립을 수행한다.

Forward Secrecy

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.40.16.png

RSA 키 교환의 문제점: 서버의 개인키가 유출되면 과거에 캡처해둔 트래픽도 복호화할 수 있다.

Forward Secrecy는 이 문제를 해결한다. DHE/ECDHE 키 교환을 사용하면:

  • 매 세션마다 새로운 임시(ephemeral) 키 쌍을 생성
  • 세션 키는 Diffie-Hellman으로 교환
  • 세션이 끝나면 임시 키는 폐기

서버의 장기 개인키가 유출되어도 과거 세션을 복호화할 수 없다.

TLS 1.3의 개선점

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.40.24.png

TLS 1.3은 보안과 성능을 모두 개선했다:

보안 강화:

  • RSA 키 교환 제거 (Forward Secrecy 강제)
  • 취약한 cipher suite 제거 (3DES, RC4, MD5 등)
  • Handshake 메시지 암호화

성능 개선:

  • 1-RTT Handshake (기존 2-RTT)
  • 0-RTT Resumption (재연결 시 즉시 데이터 전송)

TLS 1.3 Handshake

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.40.32.png

TLS 1.3은 Client Hello에 키 교환 정보를 미리 포함한다:

  1. Client Hello: 지원하는 cipher suite + key_share (클라이언트의 ECDHE 공개값)
  2. Server Hello: 선택한 cipher suite + key_share + 인증서 + Finished

서버의 첫 응답에 필요한 모든 정보가 포함되어 1-RTT로 Handshake가 완료된다.

TLS vs IPsec

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-09_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.40.40.png
비교TLSIPsec
계층L4-L5 (전송/세션)L3 (네트워크)
보호 범위특정 연결모든 IP 트래픽
설정애플리케이션별OS/네트워크 수준
용도웹, 이메일 등VPN

TLS는 애플리케이션 개발자가 선택해서 적용한다. IPsec은 네트워크 관리자가 설정하며, 애플리케이션 수정 없이 모든 트래픽을 보호한다.