[ODOP:17]Handshake TLS 1.3

TLS 1.3 버전의 Handshake 를 설명 합니다

스크린샷 2024-08-14 오후 4.39.40.png

TLS 1.2 와 다르게 TLS 1.3 은 총 1회의 왕복으로 Handshake 가 완료 된다

Handshake 흐름

Client Hello (Client -> Server)

다음의 정보를 포함 하여 서버로 접근 요청을 보낸다

스크린샷 2024-08-14 오후 4.40.03.png
    • TLS 1.3 에서는 안전하지 않은 암호 모음에 대한 지원이 제거 되었다.
      사용 가능한 암호 모음 수가 크게 줄었으므로 클라이언트는 서버가 선호하는 키 교환 방법을 알고 있을 가능성이 높다

암호 모음 목록

스크린샷 2024-08-14 오후 4.40.56.png

클라이언트 무작위

스크린샷 2024-08-14 오후 4.40.34.png

프로토콜 버전

스크린샷 2024-08-14 오후 4.40.17.png

Server Hello (Server -> Client)

💡 이 시점에서 서버는 아래의 데이터를 소지하고 있다

  • 클라이언트 무작위
  • 클라이언트의 매개변수(Premaster secret 을 생성하기 위한 매개변수)
  • 암호 모음(Cipher suite)
  • 서버 무작위(서버 자체 생성)

위 데이터들을 이용하여 서버는 마스터 암호를 생성 할 수 있게 된다

위 계산을 모두 끝내고 서버는 클라이언트에게 데이터를 보낸다

  • 서버의 인증서
  • 디지털 서명
  • 서버 무작위
  • 암호 모음 목록(Cipher suite)

Finished (Client -> Server)

클라이언트가 서명 및 인증서를 확인하고 마스터 암호를 생성 한 후 서버에게 완료 메시지를 전송한다
이로서 TLS 핸드셰이크가 종료 된다

0-RTT (Zero Round-Trip Time Resumption)

💡 해당 기능은 보안적 허점을 가지고 있는 기술이다 서버 에서는 Replay Attack 에 대한 대비를 해야 하므로 제한적으로 사용 된다

TLS 1.3 은 클라이언트-서버 간의 왕복 통신이 전혀 필요 없는 더욱 빠른 버전의 TLS 핸드 셰이크를 지원한다

클라이언트와 서버가 이전에 서로 연결된 적이 있는 경우(이전에 사용자가 웹 사이트를 방문한 적이 있는 경우) 사용 가능한 전략 이다.

0-RTT 연결 과정

  1. 초기 핸드셰이크
    • TLS 1.3 의 일반적인 핸드셰이크 과정을 통해 TLS 통신이 활성화 된다
    • 이 때 서버는 클라이언트에게 PSK(Pre-Shared key) 또는 세션 티켓을 제공한다
      • PSK 는 이후 재 연결 시 사용 할 수 있는 사전 공유 키를 의미한다
      • 세션 티켓은 이전 세션의 암호화 상태를 나타내는 정보 이다
  2. 세션 재개
    • 이전 연결에서 받은 PSK or 세션 티켓을 활용하여 서버와의 재연결을 시도 할 수 있다
    • 클라이언트는 Client Hello 메시지에 PSK 와 함께 0-RTT 데이터를 포함하여 전송 한다
      • 이 데이터는 이미 암호화 된 상태로 전송 됨
  3. 서버 처리
    • 서버는 클라이언트가 제공한 PSK 를 확인하고, 유효하다면 즉시 0-RTT 를 처리할 수 있다
      유효하지 않을 시 TLS 1.3 의 1-RTT 를 시도한다
    • 서버가 0-RTT 데이터를 수락 하면 클라이언트는 추가적인 대기 시간 없이 데이터 전송이 가능하다

0-RTT 의 보안적 허점: 재전송 공격(Replay Attack)

재전송 공격 (Replay Attack)

악의적인 사용자가 클라이언트가 보낸 0-RTT 데이터를 중간에 가로채어 서버에 여러 번 전송 하여,
서버가 동일한 데이터를 여러번 처리 하게 하는 공격이다

이 문제를 해결하기 위해, 서버는 0-RTT 데이터의 재전송 메커니즘을 구현해야 한다

  • 멱등성 구현
  • 재전송 여부 판단하여 서버 처리 중단

참고