게시일: · 수정일:
WireGuard 백서 쉽게 읽기프로토콜 및 암호
프로토콜 및 암호 이 문서에서 등장하는 개시자(Initiator) 는 연결을 시도하는 피어, 응답자(Responder) 는 연결 요청을 받는 피어입니다. Silence is a Virtue: 침묵은 미덕이다 WireGuard 주요 설계 철학 중 하나는 "인증되지 않은 패킷에는 아예...
작성자: gymynnym
프로토콜 및 암호
이 문서에서 등장하는 개시자(Initiator) 는 연결을 시도하는 피어, 응답자(Responder) 는 연결 요청을 받는 피어입니다.
Silence is a Virtue: 침묵은 미덕이다
WireGuard 주요 설계 철학 중 하나는 “인증되지 않은 패킷에는 아예 응답하지 않고, 저장하지 않는 것” 입니다. 이를 통해 네트워크 스캐닝이 힘들어지고, 인증 없는 패킷이 메모리를 잡아먹는 것을 막아줍니다.
WireGuard 서버는 응답자의 공개키를 알고 있는 피어에게만 반응합니다. (Stealth 모드의 핵심)
핸드셰이크
WireGuard가 암호화된 패킷을 보내기 위해서는 먼저 서로 암호화 키를 교환하는 과정이 필요하며, 이를 1-RTT 핸드셰이크로 해결합니다.
1-RTT 핸드셰이크 : 단 한 번의 왕복(요청->응답)을 수행하는 효율적인 핸드셰이크
쿠키 시스템
암호화 패킷을 검증하려면 CPU 연산이 필요합니다. 만약 WireGuard 서버에 공격자가 쓰레기 패킷을 동시다발적으로 전송하게 되면, 서버가 과부하될 수 있습니다.
이를 막기 위해 WireGuard에는 쿠키 시스템이 있습니다:
- 평상시 : 일반적으로 바로 연산 수행
- 바쁠 때(Under load)
- 응답자는 연산을 수행하지 않고, 쿠키를 담아 반환합니다.
- 이때 서버는 아무런 상태도 저장하지 않습니다
- 개시자는 쿠키를 포함하여 다시 요청을 전송합니다.
- 그제야 서버는 정상적으로 처리합니다.
- 응답자는 연산을 수행하지 않고, 쿠키를 담아 반환합니다.
이 방식은 공격자가 DoS 공격을 수행해도, 쉽게 방어할 수 있게 만들어 줍니다. 또한, 중간자 공격을 방지하기 위해 쿠키는 암호화 되어 전송됩니다.
응답자가 쿠키를 보내는 순간 침묵이 깨지지만, 평소에는 침묵 상태를 유지합니다.
메세지
WireGuard는 다음과 같은 메시지 종류를 가집니다:
- 핸드셰이크 개시 (1-RTT)
- 핸드셰이크 응답 (1-RTT)
- 쿠키 응답 (서버가 바쁠 때)
- 핸드셰이크를 통해 협상된 보안 세션을 사용하는, 캡슐화/암호화된 IP 패킷
프로토콜 개요
대부분의 경우(1-RTT):
- 개시자 -> 응답자 : 핸드셰이크 개시 (연결하자)
- 응답자 -> 개시자 : 핸드셰이크 응답 (그러자꾸나)
- (이후) : 데이터 전송
만약 피어 중 하나가 바쁜 경우:
- 게시자 -> 응답자 : 핸드셰이크 개시 (연결하자)
- 응답자 -> 개시자 : 쿠키 답장 (이거 가지고 다시 와)
- 개시자 -> 응답자 : 핸드셰이크 개시 (연결하자, 쿠키 포함)
- 응답자 -> 개시자 : 핸드셰이크 응답 (그러자꾸나)
- (이후) : 데이터 전송
첫번째 메세지: 개시자 -> 응답자
개시자는 다음과 같은 정보가 포함된 메세지를 전송합니다:
sender: 개시자 식별 번호(응답 받을 때 사용)ephemeral: 이번 연결에만 사용할 일회용 공개키static: 정적 공개키timestamp: 현재 시간(재전송 공격 방어용)mac1: 1차 검문(응답자의 공개키와 메세지 내용 사용)mac2: 2차 검문(쿠키 인증, 평소엔 0으로 비워둠)
두번째 메세지 : 응답자 -> 개시자
sender: 응답자 식별 번호receiver: 아까 전달 받은 개시자의 식별 번호ephemeral: 이번 연결에만 사용할 일회용 공개키empty: 인증 확인용 빈 데이터 (암호화됨)mac1,mac2: (위와 동일)
mac1계산법 : 상대방의 공개키를 이용해서 메세지 내용을 해싱한 값
mac2계산법 : 서버가 바빠서 쿠키를 줬을 때만 사용하며, 받은 쿠키를 이용해서 메세지를 해싱한 값
번외: 선택적 사전 공유 대칭키 모드
WireGuard는 기본적으로 Curve25519라는 타원 곡선 암호화 방식을 사용합니다. 안전한 방식이지만 미래에 등장할 양자 컴퓨팅에 대한 대비로 사전 공유 키(Pre-shared Key, PSK) 모드를 지원합니다.
이는 기존 암호화 방식 위에 미리 정해둔 대칭키 하나를 더 추가하는 방식으로, 양자 컴퓨터가 Curve25519 암호화를 무력화해도 이 대칭키를 모르면 패킷을 복호화할 수 없게 합니다.