2026년 OpenClaw 페이슈·Lark·Microsoft Teams 연동: ZoneMac 원격 물리 Mac 게이트웨이에서 재현 가능한 인증·장연결·기업 이그레스 배포 Runbook(openclaw.json 조각 + 401/429 FAQ)
중국·글로벌이 나뉜 협업 환경에서 OpenClaw를 페이슈(飞书)·국제 Lark·Microsoft Teams에 붙일 때, 조건부 액세스·만료된 토큰·프록시 유휴 절단이 겹치면 운영은 며칠째 원인을 못 찾습니다. 이 런북은 누가 어디서 깨지는지, 이그레스·신뢰 종료 비교 표, ZoneMac식 원격 물리 Mac 기준 7단계, 설명용 openclaw.json 조각, 인용 가능한 수치, 401/429 FAQ를 한 흐름으로 묶습니다. 장시간 게이트웨이 안정화 관점은 2026년 OpenClaw 장시간 운용을 위한 Mac mini 안정성 최적화 가이드와 함께 보세요.
0. 서론: 세 플랫폼, 세 가지 신뢰 경계
헤드리스 원격 Mac에 OpenClaw를 두면 페이슈와 Lark는 안정적인 콜백 검증과 올바른 테넌트에 묶인 앱 자격 증명을 기대하고, Teams와 Microsoft Graph는 OAuth2·국가별 클라우드 엔드포인트·공격적인 스로틀을 추가합니다. 한편 보안팀은 이그레스 허용 목록과 TLS 검사 프록시를 배포하는데, JWT 만료·SNAT IP·프록시 유휴 타이머를 상관하지 않으면 이것이 곧 무작위 401의 날처럼 보입니다.
이 글은 뚜껑이 닫히지 않는 개발자 노트북이 아니라, 실제 사용자가 대화하는 리전에 가까운 ZoneMac급 전용 물리 Mac에 작은 HA 쌍의 게이트웨이 프로세스를 두는 전제입니다. 동일 주제의 영어판은 OpenClaw Feishu / Lark / Teams gateway runbook (English)에서 확인할 수 있습니다.
1. 기업에서 실제로 부딪히는 제약
- 분리된 테넌트 정체성: 국내 페이슈·국제 Lark·Teams용 Entra ID는 같은 앱 디렉터리를 거의 공유하지 않습니다. 스테이징에서 되던 자격 증명이 프로덕션에서 authority URL과 검증 시크릿이 어긋나 불투명한 401을 냅니다.
- 이그레스 허용 목록과 SNAT 드리프트: 벤더는 웹훅이나 요금 정책을 위해 아웃바운드 IP를 고정하길 원합니다. 이그레스가 순환하는 원격 Mac 풀은 검증 실패와 중복 이벤트 재시도를 동시에 만듭니다.
- 장수명 세션 vs 프록시 유휴 절단: 봇 SDK는 WebSocket이나 청크 HTTP를 길게 유지하고, 기업 포워드 프록시는 대략 5~15분 안쪽에서 조용한 흐름을 끊는 경우가 많습니다. keepalive와 PAC 인지 라우팅을 맞추지 않으면 재연결 폭풍이 납니다.
- 감사와 최소 권한: 플랫폼마다 원하는 스코프가 다릅니다—Graph의
ChannelMessage.Read.All, Lark 메시지 계열, 페이슈 이벤트 구독 등. 과도한 토큰은 보안 심사에서 걸리고, 부족한 토큰은 런타임에 403/404 잡음을 냅니다.
2. 의사결정 매트릭스: 신뢰를 어디서 끊을까
정지 Mac 게이트웨이 하나로 갈지, 리전별로 봇을 쪼갤지 논쟁할 때 쓰는 표입니다.
| 차원 | 단일 원격 Mac 게이트웨이 | 리전별 분리 봇 |
|---|---|---|
| 이그레스 IP 안정성 | NetOps 티켓 한 장의 SNAT | 허용 목록 여러 개·드리프트 위험 |
| 장연결 | 유선 호스트에서 keepalive 조정이 쉬움 | 움직이는 부품 증가·일관된 PAC 필요 |
| 침해 시 블라스트 반경 | 모든 채널이 프로세스 메모리를 공유 | 테넌트별 시크릿이 더 작음 |
| 429·쿼터 격리 | 시끄러운 루프 하나가 나머지를 굶길 수 있음 | 앱 등록 분리 |
| 운영 복잡도 | launchd 유닛 하나·로그 한 스트림 | N배 배포 파이프라인 |
3. 7단계 재현 런북(ZoneMac 원격 물리 Mac)
- 엔드포인트 인벤토리 고정:
*.feishu.cn,open.feishu.cn, 샤드에 맞는 Lark 오픈플랫폼 호스트,login.microsoftonline.com,graph.microsoft.com(또는 정부·GCCH 동급), Teams 봇 커넥터 URL을 나열하고 테스트 명령과 함께 변경 티켓 한 장으로 제출합니다. - Mac을 유선 전원에 고정: 게이트웨이 사용자에 대해 절전을 끄고, NTP를 강제하고, NAT 이후 벤더가 볼 이그레스 IP를 기록합니다.
- OpenClaw를 루프백에 바인딩: TLS는 nginx/Envoy 또는 Zero Trust 터널에서 종료하고
127.0.0.1:18789(또는 선택 포트)로 넘겨 스캐너가 원시 리스너에 닿지 않게 합니다. - GUI 없이 시크릿 주입: SecretRef, launchd
EnvironmentVariables, Keychain 기반 스크립트를 사용하고—openclaw.json옆에 테넌트 앱 시크릿을 평문 커밋하지 마세요. - 프로덕션 경로로 벤더 챌린지 완료: 페이슈·Lark 이벤트 URL과 Teams 메시징 엔드포인트를 사용자가 실제로 타는 DNS·인증서·프록시 체인과 동일하게 등록합니다.
- 인증과 스로틀 스모크: OpenClaw가 쓰는 것과 동일한 토큰 클래스로 Graph 채널 읽기 등을 스크립트하고, Lark·페이슈 테스트 이벤트로 서명 헤더를 확인합니다.
- 관측과 게임데이: 401·403·429와 재연결 사유 카운터를 보내고, 베이스라인 후 원격 물리 Mac OpenClaw 게이트웨이의 Prometheus·Grafana 메트릭을 참고해 로컬 프록시를 끊고 SLO 창 안에 자동 복구되는지 검증합니다.
4. openclaw.json 조각(설명용)
플레이스홀더 키는 벤더 문서로 바꾸세요. 구조는 한 호스트에 채널을 나란히 두는 방식만 보여 줍니다.
{
"gateway": {
"bind": "127.0.0.1:18789",
"publicBaseUrl": "https://openclaw-gateway.corp.example",
"logFormat": "jsonl"
},
"channels": {
"feishu": {
"appId": "${FEISHU_APP_ID}",
"appSecret": "${FEISHU_APP_SECRET}",
"encryptKey": "${FEISHU_ENCRYPT_KEY}",
"verificationToken": "${FEISHU_VERIFICATION_TOKEN}"
},
"lark": {
"appId": "${LARK_APP_ID}",
"appSecret": "${LARK_APP_SECRET}",
"encryptKey": "${LARK_ENCRYPT_KEY}"
},
"teams": {
"tenantId": "${ENTRA_TENANT_ID}",
"clientId": "${TEAMS_BOT_APP_ID}",
"clientSecret": "${TEAMS_BOT_SECRET}",
"graphAudience": "https://graph.microsoft.com/"
}
},
"httpClient": {
"proxyUrl": "${CORP_HTTPS_PROXY}",
"respectRetryAfter": true,
"maxConcurrentGraphRequests": 4
}
}
보안팀이 전역 HTTP_PROXY를 금지하면 OpenClaw가 지원하는 경우 채널별 프록시로 나누거나, Mac과 같은 리전의 명시적 포워드 프록시 VM으로 모읍니다.
4.1 localhost로 전달하는 nginx TLS 전면(스케치)
server {
listen 443 ssl;
server_name openclaw-gateway.corp.example;
ssl_certificate /etc/ssl/internal/fullchain.pem;
ssl_certificate_key /etc/ssl/internal/privkey.pem;
location /feishu/events {
proxy_pass http://127.0.0.1:18789/feishu/events;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s;
}
location /teams/api/messages {
proxy_pass http://127.0.0.1:18789/teams/api/messages;
proxy_set_header Host $host;
proxy_read_timeout 120s;
}
}
5. 인용 가능한 수치·체크리스트
- JWT 시계 오차: Entra 발급 토큰은 Mac과 권위 있는 시각 간 대략 ±300초 스큐를 허용한다고 설계 문서에 적어두면, 그 이상이면 비밀이 맞아도 Graph가 401을 냅니다.
- 429 처리: Graph가 429를 줄 때
Retry-After를 존중하고, 팬아웃 부하는 지수 백오프 기준을 보통 1~2초 부근에서 시작해 전체 지터를 주는 패턴이 흔합니다. - 프록시 유휴 창: 많은 기업 포워드 프록시가 조용한 TLS 흐름을 300~900초 사이에서 끊습니다. 캡처에서 관측한 최소 유휴 타임아웃보다 훨씬 짧게 keepalive ping을 쏘세요.
6. FAQ: HTTP 401과 429 트리아지
6.1 Microsoft Graph 401
토큰 요청 URL의 테넌트 ID, 봇이 쓰는 국가별 클라우드 호스트, 스코프 변경 후 관리자 동의 재실행, 서비스 주체에 대한 조건부 액세스 예외를 확인합니다. 클레임의 iat/exp를 Mac에서 sntp -sS time.apple.com와 대조하세요.
6.2 Graph 또는 오픈 플랫폼 429
병렬 채널 동기 작업을 줄이고, 디렉터리 ID는 캐시하며, 웹훅이 있는 곳에서는 촘촘한 폴링을 피하고 읽기 위주 크론을 분산합니다. 하나의 앱 등록을 여러 제품이 공유하면 마케팅 실험이 CI 알림을 굶길 수 있으니 Teams 트래픽을 격리하는 방안을 검토하세요.
6.3 페이슈·Lark 검증 실패
암호화 키와 검증 토큰을 함께 순환하고, 챌린지 에코는 JSON 파싱 전 원시 바디 바이트로 처리합니다. 개발자 콘솔에 등록한 콜백 URL이 공개 호스트의 TLS SAN과 일치하는지—후행 슬래시 규율까지—다시 확인하세요.
7. 이 게이트웨이에 Mac mini급 하드웨어가 맞는 이유
macOS는 launchd로 안정적인 재시작, 봇 시크릿용 Keychain 연동, Apple 플랫폼 팀이 이미 익숙한 TLS·프록시 디버깅용 Unix 툴체인을 제공합니다. Apple Silicon Mac mini는 유휴 전력이 대략 수 W 수준인 경우가 많으면서도, 동시 WebSocket 팬아웃과 가벼운 Graph 배치를 노트북 부하 곡선 없이 감당합니다.
Gatekeeper, 시스템 무결성 보호(SIP), FileVault는 단일 프로세스가 페이슈·Lark·Teams 자격 증명을 모두 쥘 때, 공유 하이퍼바이저 위의 임시 Windows VM보다 무인 게이트웨이 리스크를 낮추는 데 유리합니다.
직접 미니를 조달해 랙에 올리기 전에, Mac mini M4 같은 전용 원격 노드로 이 OpenClaw 자리부터 고정해 보세요. ZoneMac에서 베어메탈 macOS를 빌리면 허용 목록·토큰·관측 베이스라인을 첫날부터 프로덕션과 맞출 수 있습니다.
페이슈·Lark·Teams용 정지 게이트웨이 Mac이 필요하신가요?
ZoneMac 클라우드 Mac mini는 예측 가능한 이그레스, 유선 친화 프로파일, OpenClaw와 관측 사이드카를 같은 호스트에 두기에 적합한 베어메탈 macOS를 제공합니다.