피드로 돌아가기
Dev.toSecurity
원문 읽기
HMAC-SHA256 및 Constant-time 비교 기반의 Shopify Webhook 보안 아키텍처
How to Verify Shopify Webhooks Correctly (And Stop Getting It Wrong)
AI 요약
Context
공개 HTTP 엔드포인트인 Webhook의 특성상 인증 없는 요청에 노출되어 데이터 변조 및 서비스 거부 공격(DoS) 위험이 상존함. 일반적인 바디 파싱 후 검증 방식은 데이터 변형으로 인한 HMAC 불일치 및 Timing Attack 취약점을 유발하는 한계가 있음.
Technical Solution
- HMAC-SHA256 알고리즘을 통한 요청 바디의 무결성 검증 및 Shared Secret 기반의 서명 일치 확인
- Middleware 단계에서 JSON 파싱 전
express.raw()를 통한 Raw Byte Buffer 확보로 HMAC 계산 정밀도 유지 crypto.timingSafeEqual을 활용한 Constant-time 비교로 문자열 비교 시간 차이를 이용한 Side-channel 공격 원천 차단created_at타임스탬프 기반의 5분 윈도우 검증 및 Event ID 중복 제거를 통한 Replay Attack 방어X-Shopify-Shop-Domain헤더와 등록 숍 DB의 대조를 통한 교차 상점 요청(Cross-shop Request) 차단- 5초 이내 200 OK 응답 후 비동기 워커로 처리를 위임하는 Queue 기반 아키텍처로 Shopify 재시도 및 중복 처리 방지
실천 포인트
1. Webhook 수신 시 JSON 파싱 전 Raw Body를 사용하여 HMAC 검증 수행
2. 단순 비교 연산자(===) 대신 언어별 Constant-time 비교 함수 적용
3. 5분 이내의 타임스탬프 검증 및 Event ID 기반 Idempotency 확보
4. 숍 도메인 헤더를 통한 요청 발신처의 정당성 검증
5. 응답 우선 전송 후 비동기 처리 구조를 통한 타임아웃 및 중복 처리 방지