chick chick pok pok

HTTP 메서드에서 멱등성이란 무엇인가요?

Idempotent 멱등한다는 것은 한번 수행하든 여러번 수행하든 같은 결과를 내는 작업의 속성이다. HTTP에서는 GET메소드가 리소스의 변화를 일으키지 않기 때문에 여러번 호출해도 같은 결과를 내는데, 이를 멱등성이 보장된 메서드라고 할 수 있다. PUT역시 여러번 호출해도 매번 같은 리소스로 업데이트 되는 것이기 때문에 결과가 달라지지 않는다. DELETE도 여러 번 호출해도 결국 같은 리소스를 삭제하는 것이기 때문에 멱등하다. 반면 POST, PATCH는 호출할때 서버 데이터를 변경하기 때문에 멱등한 메서드가 아니다.

POST, PATCH 메서드의 멱등성 구현

멱등성은 시스템이 의도하지 않은 문제를 일으키지 않고 요청을 재시도 할 수 있기때문에, 결함없고 안전한 API를 만드는데 중요하다. 예를 들어, 결제 api는 사용자가 결제하는 시점에 네트워크나 타임아웃으로 인해 결과를 못받는 시나리오를 가정해봤을 때, 여러 번 결제가 진행되는 것을 막고 전에 받지 못한 결과만 다시 하는 식으로 구현되어 있는 것이 더 안전할 것이다.

이를 위해 서버에서는 이전 요청과 동일한 요청인지 확인하고, 중복으로 판단되면 실제로 처리하지 않고 첫 요청과 같은 응답을 반환하는 방식으로 구현할 수 있다. 중복인지 확인해주는 부분의 명칭은 멱등키이며, IETF표준으로는 요청 헤더에 포함하는 방법을 표준으로 제안하고 있다.

Idempotency-key: {IDEMPOTENCY_KEY}
/// UUID v4와 같이 충분히 무작위적인 값이어야 한다.

작동 플로우

  1. API는 취소 요청마다 헤더에 멱등키가 있는지 확인한다.
  2. 멱등키를 저장하기 위한 db를 만들어둔다. 멱등키가 포함된 취소 요청이 들어왔을 떄 이 DB를 쿼리해서 요청이 들어온 멱등키와 매칭되는 요청 기록이 있는지 확인한다. API 키, API 주소, HTTP 메서드도 동일한 요청만 하나의 요청으로 처리한다.
에러 코드 시나리오
400 Bad Request 멱등해야 하는 API 요청에 멱등키가 누락됐거나 형식에 맞지 않는 키값이 들어왔을 때
409 Conflict 이전 요청 처리가 아직 진행 중인데 같은 멱등키로 새로운 요청이 올 때
422 Unprocessable Entity 재시도 된 요청 본문(payload)이 처음 요청과 다른데 같은 멱등키를 또 사용했을 때

에러 시나리오

IETF 명세를 살펴보면 아래 세 가지 시나리오에 대응할 것을 제안하고 있다.

REF

토스페이먼츠 MDN IETF