---
tags: [robeing, rb8001, slack, signing-secret, recovery, worklog]
---

# rb8001 Slack Signing Secret 오값 복구 및 실유입 검증

**날짜**: 2026-03-17  
**작성자**: Codex

## 왜

- 23서버 게이트를 거쳐 24서버 `rb8001`까지 Slack 이벤트가 도달했지만, `rb8001`에서 `Invalid Slack signature`가 반복되어 로빙이 응답하지 못했습니다.
- 로그 기준 직접 증상은 `2026-03-17 22:23:41`, `22:23:42`, `22:24:43`, `22:37:30`, `22:37:31`, `22:37:36`, `22:37:37`의 `Invalid Slack signature`였습니다.

## 무엇을 확인했는가

1. 24서버 `rb8001` 실행 환경에서 `SLACK_SIGNING_SECRET`, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `JWT_SECRET_KEY`, `SERVICE_API_KEY`가 비어 있던 상태를 확인했습니다.
2. `rb8001`의 `docker-compose.yml`이 `env_file` 값을 쓰는 동시에 `${...}` 셸 치환으로 같은 키를 다시 주입하고 있었고, 호스트 셸에 값이 없어서 빈 문자열로 덮어쓰고 있음을 확인했습니다.
3. Slack 앱 `A092HLQA1NW`의 실제 `Signing Secret`은 `995cdf...af22`인데, 당시 `rb8001`에는 다른 값이 들어가 있음을 확인했습니다.
4. 문서와 코드 기준 정상 경로는 `Slack -> 23서버 게이트(/gateway/slack/events) -> 24서버 rb8001(/api/slack/events)`이며, 이번 장애의 직접 원인은 게이트 이전이 아니라 24서버 런타임 시크릿 오값이었습니다.

## 어떻게 복구했는가

1. `/home/admin/workspace-config/secrets.env`에 누락된 Slack/JWT/API 키를 SSOT로 복구했습니다.
2. `rb8001/docker-compose.yml`에서 `${SLACK_*}`, `${JWT_SECRET_KEY}` 등 셸 치환으로 SSOT 값을 덮어쓰던 항목을 제거해 `env_file`만 단일 출처로 사용하도록 정리했습니다.
3. `SLACK_SIGNING_SECRET`를 실제 Slack 앱 값으로 교체했습니다.
4. `rb8001` 컨테이너를 재생성했습니다.

## 검증

1. `rb8001` 컨테이너가 `healthy` 상태로 기동했습니다.
2. 컨테이너 환경에 `SLACK_SIGNING_SECRET`, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `JWT_SECRET_KEY`, `SERVICE_API_KEY`가 정상 주입됨을 확인했습니다.
3. 현재 `SLACK_SIGNING_SECRET`으로 서명한 `POST /api/slack/events` 테스트가 `200`과 challenge 응답을 반환했습니다.
4. 실유입 로그에서 `2026-03-17 22:49:58` 시점 `POST /api/slack/events HTTP/1.1" 200 OK`, `Event: message from U09BQSN72UT: 로빙?`, `Scheduling async processing`가 기록되어 실제 Slack 이벤트가 서명 단계 통과 후 처리되기 시작했음을 확인했습니다.

## 원인값

- 24서버 `rb8001`의 `SLACK_SIGNING_SECRET`가 운영 Slack 앱의 실제 값과 달랐습니다.
- 동시에 `docker-compose.yml`의 `${...}` 셸 치환이 `env_file` 기반 SSOT를 빈 문자열로 덮어쓰는 구조여서, 복구 이후에도 재발 가능성이 있었습니다.

## 재발 방지

1. 운영 시크릿은 `/home/admin/workspace-config/secrets.env`만 SSOT로 사용합니다.
2. `docker-compose.yml`에서 같은 키를 `${...}`로 다시 주입하지 않습니다.
3. Slack 앱 시크릿 교체 시 `workspace-config/secrets.env`와 실행 컨테이너 환경을 함께 검증합니다.

## 관련 문서

- [Gateway Slack Events 서명 불일치 및 500 매핑 이슈 정리](../troubleshooting/260227_gateway_slack_events_signature_mismatch_and_500_mapping.md)
