Noise 프로토콜 프레임워크
WireGuard, WhatsApp, Lightning에서 사용하는 맞춤형 암호 핸드셰이크 구축 프레임워크인 Noise를 살펴봅니다.
Noise 프로토콜 프레임워크은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Noise 프레임워크란 무엇인가
Noise 프로토콜 프레임워크(Trevor Perrin, 2016년, 최신 개정판 2018년)는 작은 기본 암호 연산 집합과 패턴 언어를 사용하여 보안 채널 프로토콜을 구축하기 위한 프레임워크입니다. Noise는 단일 프로토콜을 정의하는 대신, DH 연산의 순서와 실행 절차를 설명하는 핸드셰이크 패턴의 어휘를 정의합니다. 유효한 Noise 패턴은 모두 구체적인 DH(Curve25519 또는 Curve448), 암호(AESGCM 또는 ChaChaPoly), 해시(SHA-256, SHA-512, BLAKE2) 함수로 인스턴스화할 수 있습니다. Noise는 WireGuard, WhatsApp, Signal(X3DH의 기반), Lightning Network, I2P에서 사용됩니다.
Noise 역할과 키
모든 Noise 핸드셰이크에는 개시자(I)와 응답자(R)가 있습니다. 각 당사자는 두 가지 유형의 키를 가질 수 있습니다. 정적 키(장기 신원 키, s/S로 표기)와 임시 키(세션마다 새로 생성되며 e/E로 표기)입니다. 소문자는 로컬 당사자의 키를, 대문자는 원격 당사자의 공개 키를 나타냅니다. Noise 패턴은 어떤 키를 평문 또는 암호화된 형태로 보낼지와 어떤 DH 연산을 수행할지를 지정합니다. 예를 들어 "e"는 "내 임시 공개 키를 보냄"을 의미하고, "es"는 "DH(my_ephemeral, remote_static)를 수행함"을 의미합니다. 각 DH 출력은 핸드셰이크의 누적 해시 상태에 혼합됩니다.
Noise 대칭 상태
Noise의 핵심은 SymmetricState이며, 세 가지 값을 유지합니다. ck(연쇄 키, 프로토콜 이름 해시로 초기화됨), h(핸드셰이크 해시, 계속 갱신되는 트랜스크립트 해시), k(현재 암호화 키)입니다. MixKey(input)은 HKDF(ck, input)를 실행하여 ck와 k를 갱신합니다. MixHash(data)는 데이터를 해시하여 h에 반영합니다. EncryptAndHash(plaintext)는 k로 암호화한 뒤 암호문을 h에 혼합합니다. DecryptAndHash(ciphertext)는 복호화한 뒤 암호문을 h에 혼합합니다. 핸드셰이크 해시 h는 트랜스크립트 바인딩을 제공합니다. 공격자가 어떤 메시지든 변경하면 h가 바뀌어 복호화가 실패합니다. 핸드셰이크가 끝나면 Split()은 송신용과 수신용으로 분리된 두 개의 CipherStates를 생성합니다.
Noise_XX 패턴
Noise_XX는 가장 널리 사용되는 상호 인증 패턴입니다. 핸드셰이크 중 양쪽 당사자의 정적 키를 전송하여 상호 정적 키 인증을 제공합니다. 패턴: (1) -> e (개시자가 임시 공개 키를 보냅니다). (2) <- e, ee, s, es (응답자가 임시 키를 보내고, DH(e,e)와 DH(e,s_resp)를 수행하며, 암호화된 정적 키를 보냅니다). (3) -> s, se (개시자가 암호화된 정적 키를 보내고 DH(s_init, e_resp)를 수행합니다). 3단계가 끝나면 양쪽 당사자는 세 개의 DH 출력을 세션 키에 혼합합니다. ee(순방향 비밀성), es(서버 인증), se(클라이언트 인증)입니다. 세션이 끝난 뒤 장기 키가 유출되더라도 세션 키는 영향을 받지 않습니다.
Noise_IK 패턴(WireGuard)
WireGuard는 개시자가 응답자의 정적 키를 미리 알고 있는 Noise_IK에서 파생된 패턴을 사용합니다. (1) -> e, es, s, ss (개시자가 임시 키를 보내고, DH(e, S_resp)를 수행하며, 암호화된 정적 키와 DH(s_init, S_resp)를 보냅니다). (2) <- e, ee, se (응답자가 임시 키를 보내고 DH(e_resp, e_init)와 DH(e_resp, S_init)를 수행합니다). IK 패턴은 개시자의 신원을 숨기며(1단계에서 개시자의 정적 키가 응답자의 정적 키로 암호화됨), 1-RTT로 완료됩니다. WireGuard는 재생을 방지하기 위해 암호화된 개시자 페이로드 안에 타임스탬프를 추가합니다. 이로써 WireGuard는 두 개의 UDP 패킷만으로 완전한 VPN 핸드셰이크를 수행하는 특유의 단순성을 갖습니다.
Noise 핸드셰이크 해시와 채널 바인딩
Noise 핸드셰이크가 끝났을 때의 핸드셰이크 해시 h는 전송된 모든 메시지를 포함하는 트랜스크립트 해시입니다. 이는 채널 바인딩 값으로 사용됩니다. 양쪽 당사자가 동일한 h를 계산하므로, Noise 세션에 결속하려는 제3자 프로토콜은 h를 논스나 채널 ID로 포함할 수 있습니다. 이를 통해 복합 인증이 가능합니다. 예를 들어 TLS 방식의 인증서 인증 단계를 Noise 핸드셰이크 뒤에 실행하고, h를 통해 인증서를 이 특정 세션에 결속할 수 있습니다. 채널 바인딩은 한 세션의 인증 자격 증명을 다른 세션에 재생하는 자격 증명 전달 공격을 방지합니다. Split()은 세션 키와 함께 h를 애플리케이션에 제공합니다.
Noise 지연 패턴과 대체
Noise는 개시자가 응답자의 정적 키를 미리 알지 못하는 상황을 위해 지연 패턴을 지원합니다. Noise_NX(개시자에게 정적 키가 없고 응답자가 자신의 키를 전송함)는 단방향 TLS와 유사합니다. Noise_XX는 양쪽 당사자가 키를 교환해야 하는 경우를 처리합니다. 개시자가 추정한 응답자의 정적 키가 잘못된 경우(예: 키가 교체된 후), Noise_IK는 Noise_XXfallback으로 대체될 수 있습니다. 이 대체 패턴을 사용하면 응답자가 "잘못된 키를 사용했습니다. 여기 새 공개 키가 있습니다"라고 알리면서도 외부 관찰자에게 대체가 발생했다는 사실을 드러내지 않아 프로토콜의 불투명성을 유지할 수 있습니다.
WhatsApp과 Signal의 Noise
WhatsApp과 Signal은 클라이언트와 서버 사이에 보안 채널을 설정할 때 Noise_XX를 사용합니다. WhatsApp의 이진 프로토콜은 Curve25519, ChaChaPoly, SHA-256을 사용하는 Noise_XX를 사용합니다. 클라이언트의 정적 키는 장기 신원 키입니다. Noise 핸드셰이크 후 애플리케이션 계층에서는 추가 인증(예: Signal 등록 및 전화번호 확인)을 수행합니다. Signal의 X3DH(확장 삼중 Diffie-Hellman) 키 합의는 비동기 메시지 교환을 통해 두 사용자 사이에 공유 비밀을 설정하기 위해 네 번의 DH 연산을 수행합니다. 이는 표준 Noise 패턴은 아니지만 유사한 DH 혼합 개념을 사용합니다. 이후 지속적인 메시지 암호화는 Double Ratchet이 담당합니다.
Noise와 TLS
Noise와 TLS 1.3은 서로 다른 철학으로 같은 문제(인증된 키 교환)를 해결합니다. TLS 1.3은 규정된 암호 스위트, 인증서 형식(X.509), 확장을 갖춘 단일 프로토콜입니다. 웹 브라우저와 서버를 위해 설계된, 대부분의 경우에 맞는 단일 프로토콜입니다. Noise는 프레임워크이므로 인증서 형식, PKI, 전송 바인딩을 지정하지 않습니다. 따라서 Noise는 더 작고(WireGuard의 전체 Noise 구현은 400줄 미만의 코드로 이루어짐) 형식적으로 추론하기 쉽지만, 애플리케이션이 신원 관리를 별도로 처리해야 합니다. Noise는 PKI가 과도한 폐쇄형 시스템(앱-서버, VPN)에 적합하고, 인증서 상호 운용성이 필요한 개방형 시스템(웹)에는 TLS가 적합합니다.
Noise의 형식적 보안
Noise 패턴은 eCK(확장 Canetti-Krawczyk) 보안 모델로 형식 분석되었습니다. Kobeissi, Bhargavan, Blanchet은 Proverif를 사용하여 Noise의 12가지 기본 패턴 모두에 대해 인증과 키 기밀성이 성립한다는 증명을 제시했습니다. 이러한 증명은 표준 DH 난이도 가정(Curve25519)과 기반 AEAD 및 해시 함수의 보안을 전제로 합니다. Noise의 구성적 특성(각 DH를 점진적으로 혼합함)은 여러 상태 전이를 포함하는 복잡한 TLS 방식 프로토콜보다 추론하기 쉽게 만듭니다. Noise에 대한 암호학적 검증 덕분에 WireGuard와 WhatsApp은 배포 전에 프로토콜 보안에 대해 높은 신뢰를 확보할 수 있었습니다.
Noise를 올바르게 구현하기
Noise를 구현할 때 흔히 발생하는 문제는 다음과 같습니다. (1) 패턴 혼동 — 응답자의 정적 키가 신뢰할 수 있게 사전 배포되지 않은 경우 Noise_IK를 사용하면 신원 불일치가 발생합니다(개시자가 잘못된 키로 모르게 암호화할 수 있습니다). (2) 재생 방지 — Noise는 인증을 제공하지만 Transport 단계 메시지에 대한 재생 방지는 제공하지 않습니다. 논스(64비트 카운터)를 강제하여 사용해야 하며, 카운터 순환(2^64개 메시지 후)이 발생하면 키를 다시 설정해야 합니다. (3) 프롤로그 무결성 — Noise 프롤로그(핸드셰이크가 시작되기 전에 h에 혼합되는 바이트 문자열)에는 다운그레이드 공격을 방지하기 위해 모든 프로토콜 맥락(버전, 알고리즘 선택)이 포함되어야 합니다. (4) PSK 오용 — Noise는 사전 공유 키 혼합을 위한 PSK 확장을 지원하지만, PSK는 엔트로피가 높아야 하며 사용자 비밀번호여서는 안 됩니다.
Noise 프레임워크 퀴즈
핸드셰이크 패턴에서 Noise 패턴 표기 "es"는 무엇을 의미합니까?
Noise 프레임워크 복습
Noise는 DH 연산의 패턴 언어를 사용하여 인증된 키 교환 프로토콜을 구축하기 위한 프레임워크입니다. SymmetricState는 MixKey와 MixHash를 통해 갱신되는 연쇄 키(ck), 트랜스크립트 해시(h), 암호화 키(k)를 유지합니다. Noise_XX는 1.5 RTT로 상호 인증을 제공하고, Noise_IK(WireGuard)는 응답자의 키를 알고 있을 때 1 RTT로 완료됩니다. 핸드셰이크 해시 h는 채널 바인딩 역할을 합니다. Noise는 Proverif를 통해 모든 핵심 패턴에 대해 형식 검증되었습니다. PKI가 불필요한 폐쇄형 시스템 프로토콜(WireGuard, WhatsApp)에서는 TLS보다 Noise가 선호됩니다. 올바르게 구현하려면 재생 방지, 프롤로그 무결성, 엔트로피가 높은 PSK가 필요합니다.
자주 묻는 질문
“Noise 프로토콜 프레임워크” 강의는 무료인가요?
네 — “Noise 프로토콜 프레임워크” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Noise 프로토콜 프레임워크”에서 뭘 배우나요?
WireGuard, WhatsApp, Lightning에서 사용하는 맞춤형 암호 핸드셰이크 구축 프레임워크인 Noise를 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“Noise 프로토콜 프레임워크” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.