결제 웹훅 이중 디코딩 버그 수정으로 시그니처 검증 안정화
목차
docs: Webhook API 가이드 v1.3 업데이트
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");
시그니처 검증 순서
- raw URL-encoded trstnId로 먼저 시도
- 실패 시 평문값으로 재시도
- 양쪽 다 실패 시 로그 남기고 400 반환
운영에서 간헐적으로 검증 실패가 나던 게 이 코드 때문이었음. 수정 후 안정화됨.
끝
댓글 0
첫 댓글 달아줘.