본문 바로가기
Backend2026년 6월 13일2분 읽기

결제 API 멱등성(idempotency), 중복 결제 막기

YS
김영삼
조회 795
결제 API 멱등성(idempotency), 중복 결제 막기

핵심 요약

결제·주문 생성처럼 부작용이 있는 요청은 재시도·더블클릭으로 중복 실행될 수 있다. 클라이언트가 요청마다 고유한 Idempotency-Key를 보내고, 서버는 그 키로 "이미 처리했으면 같은 결과를 반환"하게 만들면 몇 번을 보내도 결과는 한 번이다.

1. 흐름

  • 클라이언트: 결제 시도마다 UUID 키 생성·헤더로 전송(재시도 시 같은 키)
  • 서버: 키가 처음이면 처리 후 결과 저장, 재요청이면 저장된 결과 반환
  • 키+결과를 유니크 제약으로 원자적 저장

2. 저장 스키마(개념)

idempotency_keys(
  key TEXT PRIMARY KEY,
  status TEXT,         -- in_progress | done
  response JSONB,
  created_at TIMESTAMP
)

동시 중복 요청은 PK 충돌로 한쪽만 진행되게 한다.

3. 함정

  • 키 없이 "주문번호 중복 체크"만 하면 경쟁 조건에서 샌다 — DB 유니크 제약으로 강제
  • 처리 중(in_progress) 재요청엔 409나 대기 응답
  • 키 보관 기간(예: 24h)과 만료 정책을 정할 것

자주 묻는 질문

프론트에서 버튼 비활성화로 충분하지 않나요?

네트워크 재시도·새로고침·동시 탭은 막지 못합니다. 서버 측 멱등성이 있어야 어떤 경로의 중복도 안전합니다.

키는 누가 만드나요?

보통 클라이언트가 "한 번의 결제 의도"당 하나 생성하고, 재시도 때도 같은 키를 보냅니다. 서버는 그 키로 중복을 식별합니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록