상한 없는 인바운드 본문은 LLM 게이트웨이에 가장 저렷한 지갑 거부 공격입니다. 수 메가바이트짜리 JSON 하나가 JSON Schema 검증 계층이 거절하기 전에 토크나이저 작업을 거대하게 소모합니다. 2026년에는 OpenClaw 게이트웨이 가장자리에서 최대 HTTP 엔티티 크기, JSON 파싱 깊이 상한, 도구별 표준 출력 상한을 명시하고 검증기가 이미 읽는 매니페스트와 같은 숫자로 묶으세요. 잘못 설정된 클라이언트는 하나의 정책 면만 보면 됩니다. 서킷 브레이커 임계값과 결합하면 반복 위반은 CPU를 몰래 포화시키는 대신 보호적 백오프로 이어집니다.
대화 레인에서는 기본적으로 인바운드 JSON을 4 MiB까지, 트리는 도구가 더 깊은 구조를 선언하지 않는 한 깊이 32, 파일 읽기 미리보기는 명시적 상향이 없으면 512 KiB에서 자르고, 리허설 비용은 Apple Silicon Mac mini 렌탈로 하루 약 16.9달러 전후를 가정합니다.
게이트웨이가 일찍 거절해야 하는 이유
다층 방어는 TLS 종료, 리버스 프록시, 애플리케이션 파서를 쌓지만 거대 본문이 토크나이저에 도착하는 순간 전력과 지연 예산은 이미 지출되었습니다. 소켓 계층에서 보수적인 MaxBytesReader 패턴(또는 동등 장치)으로 바이트 상한을 강제하면 공격자는 왕복 비용만 치르고 모델 슬롯을 차지하지 못합니다. 거절 사유는 상류 HTTP 502 잡음과 별도 계열로 추적해 Grafana 타일을 읽기 쉽게 유지합니다.
사후 검토에서는 “어디에서 막혔는지” 설명할 수 있어야 신뢰가 좌우됩니다. 게이트웨이에서 기계가 읽을 수 있는 코드를 고정하면 브레이커와 속도 제어까지 한 줄로 연결됩니다. 로그 검색에서는 짧은 시간이라도 통계가 안정되도록 스파이크와 베이스라인을 분리합니다.
HTTP 본문과 Content-Length 상한
Content-Length가 정책을 초과하면 나머지를 스트리밍하기 전에 요청을 끝내세요. 길이 없는 청크 전송에서는 링 버퍼에 쌓으며 기본 대화 레인에서는 4,194,304바이트에 도달하면 중단합니다. 별도 인증과 큐 깊이 메트릭으로 보호된 배치 수집 엔드포인트만 더 큰 허용치를 문서화합니다.
| 레인 | 최대 본문 | 근거 |
|---|---|---|
| 대화 채팅 | 4 MiB | 풍부한 도구 JSON은 허용하되 아카이브 덤프는 거부 |
| 자동화 webhook | 16 MiB | 관리자 승인 배치 이벤트 |
| 긴급 운영자 재정의 | 64 MiB | 서명 헤더와 감사 로그 필요 |
프록시 체인에서 상류가 이미 본문을 버렸더라도 게이트웨이에서 이중 검증하면 브레이크포인트가 분명해집니다. 스테이징과 프로덕션 값이 어긋나면 “검증에선 통과” 같은 불신이 생기므로 환경 변수 이름과 Terraform 기본값을 한 장에 모읍니다.
JSON 깊이·배열 길이·키 수
파서는 버전 매니페스트에 도구별 면제가 없으면 깊이 32를 넘는 트리나 노드당 4096 슬롯을 넘는 배열을 거절해야 합니다. 깊이 검사에는 객체당 서로 다른 키 수 상한(256)을 더해 설정 블록을 가장한 프로토타입 오염형 가젯을 밟기 어렵게 합니다.
{
"error": "parse_depth_exceeded",
"limit_depth": 32,
"observed_depth": 41,
"request_id": "b7f2…",
"hint": "설정 배열을 평탄화하거나 여러 도구 호출로 나누세요"
}
도구 소유자에게는 매니페스트 변경 요청을 별 워크플로로 받고 게이트웨이 기본값보다 느슨해지는 경우에만 semver를 올립니다. 그렇지 않으면 “오늘만 느슨하게” 설정이 브랜치에 남습니다.
도구 출력 자르기와 스트리밍
파일 시스템과 셸 도구는 조짐 없이 메가바이트 단위 표준 출력을 뿜습니다. 서브프로세스 파이프를 읽기 래퍼로 감싸고 계약이 large_output:true를 선언하지 않는 한 524,288바이트를 넘기면 폐기 모드로 전환합니다. 모델 토큰을 상류로 스트리밍할 때는 TCP 창 백프레셔를 존중하고 8 GiB Mac mini 게이트웨이에서는 워커당 내부 큐 합이 2 MiB RAM을 넘으면 도구 읽기를 일시 중지합니다.
오래 도는 백그라운드 도구는 진행 이벤트를 촘촘히 반환해 모델이 무한 대기하지 않게 하고 하트비트를 설계합니다. 진행 JSON에는 상한과 카운터를 넣어 어디에서 막혔는지 한눈에 보이게 합니다.
413과 400 구조화 오류 본문
안정적인 기계 가독 error 코드를 쓰고 정책 상한을 에코합니다. 공격자가 조종하는 슬라이스는 200 UTF-8 문자를 넘겨 반환하지 마세요. 과부하가 원인이고 남용이 아닐 때만 retry_after_ms를 붙입니다.
스키마 매니페스트와 정렬
게이트웨이가 JSON Schema로 인자를 검증한다면 maxLength와 maxItems는 전송 계층 상한보다 엄격하게 유지합니다. 그러면 검증은 빠르게 실패하면서 의미는 전달되고 클라이언트는 불투명한 소켓 리셋 대신 스키마 오류를 봅니다.
macOS 버퍼 기본값과 LaunchAgent
launchd가 물려 받는 파이프 크기는 Linux 컨테이너와 다릅니다. 베어메탈 macOS에서 리허설하면 표준 출력이 고루틴 배출보다 빨리 차는 장면이 보이고 본전에 가기 전 솔직하게 고수위를 조정합니다.
남용 패턴과 인접 속도 제어
본문 공격은 단일 거대 POST보다 상한 직전을 수천 번 보내는 편이 현실적입니다. rejection_rate_413와 rejection_rate_parse를 1차 메트릭으로 추적하고 5분당 5%를 경고, 문제 API 키에 자동으로 가벼운 토큰 스로틀을 거는 20% 규칙을 둡니다. 테넌트별 크레딧 잔액과 결합해 마케팅 테넌트가 플랫폼 운영을 굶기지 않게 합니다.
포렌식에는 샘플을 남겨도 거절 본문 전체는 저장하지 않습니다. 애플리케이션 로그와 격리된 키 아래 SHA-256과 앞 1,024바이트만 보관하고 법적 보관이 없으면 72시간 후 만료합니다.
리미터 결정용 SLO 표
| 신호 | 목표 | 조치 |
|---|---|---|
| 파싱 시간 중앙값 | M4에서 16 KiB JSON이 3 ms 미만 | 15분 연속 6 ms 초과 시 알림 |
| 413 비율 | 정상 시 0.3% 미만 | 배포 후 2% 초과 시 페이지 |
| 잘린 도구 행 | 도구 호출의 1% 미만 | 소유자에게 페이지링 요청 |
롤아웃 순서
- 섀도우: 48시간은 거절하지 않고 “거절했을 건수”만 기록합니다.
- 카나리아: 내부 워크스페이스부터 강제합니다.
- 점진: 주간 릴리스 열차로 대화 본문 상한을 8 MiB에서 4 MiB로 내립니다.
- 사후 검증: Prometheus 스크랩 차분과 CPU 베이스라인을 비교합니다.
숫자 기본값은 환경 변수와 함께 문서화해 Terraform과 LaunchAgent plist가 동기화됩니다. “스테이지만 허용” 상태가 계속되면 신뢰가 깎입니다.
WASM과 네이티브 파서 경로
JSON을 WASM으로 오프로드하거나 SIMD 라이브러리를 쓰는 팀이라도 게이트웨이 전체 상한은 가속기가 약속하는 피크보다 낮게 둡니다. Apple Silicon은 여름에 서멜이 85°C를 넘으면 긴 AVX 무거운 커널에서 스로틀합니다.
유니버설 바이너리를 arm64로 배포하면 콜드와 웜 모두 벤치마크하세요. 배포 직후 첫 요청은 명령 캐시 미스로 최대 40%까지 튈 수 있어 대시보드에 요동을 드러내지 않으면 상한 조이기와 숨은 회귀가 겹칩니다.
버전이 있는 클라이언트 계약
시맨틱 버전 게이트웨이와 함께 증가하는 기계 가독 /gateway/policy 문서로 상한을 노출해 Flutter·Electron·Swift 클라이언트가 상수 하드코딩 없이 협상하게 합니다. max_tool_output_preview_bytes를 넣으면 UX가 도구 출력 표를 언제 페이지할지 알 수 있습니다.
Redis 지원 할당량 카운터
여러 워커가 할당량을 강제하면 롤링 카운터를 Redis에 모으고 버스트 탐지에는 5초 TTL, 지속 남용에는 매시 해시를 씁니다. Lua로 증가와 검사를 원자적으로 만들지 않으면 이상한 429 폭풍이 납니다.
메모리 압력에서 할당량 키가 떨어져도 인증 토큰보다 나으면 그 트레이드오프를 런북에 적습니다. 페일오버 훈련에서 일시적으로 느슨해질 수 있음을 예상합니다.
OpenAI나 Anthropic이 하룻밤에 컨텍스트를 넓혀도 게이트웨이 천장을 맹신해 올리지 마세요. 토크나이저 예산을 재평가하고 관측 패널이 녹색으로 돌아올 때까지 관찰합니다.
런북에는 이 정책 표·Grafana 보드 ID·현재 태그를 직접 링크해 신규 온콜이 채팅 로그를 헤매지 않게 합니다. 기본값이 움직일 때마다 갱신합니다.
이 규율이 멀티 리전 게이트웨이를 주 단위로 맞춥니다.
지속 운영 검토와 장애 학습
분기마다 “상한 변경이 매출이나 지원 티켓에 준 영향”을 검토하고 임계값을 내리거나 올린 이유를 증거와 함께 남깁니다. 대시보드는 팀을 가로질러 같은 그래프 정의를 공유하고 색 의미를 고정합니다.
사후에는 “413가 늘었지만 과금 비용은 내렸다” 같은 인과를 한 장으로 묶어 경영·개발·지원이 같은 어휘로 말하게 합니다. 클라우드 Mac mini 리허설 기록도 첨부해 macOS 특유 동작을 의심해야 할 사례를 명시합니다.
MacHTML에서 Apple Silicon Mac mini를 빌리면 TLS 스택·디코더·파이프 의미가 이미 macOS에서 게이트웨이를 돌리는 고객과 맞춰지고 Linux만 가정한 잘못된 버퍼 추정을 피합니다. 저소음 냉각과 예측 가능한 단일 스레드 성능은 413 폭풍 속에서 파서 마이크로초를 재는 상황에도 의미가 있습니다. 온프레 대비 하루 약 16.9달러 운영비로 탄력 있습니다.
탄력 있는 렌탈은 본전 상한 프로필을 격리 테넌트에 복제해 공유 스테이징을 위험에 두지 않고 남용 본문을 버스트하는 레드팀 연습을 할 수 있게 합니다.
실제 macOS에서 게이트웨이 상한 부하 테스트
클라우드 Mac mini를 준비해 파서 상한·LaunchAgent 로그·TLS 동작을 본전에 가깝게 확인한 뒤 정책을 조입니다.