TuBrief
구독 채널
비디오
커뮤니티

Vercel 서버리스 환경 슬랙 봇 타임아웃 해결 가이드

TuBrief 편집팀
2026년 7월 21일
0
컴퓨터/소프트웨어

원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.

한국어EnglishEspañol中文العربيةहिन्दीDeutschFrançaisPortuguêsРусскийBahasa Indonesia日本語

관련 영상

Ship 26 NYC - 워크숍 - Vercel에 Slack 에이전트 빌드 및 배포하기26:29

Ship 26 NYC - 워크숍 - Vercel에 Slack 에이전트 빌드 및 배포하기

Vercel

커뮤니티의 다른 글

사내 시스템에 llm api 붙일 때 마주하는 현실적인 한계와 대응법

2026년 9월 13일

레거시 백엔드에 GPT-6 Astra 붙일 때 예산 승인과 보안 통과를 먼저 끝내는 법이 있습니다

2026년 9월 13일

에이전트끼리 대화하다 6천만 원 청구서가 나오는 이유

2026년 9월 13일

사내 RAG 벡터 검색에 Okta 권한 필터를 직접 거는 방법

2026년 9월 13일

브라우저 에이전트에게 내 구글 계정을 통째로 넘기면 안 되는 이유

2026년 9월 12일

Apple Won the AI Race

2026년 9월 12일

댓글 (0)

Log in to leave a comment

아직 작성된 글이 없습니다

© 2026 . All rights reserved.

TuBrief
구독 채널
비디오
커뮤니티
로그인

Vercel 서버리스 환경 슬랙 봇 타임아웃 해결 가이드

중소기업 1인 개발자와 주니어 백엔드 엔지니어라면 슬랙 봇과 LLM 에이전트를 연동할 때 겪는 타임아웃 문제를 잘 알 것이다. 슬랙 Events API는 요청을 받고 3초 안에 HTTP 200 OK를 요구하지만, OpenAI GPT-4o나 Anthropic Claude 3.5 Sonnet 같은 모델은 연산만으로 15초가 걸린다. 슬랙 서버는 이 지연을 에러로 판단해 이벤트를 최대 3회 이상 재전송한다. 동일한 프롬프트가 수차례 실행되면서 API 토큰 비용이 폭발하고 채널은 중복 답변으로 도배된다. 전통적인 서버리스는 응답을 반환하는 순간 프로세스를 종료하므로 응답 뒤에 비동기 연산을 붙일 수 없다. Vercel Fluid Compute 아키텍처와 백그라운드 태스크 API인 waitUntil, Next.js App Router의 after 함수를 사용하면 이 문제를 해결할 수 있다. 요청 수신 즉시 request.text로 원본 바디와 슬랙 서명 헤더를 추출한 뒤 서명 검증을 거쳐 url_verification 챌린지 값을 반환한다. 그 뒤 AI 에이전트 연산을 after 함수로 감싸고 100밀리초 이내에 200 OK를 슬랙에 보내면 3초 타임아웃 에러를 없애고 무한 재전송 루프를 막을 수 있다.

슬랙 서명 검증 실패와 403 에러 우회하기

Vercel에 배포된 봇이 403 Forbidden이나 401 Unauthorized를 뱉는 이유는 Next.js 표준 미들웨어가 실행되는 도중 원본 요청 바디의 바이트 스트림이 변형되기 때문이다. 슬랙은 모든 HTTP 요청 무결성을 보장하려고 HMAC-SHA256 기반 서명을 헤더에 넣고, 앱은 시크릿 키와 원본 바디를 조합해 해시를 다시 계산한다. JSON 파싱 과정에서 객체 키 순서가 바뀌거나 공백이 1바이트만 달라져도 해시값이 깨져 서명 검증이 실패한다. Next.js App Router 환경에서는 요청 수신 즉시 request.text 메서드를 호출해 UTF-8 원본 바디 문자열을 확보해야 한다. 이후 타이밍 공격을 막기 위해 Node.js 암호화 모듈의 crypto.timingSafeEqual 함수로 시그니처를 안전하게 비교한다.

프로젝트에 적용하는 구체적인 절차는 다음과 같다.

  1. 프로젝트 내에 lib/slack-crypto.ts 파일을 생성하고 원본 바디 문자열, x-slack-request-timestamp 헤더, x-slack-signature 헤더, 환경 변수에 저장된 SLACK_SIGNING_SECRET을 매개변수로 받는 검증 함수를 작성한다.
  2. 요청 시각과 현재 서버 시각의 차이가 300초를 넘는지 검사해 재전송 공격을 막는 로직을 추가한다.
  3. v0:timestamp:raw_body 형식의 베이스 스트링을 만든 뒤 HMAC-SHA256 해시를 계산하고 상숫값 비교를 수행해 서명 유효성을 판정한다.

이 구조를 도입하면 403 에러 발생률을 낮추고 보안 컴플라이언스 요구 조건을 충족할 수 있다.

외부 인메모리 저장소로 대화 세션 유지하기

Vercel 서버리스 함수는 요청마다 새로운 컨테이너 인스턴스에서 독립적으로 실행되고 종료되므로 글로벌 메모리 변수에 대화 히스토리를 저장하면 스케일아웃 시 즉시 날아간다. 슬랙 스레드 안에서 AI 에이전트와 주고받는 멀티턴 대화 맥락을 유지하고 동일 이벤트 중복 처리를 막으려면 외부에 분산된 인메모리 데이터베이스 연결이 필수적이다. 단일 프로세스 안의 메모리 셋은 수평 확장되는 여러 서버리스 인스턴스 간에 공유되지 않는다. Upstash Redis 같은 외부 저장소를 연동해 Redis 원자적 명령어인 SET NX를 이용하면 여러 서버리스 인스턴스가 동시에 같은 슬랙 이벤트를 받더라도 단 하나만 작업을 실행하도록 원자적 격리를 보장할 수 있다.

대화 세션을 안전하게 관리하는 3단계 구현 방법이다.

  1. Upstash Redis 클라이언트를 프로젝트에 설치하고 환경 변수에 REDIS_URL과 REDIS_TOKEN을 등록한다.
  2. 웹훅 수신 직후 redis.set 명령어에 nx: true와 ex: 600 옵션을 주어 10분 동안 유지되는 이벤트 ID 기반 멱등성 클레임 함수를 작성한다.
  3. 슬랙 채널과 스레드 타임스탬프를 조합한 키로 Redis 리스트 구조를 만들고 redis.pipeline을 통해 메시지 추가와 24시간 자동 만료 TTL 설정을 원자적으로 처리한다.

이 방식을 통해 동일 메시지 중복 처리 비용을 원천 차단하고 대화 컨텍스트를 안정적으로 보존한다.

프리뷰 배포와 슬랙 테스트 워크스페이스 분리 자동화

단일 슬랙 개발자 앱을 프로덕션과 프리뷰 배포 환경이 함께 쓰면 CI/CD 푸시마다 이벤트 구독 웹훅 URL이 덮어씌워져 프로덕션 봇이 멈춘다. 환경을 완전히 분리하려면 슬랙 개발자 콘솔에서 프로덕션 앱과 테스트 앱 두 개의 독립된 애플리케이션을 만들어야 한다. Vercel 프리뷰 배포 URL은 무단 접근을 막으려고 Deployment Protection 기능을 켜는데 이 보안 기능은 외부에서 오는 슬랙 서버의 챌린지 및 이벤트 웹훅 호출까지 차단해 401 및 403 에러를 유발한다. 슬랙 이벤트 웹훅 설정은 커스텀 HTTP 헤더를 지원하지 않으므로 Vercel이 주는 자동화 우회 쿼리 파라미터를 엔드포인트 URL에 직접 붙여야 한다.

이 워크플로우를 자동화하는 3단계 절차이다.

  1. Vercel 대시보드 프로젝트 설정의 Deployment Protection 섹션에서 프리뷰 배포용 보호 우회 시크릿 키를 만들고 빌드 환경 변수인 VERCEL_AUTOMATION_BYPASS_SECRET에 등록한다.
  2. 테스트용 슬랙 앱의 이벤트 구독 요청 URL에 쿼리 스트링 형태로 바이패스 파라미터를 결합해 등록한다.
  3. 슬랙의 auth.test API를 호출하는 헬스체크 스크립트를 작성하고 Vercel CLI 명령어 기반의 토큰 교체 및 강제 재배포 쉘 스크립트를 CI 파이프라인에 통합한다.

이 절차를 적용하면 보안 설정 유지 시간을 단축하고 배포 실수로 일어나는 사내 서비스 중단 사고를 예방할 수 있다.