IP 대신 키로 다이얼하라: iroh가 P2P 네트워킹을 다시 쓰는 법
하루 만에 별 369개, Rust로 만든 탈(脫)-IP 네트워킹 스택의 부상

2026년 6월 19일, GitHub 트렌딩 상단에 하루 만에 별 369개를 받은 Rust 라이브러리가 올라왔다. n0-computer/iroh다. 슬로건은 짧고 도발적이다: "IP 주소는 망가진다. 키로 다이얼하라." 누적 별 9,988개, 아직 1만도 안 됐는데 왜 지금 이 프로젝트가 터지고 있는가.
이게 뭔가
카페에서 집으로 이동하면 스마트폰 IP가 바뀐다. 클라우드 서버로 연결하면 이 문제가 가려지지만 서버 비용·지연·의존성이 생긴다. iroh는 다른 방법을 택한다. 공개 키(Public Key)로 상대를 식별한다.
"저 기기에 연결해줘" — 개발자가 NodeId(Ed25519 공개 키)만 넘기면 iroh가 알아서 경로를 찾는다. 내부에서는 QUIC 프로토콜로 암호화 연결을 맺고 NAT 뒤에 있으면 홀-펀칭(hole-punching)을 시도한다. 홀-펀칭이 실패하면 공개 릴레이 서버를 경유한다. 개발자는 이 복잡한 과정을 볼 필요가 없다.
왜 지금 뜨는가
세 가지 흐름이 동시에 수렴했다.
① 로컬-퍼스트 소프트웨어의 부상 — 클라우드 중앙 서버 없이 기기끼리 직접 동기화하는 앱 설계 방식이 주목받는다. iroh는 이 패턴에 필요한 저수준 블록을 정확히 제공한다.
② 엣지 AI·IoT 확산 — AI 추론이 클라우드에서 단말기로 내려오면서 고정 IP 없는 기기들이 서로 데이터를 교환해야 하는 시나리오가 폭증했다. 중앙 서버 없이 노드 간 채널을 열어야 할 때 iroh 같은 P2P 스택이 필요하다.
③ Rust 생태계의 인프라 진입 — Rust가 네트워크 인프라 계층에서 C/C++를 대체하는 속도가 빨라졌다. iroh는 Rust-native로 설계된 덕분에 메모리 안전성과 고성능을 동시에 만족한다.
핵심 기능
- 공개 키 다이얼링: NodeId 하나로 전 세계 어디서든 상대 노드를 찾아 연결.
- QUIC 멀티스트림: 암호화된 양방향 스트림과 데이터그램을 동시 운용. 헤드-오브-라인 블로킹 없음.
- 홀-펀칭 + 릴레이 폴백: 직접 경로를 우선하되, 실패 시 공개 릴레이 서버로 투명하게 전환.
- 모듈형 프로토콜 레이어: iroh 코어 위에
iroh-blobs(BLAKE3 해시 기반 파일 전송),iroh-gossip(Pub-Sub 오버레이),iroh-docs(분산 키-값 저장소)를 골라 붙일 수 있다.
누구에게 쓸모 있나
| 대상 | 활용 예 |
|---|---|
| 파일 공유 앱 개발자 | 서버 없이 두 기기 간 대용량 파일 직접 전송 |
| 협업 도구 개발자 | 로컬-퍼스트 실시간 동기화 (iroh-docs) |
| IoT·엣지 AI 엔지니어 | 고정 IP 없는 기기 간 안정적 채널 확보 |
| 게임 P2P 개발자 | NAT 환경 멀티플레이어 홀-펀칭 자동화 |
중앙 서버 운영 비용을 줄이거나, 오프라인 우선(Offline-First) 아키텍처를 고민 중이라면 가장 직접적인 선택지다.
시작하기
Cargo.toml에 의존성을 추가한다. 최신 버전은 crates.io/crates/iroh에서 확인.
[dependencies]
iroh = "*" # 버전은 crates.io 최신으로 고정 권장
tokio = { version = "1", features = ["full"] }
anyhow = "1"
공식 가이드: iroh.computer/docs | Rust API 레퍼런스: docs.rs/iroh
사용 예시
① 나만의 노드 ID 발급 — 엔드포인트 생성
use iroh::Endpoint;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let endpoint = Endpoint::builder().bind().await?;
// Ed25519 공개 키가 곧 주소. 이 ID로 상대방이 나를 찾는다.
println!("내 Node ID: {}", endpoint.node_id());
Ok(())
}
② 상대 노드에 연결하고 데이터 주고받기
// node_addr: NodeId + 알려진 주소 힌트(없어도 동작)
let conn = endpoint.connect(node_addr, b"my-alpn").await?;
let (mut send, mut recv) = conn.open_bi().await?;
send.write_all(b"hello, iroh").await?;
send.finish()?;
let reply = recv.read_to_end(4096).await?;
println!("응답: {}", String::from_utf8_lossy(&reply));
③ iroh-blobs — 해시로 파일 공유
# Cargo.toml 추가
iroh-blobs = "*"
// 파일을 블롭으로 추가하면 BLAKE3 해시를 반환
// 수신 측은 이 해시만 알면 출처 불문 파일을 내려받는다
let outcome = blobs.add_from_path(path, true, ...).await?;
println!("공유 해시: {}", outcome.hash);
한계·주의
- API 안정성 미보장: 아직 1.0 이전이다. 버전을 고정하지 않으면 업그레이드 시 빌드가 깨질 수 있다.
- 릴레이 의존 가능성: 엄격한 기업 방화벽이나 이중 NAT 환경에서는 홀-펀칭이 실패해 릴레이를 경유한다. 자체 릴레이 운영은 가능하지만 별도 인프라가 필요하다.
- Rust 전용 공식 SDK: 다른 언어 바인딩은 커뮤니티 기여 상태다. Python·JS 클라이언트가 필요하다면 성숙도를 별도로 확인해야 한다.
- 릴레이 가용성: 공개 릴레이 서버가 다운되거나 과부하 상태이면 직접 연결이 불가능한 노드 간 통신이 단절된다.
iroh는 "연결 인프라의 레고 블록"이다. 단독으로는 완성품이 아니지만, 그 위에 무엇을 쌓든 NAT·암호화·경로 탐색을 다시 짤 필요가 없다는 게 핵심이다.
출처
- n0-computer/iroh GitHub Repository — GitHub
- iroh 공식 홈페이지 — n0 computer
- iroh Rust Docs — docs.rs
- iroh on crates.io — crates.io
댓글 0
첫 댓글을 남겨보세요.
