개발 slecs

결제 웹훅 이중 URL 디코딩 버그 수정으로 시그니처 검증 안정화

목차

fix: Welcomepay ci 필드 조회 로직 수정 및 회원 쿼리 기본 조건 변경

Webhook 처리 로직에서 꽤 골치 아픈 이슈를 잡았음. 핵심은 이중 URL decode 문제임.

문제 발생 배경

결제대행사 Webhook은 POST body로 암호화된 필드를 넘겨주는데, 이 값이 URL-encoded 상태로 들어옴. 서버 프레임워크가 Content-Type: application/x-www-form-urlencoded일 때 자동으로 한 번 decode 해주는데, 코드에서 또 한 번 수동 decode를 했던 게 문제였음.

전달값: %25암호화데이터%25
프레임워크 decode: %암호화데이터%
코드 내 decode: (잘못된 값)

수정 내용

필드 처리 방식 변경
trstnId URL-encoded raw값 우선 사용
암호화 payload 단일 decode 적용
시그니처 평문 기준으로 검증 로직 변경
// 기존 - 이중 decode
String trstnId = URLDecoder.decode(
    URLDecoder.decode(request.getParameter("trstnId"), "UTF-8"), "UTF-8");

// 수정 - 단일 decode
String trstnId = request.getParameter("trstnId");

시그니처 검증 순서

  1. raw URL-encoded trstnId로 먼저 시도
  2. 실패 시 평문값으로 재시도
  3. 양쪽 다 실패 시 로그 남기고 400 반환

운영에서 간헐적으로 검증 실패가 나던 게 이 코드 때문이었음. 수정 후 안정화됨.

댓글 0

첫 댓글 달아줘.