Search for a command to run...
이 문서에서 등장하는 개시자(Initiator) 는 연결을 시도하는 피어, 응답자(Responder) 는 연결 요청을 받는 피어입니다.
WireGuard 주요 설계 철학 중 하나는 "인증되지 않은 패킷에는 아예 응답하지 않고, 저장하지 않는 것" 입니다. 이를 통해 네트워크 스캐닝이 힘들어지고, 인증 없는 패킷이 메모리를 잡아먹는 것을 막아줍니다.
WireGuard 서버는 응답자의 공개키를 알고 있는 피어에게만 반응합니다. (Stealth 모드의 핵심)
WireGuard가 암호화된 패킷을 보내기 위해서는 먼저 서로 암호화 키를 교환하는 과정이 필요하며, 이를 1-RTT 핸드셰이크로 해결합니다.
1-RTT 핸드셰이크 : 단 한 번의 왕복(요청->응답)을 수행하는 효율적인 핸드셰이크
암호화 패킷을 검증하려면 CPU 연산이 필요합니다. 만약 WireGuard 서버에 공격자가 쓰레기 패킷을 동시다발적으로 전송하게 되면, 서버가 과부하될 수 있습니다.
이를 막기 위해 WireGuard에는 쿠키 시스템이 있습니다:
이 방식은 공격자가 DoS 공격을 수행해도, 쉽게 방어할 수 있게 만들어 줍니다. 또한, 중간자 공격을 방지하기 위해 쿠키는 암호화 되어 전송됩니다.
응답자가 쿠키를 보내는 순간 침묵이 깨지지만, 평소에는 침묵 상태를 유지합니다.
WireGuard는 다음과 같은 메시지 종류를 가집니다:
대부분의 경우(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 암호화를 무력화해도 이 대칭키를 모르면 패킷을 복호화할 수 없게 합니다.