Slack Interactive Block Kit을 활용한 사내 결재 모달 봇 구축

이메일과 사내망을 오가던 번거로운 결재 과정을 슬랙(Slack) 인터랙티브 모달 기반의 원클릭 자동화 시스템으로 탈바꿈시키는 실전 구축 가이드

이지웍스랩 AI리서치 · 2026-08-16 · B2B 업무 자동화 · 읽는 데 9분

현대 기업의 수많은 협업 툴 중 단연 중심에 있는 슬랙(Slack)은 단순한 메신저를 넘어 강력한 업무 플랫폼으로 진화했습니다. 특히 Block Kit Builder를 활용하면 복잡한 프론트엔드 개발 없이도 직관적이고 인터랙티브한 사내 결재 UI를 구현할 수 있습니다. 본 아티클에서는 개발 실무자가 즉시 적용할 수 있는 Slack 모달 기반 결재 봇 구축 아키텍처와 실제 동작하는 Python 코드를 전격 공개합니다.

1. 왜 슬랙 블록 킷(Block Kit) 기반 결재 봇인가?

기존 사내 그룹웨어는 결재를 올리기 위해 별도의 웹사이트에 로그인하고, 양식을 찾고, 결재선을 지정해야 하는 극심한 파편화(Fragmentation) 문제를 안고 있습니다. 이로 인해 임직원들은 단순 지출 품의나 휴가 신청조차 피로감을 느끼며 업무 흐름이 끊기게 됩니다.

슬랙 인터랙티브 모달을 도입하면 사용자가 익숙한 메신저 환경을 벗어나지 않고 명령어나 단축키 하나로 품의서를 작성할 수 있습니다. 입력된 즉시 지정된 결재권자의 슬랙 DM으로 인터랙티브 버튼(승인/반려)이 포함된 메시지가 전송되어, 의사결정 속도가 수십 배 이상 빨라집니다.

2. FastAPI와 Block Kit을 결합한 백엔드 구현

슬랙으로부터 들어오는 이벤트를 수신하고 모달을 띄우기 위해서는 안정적인 웹훅(Webhook) 서버가 필요합니다. Python의 비동기 웹 프레임워크인 FastAPI를 사용하여 슬랙 인터랙션 요청을 처리하는 파이프라인을 구축해 보겠습니다.

아래 코드는 슬랙 슬래시 커맨드 입력 시 모달을 오픈하고, 사용자가 모달에서 제출한 데이터를 받아 처리하는 전체 흐름을 담고 있습니다.

import hmac
import hashlib
import time
from fastapi import FastAPI, Request, HTTPException
import requests

app = FastAPI()
SLACK_SIGNING_SECRET = "your_slack_signing_secret"
SLACK_BOT_TOKEN = "xoxb-your-slack-bot-token"

def verify_slack_signature(request_body: bytes, timestamp: str, signature: str) -> bool:
    if abs(time.time() - int(timestamp)) > 605:
        return False
    sig_basestring = f"v0:{timestamp}:{request_body.decode('utf-8')}"
    my_signature = 'v0=' + hmac.new(
        SLACK_SIGNING_SECRET.encode(),
        sig_basestring.encode(),
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(my_signature, signature)

@app.post("/slack/commands")
async def handle_slash_command(request: Request):
    form_data = await request.form()
    trigger_id = form_data.get("trigger_id")
    
    # Block Kit 모달 페이로드 정의
    modal_view = {
        "type": "modal",
        "callback_id": "approval_modal",
        "title": {"type": "plain_text", "text": "사내 결재 요청"},
        "submit": {"type": "plain_text", "text": "제출"},
        "blocks": [
            {
                "type": "input",
                "block_id": "title_block",
                "element": {"type": "plain_text_input", "action_id": "title_input"},
                "label": {"type": "plain_text", "text": "결재 제목"}
            },
            {
                "type": "input",
                "block_id": "amount_block",
                "element": {"type": "plain_text_input", "action_id": "amount_input"},
                "label": {"type": "plain_text", "text": "금액 (원)"}
            }
        ]
    }
    
    headers = {"Authorization": f"Bearer {SLACK_BOT_TOKEN}"}
    res = requests.post(
        "https://slack.com/api/views.open",
        json={"trigger_id": trigger_id, "view": modal_view},
        headers=headers
    )
    return {"status": "success"}

3. 전통적 방식과의 비교 및 기대 효과

기존의 인트라넷 기반 결재 시스템과 슬랙 Block Kit 기반 자동화 봇을 비교했을 때, 유지보수 용이성과 사용자 경험(UX) 측면에서 압도적인 우위를 가집니다.

비교 항목전통적 그룹웨어슬랙 자동화 봇
접근성PC 웹 또는 별도 사내 앱 필수모바일/PC 슬랙 앱에서 즉시 접근
알림 지연이메일 알림 누락 빈번슬랙 실시간 푸시 및 DM 연동
개발/확장성구형 레거시 소스 수정 어려움API 및 웹훅 기반 손쉬운 확장

자주 막히는 지점

슬랙 모달 제출 시 'dispatch_failed' 에러가 발생하며 응답하지 않는 경우

원인: 슬랙 API는 모달 오픈 또는 제출 요청 후 3초 이내에 200 OK 응답을 요구합니다. 무거운 외부 DB 작업이 동기적으로 처리될 경우 타임아웃이 발생합니다.

해결: 웹훅 엔드포인트에서는 즉시 빈 200 OK 응답을 반환하고, 실제 데이터 처리 및 슬랙 메시지 전송 로직은 Celery나 BackgroundTasks를 활용해 비동기(Asynchronous)로 분리해야 합니다.

외부 사용자가 위조된 페이로드를 보내어 가짜 결재가 승인되는 보안 이슈

원인: 슬랙 요청에 대한 서명 검증(Signing Secret Verification) 로직이 누락되어 누구나 웹훅 URL로 POST 요청을 보낼 수 있는 상태입니다.

해결: 모든 인바운드 요청 헤더의 `X-Slack-Signature`와 `X-Slack-Request-Timestamp`를 추출하여 HMAC SHA256 서명 검증 코드를 미들웨어 단계에서 반드시 실행하도록 수정합니다.

핵심 요약

자주 묻는 질문

슬랙 무료 플랜에서도 Block Kit 모달을 사용할 수 있나요?

네, 슬랙의 커스텀 앱(Custom App) 생성 기능을 활용하는 봇 빌드 방식은 무료 플랜(Free Plan)에서도 슬래시 커맨드와 모달 기능을 정상적으로 지원합니다.

결재선이 여러 단계(팀장 -> 임원 -> 대표)일 경우 어떻게 처리하나요?

모달 제출 시 수신된 데이터를 DB에 저장할 때 결재선 순번(step_index)을 부여하고, 첫 번째 결재자가 '승인' 버튼을 누를 때 다음 결재자의 슬랙 ID를 조회하여 인터랙티브 메시지를 동적으로 발송하는 방식으로 구현할 수 있습니다.

모달 입력값에 대한 유효성 검증(Validation)은 어떻게 하나요?

슬랙 모달의 제출(submit) 이벤트 발생 시 백엔드에서 값을 받아 유효성 검증을 수행할 수 있으며, 에러가 발생한 경우 슬랙 errors 응답 포맷에 맞춰 에러 메시지를 반환하면 모달 창 내 특정 필드 아래에 에러 텍스트를 노출할 수 있습니다.

전체 아티클 목록