피드로 돌아가기
Dev.toSecurity
원문 읽기
Client-side Price Tampering 방지를 위한 Server-determined Pricing 설계
Never trust the client with your Stripe price
AI 요약
Context
클라이언트가 전달한 결제 금액이나 Price ID를 서버가 그대로 Stripe API에 전달하는 취약한 아키텍처 분석. Request Body 조작을 통해 프리미엄 플랜을 저가에 구매하는 Price Tampering 공격 가능성을 확인.
Technical Solution
- Client 요청에서 금액(amount) 및 Price ID를 완전히 제거하고 단순 플랜 식별자(Plan Key)만 수신하는 구조로 변경
- 서버 내부에 정의된 정적 Map(PLANS)을 통해 Plan Key와 실제 Stripe Price ID를 매핑하는 Server-side Lookup 로직 구현
- 수신된 Plan Key를 서버의 Allowlist와 대조하여 정의되지 않은 플랜 요청을 즉시 차단하는 유효성 검증 단계 추가
- 동적 금액 결정이 필요한 경우, 서버에서 정의한 최소/최대 범위 내에서만 값을 허용하는 Bound Validation 적용
- Customer ID 및 Coupon 정보 등 결제에 영향을 주는 모든 데이터의 출처를 Request Body가 아닌 Authenticated Session으로 강제
실천 포인트
- 결제 요청 Body에 amount, priceId, quantity 필드가 포함되어 있는지 확인 - Stripe Checkout 생성 시 price_data(인라인 정의) 대신 서버 저장소의 Price ID 참조 방식 사용 여부 검토 - 결제 관련 요청을 curl로 직접 전송하여 금액 조작 시 결제 페이지에 반영되는지 테스트 수행 - 권한, 역할, 가격 등 비즈니스 중요 결정 값이 클라이언트 요청에 의존하는지 전수 조사