HTTP의 멱등성이란?

이강용·2024년 7월 18일
0

CS

목록 보기
81/109

HTTP의 멱등성(Idempotence)이란?

  • 특정 HTTP 메서드가 같은 요청을 여러 번 실행했을 때 서버의 상태가 한 번 실행했을 때와 동일하게 유지되는 특성을 말함
    👉🏻 즉, 멱등성을 가진 메서드는 여러 번 호출하더라도 서버의 상태가 변하지 않는다는 의미

주요 HTTP 메서드와 멱등성

GET

  • 설명 : 서버로부터 데이터를 조회
  • 멱등성 : 동일한 GET 요청을 여러 번 보내도 서버의 데이터는 변경되지 않음
  • 예시 : GET /users/123 요청을 여러 번 보내도 사용자의 정보는 변하지 않음

PUT

  • 설명 : 서버에 데이터를 업데이트하거나 생성
  • 멱등성 : 동일한 PUT 요청을 여러 번 보내도 서버의 상태는 첫 번째 요청과 동일하게 유지
  • 예시 : PUT /users/123 요청으로 사용자의 정보를 { "name": "John" }로 업데이트할 때, 여러 번 보내도 결과는 동일

DELETE

  • 설명 : 서버에서 데이터를 삭제
  • 멱등성 : 동일한 DELETE 요청을 여러 번 보내도 서버의 상태는 동일하게 유지
  • 예시 : DELETE /users/123 요청을 여러 번 보내도 사용자는 한 번만 삭제

OPTIONS

  • 설명 : 특정 URL이 지원하는 HTTP 메서드를 질의하는 데 사용
    • 클라이언트는 서버에게 해당 리소스에 대해 사용할 수 있는 HTTP 메서드(예: GET, POST, PUT 등)을 확인할 수 있음

curl -X OPTIONS http://localhost:3000/resource -i

node.js로 구축한 간단한 option 서버

const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
app.options("/resource", (req, res) => {
  res
    .set({
      Allow: "GET, HEAD, OPTIONS",
      "Access-Control-Allow-Methods": "GET, HEAD, OPTIONS",
      "Access-Control-Allow-Headers": "Content-Type",
      "Access-Control-Allow-Origin": "*",
    })
    .end();
});
app.get("/resource", (req, res) => {
  res.status(200).json({ ka: 1 });
});
app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

POST

  • 설명 : 서버에 데이터를 생성
  • 멱등성 : 멱등성을 가지지 않음, 동일한 POST 요청을 여러 번 보내면 서버에 여러 리소스가 생성될 수 있음
  • 예시 : POST /users 요청을 여러 번 보내면, 각각의 요청마다 새로운 사용자가 생성될 수 있음

PATCH

  • 설명 : 서버에 데이터의 일부를 업데이트
  • 멱등성 : 일반적으로 멱등성을 가지지 않음, 그러나 구현에 따라 멱등성을 가질 수도 있음
  • 예시 : PATCH /users/123 요청을 여러 번 보내면 사용자의 정보가 여러 번 부분적으로 수정될 수 있음

결제 처리 API에서 중복 요청 방지 방법

멱등성 키(Idempotency KEy) 구현

POST/payments
Idempotency-Key: 6fa5438a-6818-48d9-bb15-6954a1f3e3a3

node.js를 이용한 서버 구축 예시

const express = require("express");
const app = express();
app.use(express.json());
const idempotencyKeyStore = {};
app.post("/order", (req, res) => {
  const idempotencyKey = req.headers["idempotency-key"];
  if (!idempotencyKey) {
    return res.status(400).json({ error: "멱등성에 관한 키가 필요합니다." });
  }
  if (idempotencyKeyStore[idempotencyKey]) {
    return res.status(200).json({
      message: "동일한 요청을 받았습니다.",
      result: idempotencyKeyStore[idempotencyKey],
    });
  }
  const order = {
    id: Math.floor(Math.random() * 1000000),
    items: req.body.items,
    total: req.body.total,
  };
  idempotencyKeyStore[idempotencyKey] = order;
  res.status(201).json(order);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

curl 요청

curl -X POST http://localhost:3000/order \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6fa5438a-6818-48d9-bb15-6954a1f3e3a3" \
-d '{"items": ["apple", "banana"], "total": 15}'

멱등성이 중요한 이유

  1. 일관성 : 반복되는 요청이 단일 요청과 동일한 효과를 갖도록 보장하는 것은 시스템 전반에 걸쳐 일관된 상태를 유지하는 데 도움이 됨

  2. 유지보수성 : 멱등성을 가진 HTTP API로 통신하는 부분에 있어서는 재시도를 처리할 때의 사이드이펙트를 고려한 복잡한 로직을 구현할 필요가 없기 때문에 이 부분을 잘 설계한다면 유지보수성이 증가됨

profile
HW + SW = 1

0개의 댓글