자동화 slecs

가상계좌 정보 조작 방지

목차

결제 플랫폼에서 가상계좌 발급 정보를 클라이언트가 마음대로 설정할 수 있던 문제를 서버 권위로 고쳤다.

왜 이게 문제였나

가상계좌는 결제의 생명줄이다. 고객이 입금할 계좌(은행, 예금주, 만료일)가 제대로 제시되지 않으면 입금이 실패하거나, 극단적으로는 잘못된 계좌로 자금이 흐를 수 있다.

보안 관점에서 더 심각하다. 클라이언트가 전송하는 은행, 예금주, 만료일 같은 정보를 서버가 검증 없이 그대로 저장하면:
- 악의적인 사용자가 JSON을 조작해 다른 은행이나 예금주 정보를 주입 가능
- 만료일을 임의로 연장하거나 단축
- 나중에 정산·감시 데이터로 사용될 때 신뢰성이 깨짐

"클라이언트가 자기 정보를 주는 건데 뭐가 문제냐"고 할 수 있지만, 결제 시스템에서는 이 데이터가 정산, 거래 추적, 규정 보고에 직결되기 때문에 정확성이 절대적이다.

서버 권위(Server Authority) 원칙 적용

클라이언트의 모든 입력을 참고만 하고, 민감한 필드는 서버에서 신뢰할 수 있는 값으로 설정하도록 변경했다.

필드 변경 전 변경 후
은행 코드 클라이언트 입력값 그대로 사용 서버 은행 정보 맵핑 테이블에서 검증 후 설정
예금주명 클라이언트 입력값 그대로 사용 서버 유저 프로필 DB에서 조회하여 설정
만료일 클라이언트 입력값 그대로 사용 서버 정책(발급 후 유효기간)으로 자동 계산
신뢰도 낮음(출처 불명확) 높음(서버 권위 보증)

구체적인 처리:
- 클라이언트의 "은행명" 요청 → 서버에서 화이트리스트 검증 후 안전한 코드로 변환
- 예금주 정보는 DB 쿼리로 확정 (사용자가 입력한 값은 무시)
- 만료일은 서버 설정 규칙(예: 발급일 + 30일)으로 계산

변경 범위와 설계

wallet 웹 계층과 payment 유틸리티에서 구현했다:

  • wallet/web 클래스: 클라이언트 요청 파라미터를 받는 진입점에서 검증 강화
  • payment/util 클래스: 가상계좌 정보 조합 로직을 서버 신뢰 데이터 중심으로 재구성

이 설계의 이점:
1. 감시팀이 신뢰할 수 있다: "이 데이터는 서버에서 검증한 것이 맞다"고 확신
2. 정산이 정확하다: 잘못된 정보로 인한 추후 수정 요청 감소
3. 책임이 명확하다: 클라이언트 개발팀도 "우리 입력은 참고일 뿐"이라고 이해

비슷한 패턴들과 배운 점

결제 시스템에서는 이 원칙이 여러 곳에 적용된다:

  • 환율: 클라이언트 입력 환율 무시, 서버에서 실시간 조회하여 계산
  • 수수료: 고객이 입력한 수수료를 믿지 않고, 서버 정책에서 재계산
  • 통화 코드: 요청된 통화를 화이트리스트로 검증, 미지원 통화 거부
  • 쿠폰/할인: 클라이언트가 "이건 10% 할인"이라고 해도, 서버에서 실제 할인율 검증

팀 차원에서 깨달은 건, 결제 데이터는 한 번 잘못 들어가면 정산 단계에서 발견되는데, 그때쯤이면 돈 계산과 거래가 이미 끝난 상태라는 점이다. 따라서 입구에서 엄격하게 필터링하는 게 나중의 복구 비용을 엄청 줄인다. 특히 결제·정산팀과 일할 때, "이 필드는 서버 권위입니다"라고 명확히 하면 버그 추적과 책임 소재 파악이 훨씬 빨라진다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.