멱등성(Idempotency)은 수학에서 유래된 용어로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미합니다.
HTTP 통신에서의 정의는 다음과 같습니다.
"동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 서버의 상태(State)에 미치는 영향이 동일하다."
즉, 멱등성이 보장된 API라면 네트워크 오류 시 안심하고 재시도(Retry)를 할 수 있습니다. 반면, 멱등하지 않다면 중복 처리가 발생하지 않도록 별도의 조치가 필요합니다.
HTTP 스펙(RFC 7231)에 따르면 각 메서드는 멱등성 여부가 정의되어 있습니다. 이를 표로 정리하면 다음과 같습니다.
| Method | 멱등성 | 안전성 | 역할 |
| GET | Yes | Yes | 리소스 조회 |
| PUT | Yes | No | 리소스 전세 수정 |
| DELETE | Yes | No | 리소스 삭제 |
| POST | No | No | 리소스 생성 |
| PATCH | No | No | 리소스 부분 수 |
참고 (안전성, Safe): 서버의 상태를 변경하지 않는지(읽기 전용)를 의미합니다. 멱등성과는 다른 개념입니다.
서버에서 데이터를 조회하는 메서드입니다.
HTTP
GET /products/123
이 요청을 여러 번 보내도 상품 123번의 정보는 변하지 않으며, 서버 상태도 그대로입니다.
리소스를 대체(Replace) 하는 메서드입니다. (없으면 생성, 있으면 덮어쓰기)
HTTP
PUT /users/1
{ "name": "Cheolsu", "age": 25 }
첫 번째 요청 후: 이름 "Cheolsu", 나이 25 두 번째 요청 후: 이름 "Cheolsu", 나이 25 (변화 없음)
리소스를 삭제하는 메서드입니다.
HTTP
DELETE /posts/50
리소스를 생성하거나 데이터를 처리하는 메서드입니다.
HTTP
POST /orders
{ "item": "pizza", "qty": 1 }
그렇다면 결제나 주문 같은 중요한 POST 요청은 어떻게 안전하게 처리해야 할까요? 업계 표준(Stripe, Toss Payments 등)으로 사용되는 패턴이 바로 **'Idempotency Key(멱등성 키)'**입니다.
서버 구현 로직 (예시)
# Pseudo Code
def process_payment(request):
key = request.headers.get('Idempotency-Key')
# 1. 캐시(Redis)에서 키 확인
if cache.exists(key):
return cache.get(key) # 저장된 이전 응답 반환
# 2. (선택) 동시 요청 방지를 위한 Lock 획득
# 3. 비즈니스 로직 실행
result = payment_service.charge()
# 4. 결과 캐싱 (TTL 설정 필수)
cache.set(key, result, ttl=86400)
return result
이 방식을 사용하면 클라이언트가 네트워크 오류로 응답을 못 받아 재요청을 보내더라도, 서버는 중복 결제를 막고 안전하게 이전 성공 결과를 돌려줄 수 있습니다.
RESTful API를 설계할 때 멱등성은 선택이 아닌 필수 고려 사항입니다.
| SOAP 통신 (0) | 2024.04.02 |
|---|---|
| 웹 브라우저 요청 흐름 (0) | 2022.07.10 |
| URI(Uniform Resource Identifier) (0) | 2022.07.10 |
| DNS(Domain Name System) (0) | 2022.07.08 |
| Port (0) | 2022.07.08 |
댓글 영역