공개 Webhook은 자체 호스팅 게이트웨이의 연한 배다. 리스너에 닿을 수 있는 이는 누구나 HMAC 검증·오래된 타임스탬프 거부·배달 식별자 중복 제거 없이 도구 호출을 스팸할 수 있다. 이 글은 두 개의 매트릭스(서명 알고리즘 대 CPU 비용, 리플레이 캐시 설계 대 메모리), JSON-LD와 맞춘 HowTo 일곱 단계, FAQ 구조화 데이터, 채널별 가이드와 멱등 메시징으로의 링크를 담는다. NodeMac 플릿에 이미 공개된 패턴과 같은 높이로 읽도록 짰다.
게이트웨이를 인터넷에 노출하는 설계에서는 처음부터 “악의적 재전송”과 “정당한 프로바이더 재시도”를 같은 HTTP 로그 형태로 본다. 운영팀이 쉽게 갈라내도록 서명 실패·스큐 거부·중복 차단을 서로 다른 카운터로 나누고 대시보드에서 상관시킨다. 알림 임계는 공격보다 비밀 로테이션 어긋남을 먼저 의심하는 값에 둔다.
포트를 연 순간 물려받는 위협
- 캡처 후 리플레이:공격자는 정당한 서명된 페이로드를 저장하고 쿼터가 고갈될 때까지 다시 올린다.
- 시계 스큐 악용:불안정한 프로바이더를 고치려 스큐 창을 넓히면 리플레이 표면도 넓어진다.
- 파서 차이:본문을 변형한 뒤 서명을 검증하면 JSON 정규화 공격이 단순 비교를 빠져나간다.
Slack과 Discord Webhook 배선으로 채널 특성을 잡고 이어서 멱등 리플레이 처리를 읽는다. 서명이 성공해도 도구 호출을 이중 소비하지 않게 한다.
매트릭스 A — 서명 검증 비용과 보장
| 접근 | 보안 | M4 CPU | 비고 |
|---|---|---|---|
| 원시 바이트에 대한 HMAC-SHA256 | 강함 | Apple Silicon에서 사소함 | Slack 호환 리스너 기본 |
| 쿼리 문자열 공유 비밀 | 약함 | N/A | 액세스 로그에 새어 나온다——프로덕션 금지 |
| 비대칭 Ed25519(커스텀) | 강함 | 낮지만 코드 리스크 높음 | 벤더가 강제할 때만. 충분히 테스트 |
매트릭스 B — 리플레이 캐시 설계(✓ / ✗)
| 설계 | 재시작 후 생존 | RAM 한계 | 트레이드오프 |
|---|---|---|---|
| 이벤트 ID 인메모리 LRU | ✗ | ✓ | 단순. 게이트웨이 재시작 후 리플레이 가능——스큐를 촘촘히 하지 않으면 |
| TTL 있는 APFS SQLite | ✓ | ✓ | 코드는 늘어난다. 규제 팀에 적합 |
| 리플레이 캐시 없음 | ✗ | ✓ | 도구가 프로덕션을 바꾸면 절대 허용 불가 |
HowTo: macOS 게이트웨이 일곱 단계(본문)
1단계는 Keychain 기반 비밀과 같은 형태다. 워크스페이스 전역 읽기에 서명 재료를 두지 않는다. 2단계는 리버스 프록시에서 원시 HTTP 본문을 읽고 JSON 미들웨어가 공백을 예쁘게 하기 전에 검증한다——불일치 대부분은 공격이 아니라 pretty-print다.
- 서명 비밀 불러오기:Keychain 또는 launchd
EnvironmentVariables. 로테이션 절차와 롤백을 같은 PR에 적는다. - 먼저 서명 검증:원시 바이트로 HMAC. 본문 스트림을 한 번만 소비하는 설계에 주의.
- 타임스탬프 스큐 확인:NTP와 짝.CI 시계 드리프트 텔레메트리와 같은 보드에 스큐 거부를 올린다.
- 리플레이 윈도 강제:리플레이 TTL은 프로바이더 문서상 최대 재시도 간격의 대략 2배를 하한으로. 주간으로 중복 배달을 그래프한다.
- 멱등성 맞추기:HTTP에서 막힌 리플레이가 워크스페이스 반쯤 적용을 남기지 않게 메시지층 중복 제거와 도구층 키를 대응시킨다.
- 비밀을 가린 실패 로그:카운터만. 포렌식이 syslog에 비밀을 흘리지 않게 한다.
- doctor 실행:doctor로 리스너와 TLS 불일치를 공격자보다 먼저 잡는다.
온보딩 짧은 SOP로는 먼저 doummal에서 SSH와 포트 노출 패턴을 확인하고, SKU·리전은 gagyok, 클릭만으로 진행되는 프로바이더 동의는 vnc로 운영자가 처리하는 순서가 덜 흔들린다.
설정에 모을 만한 수치 기본값
- 스큐 창:300초로 시작해 30일 깨끗하면 조인다.
- 리플레이 TTL:프로바이더 문서 최대 재시도 간격의 최소 2×.
- 알림:서명 실패율이 10분간 트래픽 1%를 넘으면 페이지——대개 공격이 아니라 비밀 로테 불일치다.
경고:데모 때문에 서명 검사를 “임시로” 끄지 않는다. 클라이언트를 고치고 비밀을 회전한다.
OpenClaw 운영 FAQ
TLS 클라이언트 인증서가 HMAC을 대체하는가?
전송을 인증할 뿐 개별 Webhook 이벤트를 인증하지 않는다. 프로바이더가 엔드투엔드 mTLS만을 명시하지 않는 한 HMAC을 유지한다.
게이트웨이는 Cloudflare나 nginx 뒤에 두어야 하는가?
그렇다——상류에서 TLS를 종료하고 원시 본문을 전달하며 서명 방식이 기대하는 원본 헤더를 보존한다.
리전 호스팅이 왜 중요한가?
채팅 프로바이더 이그레스 가까이(HK, JP, KR, SG, US)에서 게이트웨이를 돌려 RTT가 길어 생기는 헛재시도를 줄인다. 암호를 건너뛰기 위함이 아니다.
같은 Mac에서 여러 리스너를 돌릴 때 주의는?
포트와 인증서 SAN을 doctor로 맞추고, 루프백 테스트 경로와 프로덕션 SNI 경로를 일치시킨다.
비밀을 회전한 날 무엇을 보는가?
서명 실패의 단계적 증가, 특정 채널만의 실패, 재시도 큐 정체. 롤백 절차를 15분 안에 끝나는 런북으로 둔다.
강한 Webhook 위생은 Mac mini M4 게이트웨이를 프로덕션 기기로 다루는 일의 일부다. Apple Silicon은 암호를 싸게 만든다——검증을 건너뛸 핑계는 아니다. 네이티브 macOS에 자동화용 SSH와 비상 운영용 VNC를 얹는 것은 다른 데몬과 같은 운용이다. 홍콩·일본·한국·싱가포르·미국에서 전용 Mac mini M4를 렌탈하면 테넌트마다 폭발 반경을 나누고, 예측 가능한 네트워크는 공격처럼 보이는 거짓 재시도를 줄인다. 서명이 안정되면 요금(gagyok)으로 수평 확장하고, 불안정하면 방화벽을 넓히기 전에 도움말(doummal)을 읽는다.