💬

Slack Socket Mode는 어떻게 동작하나?

Webhook 없이 아웃바운드 WebSocket으로 이벤트 수신

Slack은 원래 Webhook(Event Subscriptions)으로 이벤트를 전달했지만, 공개 URL이 필요하다는 단점이 있었습니다. Socket Mode는 Bot 서버가 Slack에 아웃바운드 WebSocket 연결을 먼저 수립하고, Slack이 그 연결을 통해 이벤트를 push하는 방식입니다. 공개 URL, SSL 인증서, 방화벽 설정이 모두 불필요합니다. 내부적으로 apps.connections.open API로 WebSocket URL을 받아 연결합니다.

구조 다이어그램

연결 수립 단계
🤖
내 Bot 서버
방화벽 뒤 / 로컬
① apps.connections.open wss://... URL 수신
② WS 연결
→ 아웃바운드
💬
Slack
이벤트 + Web API
이벤트 처리 단계
🤖
내 Bot 서버
④ 이벤트 처리
③ event push (WS)
⑤ acknowledge (3초 내)
⑥ Web API 응답
👤
사용자 이벤트
메시지, 슬래시 커맨드 등
핵심: Bot이 <strong>아웃바운드 WebSocket</strong>을 열기 때문에 공개 URL / ngrok 불필요
Socket Mode vs Webhook 비교
Socket Mode
Webhook (Event API)
공개 URL 불필요
공개 URL 필수
아웃바운드 WebSocket
인바운드 HTTP POST
로컬 개발 바로 가능
ngrok 등 터널 필요
연결 유지 필요
Stateless

동작 흐름

1

Bot이 apps.connections.open API 호출 → 임시 WebSocket URL 수신

2

Bot이 해당 URL로 WebSocket 연결 수립 (아웃바운드)

3

Slack에서 이벤트 발생 (메시지, 슬래시 커맨드, 인터랙션 등)

4

Slack이 WebSocket으로 이벤트 payload를 Bot에 push

5

Bot이 이벤트를 처리하고, acknowledge 응답 전송 (3초 내)

6

필요 시 Slack Web API로 메시지 전송/업데이트

장점

  • 공개 URL 불필요
  • 방화벽/NAT 뒤에서 동작
  • ngrok 없이 로컬 개발 가능
  • SSL 인증서 불필요

단점

  • 연결 유지 필요 (30초 ping)
  • 연결 끊김 시 이벤트 유실 가능
  • 대규모 앱에는 부적합 (연결 수 제한)
  • Webhook 대비 디버깅 도구 부족

사용 사례

사내 Slack Bot 개발 방화벽 뒤 Bot 운영 로컬 개발 환경에서 Bot 테스트 보안이 중요한 Bot (공개 URL 노출 불가)