← 목록
기타 2026-06-11 13KB 읽기 12분

게이트웨이 연합 / 무중단 게이트웨이 Phase 4 로드맵

작성 2026-06-11. 딥리서치(블록체인 페더레이션 레지스트리 + 무중단/자가치유 리버스프록시 2축) + 내부 산출물(크라우니코드 학습 4패턴, 연합 노드등록 인증설계)을 종합한 Phase 4 실행 로드맵. 최우선 불변 원칙: 라이브 게이트웨이(gwlive :8080/:8443, gateway.yaml) 절대 무접촉 — 수정·재시작 금지. 연합 기능은 전부 신규 파일/패턴/별도 포트(:9160)로만. 앵커가 생성한 라우트맵을 게이트웨이가 read-only로 참조하는 구조 외 직접 개입 금지.

1. 개요 — 현재 위치 (Phase 3 완료분)

크라우니 연합은 "고정IP 앵커 + 위치별 노드 블록체인 등록" 모델로 이미 동작한다.

구성요소파일상태
연합 코어 (노드등록/체인검증/라우트생성/스냅샷)한선게이트웨이/크라우니게이트웨이연합.한선동작 (단위검증 PASS)
연합 HTTP API (:9160 POST /register, GET /routes/nodes/verify)한선게이트웨이/크라우니게이트웨이연합API.한선동작
자가치유 데몬 (관측→결정→조치→체인)한선게이트웨이/크라우니게이트웨이AI.한선 + 데몬.한선동작 (launchd 1틱1프로세스)
노드등록 인증설계 (HMAC 2계층 + nonce/ts replay 방어)한선게이트웨이/연합인증설계.한선설계+컴파일 검증 8/8 PASS, 라이브 미통합
머클트리 라이브러리CrownyOS/crownyc/libs/머클트리.한선가용 (미연동)
핵심 갭 (딥리서치가 가리키는 곳):
  1. 등록 경로에 서명 계층이 비어 있음노드등록()은 해시체인만 만들고 누가 썼는지 검증 안 함. 위장 노드가 임의 등록 가능. 인증설계.한선은 존재하나 등록처리()에 게이트로 삽입되지 않았다.
  2. Merkle root 누적 공시 부재 — 노드가 자기 등록 포함을 전체 체인 다운로드 없이 검증할 방법 없음.
  3. 멤버십/실패감지가 단순 — 헬스 A면 즉시 라우트 제외(오탐 페일오버 위험). SWIM의 suspect 중간상태·indirect probe·incarnation 없음.
  4. 동기화가 전량 전송GET /nodes가 ndjson 전체 반환. anti-entropy 차분 동기화 없음.

2. 외부 모범사례 — 크라우니 채택 결정 (우선순위)

각 사례를 "채택 / 변형채택 / 보류"로 분류했다. 변형은 크라우니 제약(누적틱 SIGTRAP 장수프로세스 금지, BGP 불가, 한선씨 함정)에 맞춘 형태.

채택 (Phase 4 필수)

순위모범사례출처크라우니 적용 형태
P1서명 비부인 계층 (Ed25519 / 트러스트앵커 사전등록)VeritasChain VCP우선 HMAC-SHA256 2계층(인증설계.한선 그대로) 라이브 통합 → 이후 Ed25519 격상. 핵심 갭 #1 메우기.
P2Merkle root 외부 앵커링 + inclusion proofRFC 6962앵커가 nodes.ndjson 누적 Merkle root를 federation-root.txt에 주기 공시(+앵커 서명). 노드는 형제해시 경로만 받아 O(log n) 포함검증. 기존 머클트리.한선 재사용.
P3SWIM 3상태 멤버십 (alive/suspect/dead) + suspicion 단계SWIM 원논문 / Consul Serf크라우니 T/O/A 헬스에 자연 대응. 즉시 dead 금지 → O(suspect) 경유, indirect probe k개 위임, 타임아웃 틱 만료 후에만 A(dead) 확정·라우트 제외. 오탐 페일오버 차단.
P4incarnation(세대) 번호로 플래핑 방지SWIM노드 상태변경마다 단조증가 incarnation을 체인 레코드에 기록 → 살아난 노드가 옛 dead gossip에 다시 죽지 않게. append-only 이력.
P5anti-entropy 차분 동기화 (head 비교 → 누락블록만)Netflix/Consul앵커-노드가 head.txt(마지막 블록해시)만 먼저 교환, 같으면 종료, 다르면 공통조상까지 거슬러 누락분만 전송. 전량 ndjson 재전송 폐지.

변형 채택 (Phase 4~5)

모범사례크라우니 변형
고정IP 앵커 (Anycast)BGP anycast 사용 불가 → 단일 gwlive 진입점 + 동적 백엔드 라우팅 테이블로 에뮬레이션. anycast의 자동 라우트 철회 효과는 게이트웨이 내부 헬스 페일오버로 대체. 단 게이트웨이가 SPOF 안 되게 라우팅테이블·멤버십은 머클체인 저널로 외부화.
active + passive 헬스 (서킷브레이커 + outlier ejection)active probe는 1틱1프로세스 데몬이 수행(이미 있음). passive eject는 단명 프로세스가 트래픽을 직접 프록시 안 하므로 간접 구조 — 라이브 게이트웨이가 쓰는 5xx/타임아웃 카운터 저널을 헬스 프로세스가 읽어 셀코어 룰로 판정.
서킷브레이커 자원한도 (bulkhead) + max_ejection_percent노드별 동시/대기요청 캡을 셀코어 룰로. 단, 동시에 전체 노드가 빠지지 않게 최소 건강노드 수 보존 가드.
무중단 리로드/드레이닝 (graceful drain)drain은 진행중 연결추적 필요 → 라이브 게이트웨이 책임. 헬스 프로세스는 "제거예정" 마킹만 저널에 남김(세션 책임 분리). 라우팅 테이블 핫스왑만 연합 담당.
파티션 내성 (Vegvisir DAG 머지)노드가 앵커와 단절 시 로컬 ndjson에 자기 블록 append 지속, 재연결 시 prev해시 기준 분기탐지 → append-only 머지(incarnation 우선). 글로벌배열[i]=값 금지 → 머지도 append-only로만.

보류 (Phase 5+ 또는 미채택)

모범사례판단
무거운 글로벌 합의 (PoW/PoX/Raft 정식 구현)불필요. 앵커=고정IP SSOT가 Raft 리더 역할 대체. 라우트맵은 앵커가 단일 직렬화.
systemd WatchdogSeclaunchd엔 watchdog 없음 → KeepAlive(Crashed) + 자체 백오프 저널로 등가 구현.
장수 데몬 gossip 루프금지 — crownyc 누적틱 SIGTRAP. launchd StartInterval 1틱1프로세스 강제.

3. 라이브 무접촉 보장 (전 Phase 관통 원칙)

  • 연합/멤버십/라우트맵/서명/nonce 상태는 전부 data/federation-chain/* 파일 저널에만 영속. gwlive 메모리·gateway.yaml에 쓰지 않는다.
  • 게이트웨이는 앵커가 생성한 federated-routes.txtread-only로만 참조 (참조 연동조차 별도 검토 후, 라이브 재시작 없이 핫리로드 경로로만).
  • 모든 신규 로직은 별도 포트(:9160) 독립 서버 또는 launchd 단명 프로세스.
  • drain/연결추적은 게이트웨이 세션 책임. 연합은 "제거예정 마킹"까지만.
  • 한선씨 함정 준수: "\r"글자변환(13), 체계() stdout→/tmp후 읽기(), 파일존재()→읽기()글자수, 글로벌배열[i]=값 금지→append-only, Content-Length 한글잘림→생략+Connection:close.

4. 구현 순서 (Phase 4 단계별 — 작은 것부터 완성)

크라우니 작업원칙(근본 해결·장기적인 것부터·완전 세분화) 준수. 각 단계는 독립적으로 검증 가능하게 분리.

4.1 — 서명 게이트 라이브 통합 (P1, 최우선·최소위험)

  • 연합인증설계.한선등록인증()크라우니게이트웨이연합API.한선 등록처리()게이트로 삽입.
  • POST /register 본문에 nonce, ts, sig(+ mode) 필드 추가. 통과(1)일 때만 노드등록() append.
  • 반환코드 매핑: 0→403 서명불일치 / -1→401 미등록·폐기 / -2→408 ts만료 / -3→409 nonce재사용.
  • POST /enroll 엔드포인트 신설 — 부트스트랩토큰 HMAC으로 노드 등록키 최초 enroll(등록키저장()), node-keys.ndjson append-only.
  • followup 해소: 계층A 노드공유키조회() 구현(현재 미구현), used-nonces.log ts기반 주기정리(무한증가 방지).
  • 검증: 위장노드(서명없음) 거부 / 정상노드 통과 / replay(같은 nonce) 거부 / ts±300초 밖 거부.

4.2 — Merkle root 누적 공시 + inclusion proof (P2)

  • 앵커가 nodes.ndjson 블록들의 Merkle root 계산(머클트리.한선 재사용, RFC6962 left/right 규칙) → federation-root.txt에 기록 + 앵커 서명.
  • GET /root 엔드포인트: 현재 root + 앵커서명 반환.
  • GET /proof?hash=<블록해시>: 해당 블록의 형제해시 경로(inclusion proof) 반환.
  • 노드측 검증 함수: proof + root만으로 자기 등록 포함 O(log n) 확인.

4.3 — SWIM 3상태 멤버십 + suspicion (P3, P4)

  • 헬스 모델을 T(alive)/O(suspect)/A(dead) 3상태로 정식화. 기존 라우트생성의 "A 즉시 제외"를 suspect 경유로 교체.
  • 앵커 direct probe 실패 → O(suspect)로 체인 전파, k개 이웃에 indirect probe(ping-req) 위임.
  • suspicion 타임아웃(틱 카운트) 만료 + 무응답 → A(dead) 확정·라우트 제외 + 동일서비스 보유노드 인계.
  • incarnation(세대) 번호를 레코드에 추가 → 살아난 노드 self-refute. append-only 이력.
  • 파라미터 노출: indirect probe k값, suspicion 타임아웃 틱수(룰 파라미터).
  • 장수프로세스 금지 준수: 멤버십/suspicion타이머/incarnation/백오프는 전부 디스크 저널. 매 launchd 틱마다 read→update→write로 재구성. 타이머=틱카운트 환산.

4.4 — anti-entropy 차분 동기화 (P5)

  • 앵커-노드 head 비교 우선(head.txt). 같으면 동기화 완료(전송 0).
  • 다르면 공통조상까지 거슬러 누락블록만 전송(Detect-Highlight-Repair-Verify 4단계).
  • GET /nodes 전량 반환은 fallback으로만 유지, 기본 경로는 GET /sync?since=<head>.
  • 차분 파일은 /tmp로 받아 처리(체계() stdout 캡처 불가 함정).

4.5 — passive eject + 서킷브레이커 (변형채택)

  • 라이브 게이트웨이의 5xx/타임아웃 카운터 저널을 헬스 프로세스가 읽어 셀코어 룰로 outlier 판정.
  • 룰: 룰생성("노드추출",우선순위)룰조건추가(연속실패,">=",5)룰변경추가(노드상태,"ejected").
  • 노드별 동시/대기요청 캡 룰 + max_ejection_percent 등가 최소건강노드 보존 가드.
  • 점진 백오프 재투입(eject 시간 반복 증가). 백오프 카운터 저널화(systemd RestartSec/StartLimitInterval 등가 자체구현). gwlive는 이 재시작 루프에 절대 미포함.

4.6 — 파티션 내성 머지 + 콜드스타트 복원 (Phase 5 진입)

  • 노드 앵커 단절 시 로컬 append 지속 → 재연결 시 prev해시 분기탐지 → append-only 머지(incarnation 우선, ts는 시계오차로 보조만).
  • 게이트웨이 콜드스타트 시 마지막 스냅샷 + 체인 리플레이로 멤버십 복원.

5. 리스크 & 완화

리스크완화
한선씨 Ed25519 네이티브 미구현 → 외부도구 stdout 캡처 함정우선 HMAC-SHA256(인증설계.한선 그대로) 라이브 적용. 단 키공유라 진짜 비부인 아님 → Ed25519 격상 전까지 미보장 명시. 외부 서명도구는 /tmp redirect 후 읽기().
해시체인 단독은 "누가" 미보장앵커의 등록키 사전등록(트러스트앵커) 없이는 Merkle/체인 검증 무의미 → 4.1을 최우선.
gossip 약일관성으로 잘못된 페일오버 라우팅통합 라우트맵은 고정IP 앵커가 SSOT로 직렬화(Raft 리더 대체). 멤버 헬스만 gossip.
장수 데몬 gossip → SIGTRAP 크래시launchd 1틱1프로세스 강제. 인터벌간 상태는 파일 영속만 신뢰.
파티션 머지 시 시계오차로 오래된 블록이 최신 덮음incarnation/세대 번호 병행. ts 단독 정렬 금지.
suspicion 타임아웃 튜닝 (짧으면 오탐, 길면 전파지연)k값·타임아웃 틱수를 룰 파라미터로 노출.
graceful drain은 연결추적 필요 (단명 프로세스 불가)drain은 게이트웨이 세션 책임. 연합은 제거예정 마킹만.

6. 관련 파일

  • /Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이연합.한선
  • /Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이연합API.한선
  • /Users/ef/crowny-gateway/한선게이트웨이/연합인증설계.한선
  • /Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이AI.한선
  • /Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이AI데몬.한선
  • /Users/ef/CrownyOS/crownyc/libs/머클트리.한선
  • /Users/ef/CrownyOS/crownyc/libs/해시.한선
  • /Users/ef/CrownyDoc/projects/2026-06-09-연합노드등록인증설계.md

7. 잔여 이슈 (내부 followup 통합)

  • 비동기잡 폴링 패턴은 게이트웨이에 리터럴 구현 없음 → 데몬/조회API 분리를 실제 jobId 큐 라이브러리(.한선)로 구현해 정합성 확보 검토.
  • crownycode 슬러그 하이픈 불허(^[a-zA-Z0-9_가-힣]{3,}$) → 향후 슬러그 명명 시 밑줄 준수.
  • 해시.한선 HMAC은 SHA256 문자열기반 근사 → 진짜 RFC2104 바이트 XOR 필요 시 버퍼 기반 SHA256 추가.