HTTP 메서드의 멱등성과 안전한 메서드

Kim Jio·2022년 12월 16일
0

  • 멱등성 (Idempotence)
    수학에서의 멱등성은 연산을 여러번 실행해도 같은 결과를 반환하는 성질을 말한다.

아래와 같은 함수는 항상 같은 값을 넣으면 같은 값을 반환한다. 멱등성을 가지고 있다고 할 수 있다.

public int abs(int num) {
	return Math.abs(num);
}

멱등성의 핵심은 어떠한 값에 대해 여러번 동일한 연산을 실행해도 연산 횟수에 구애받지 않고 동일한 결과값을 내어주는 성질이란 것이다.

HTTP 메서드에서의 멱등성

HTTP 메서드 또한 이와 마찬가지로 동일한 요청을 보낸다면 요청 횟수에 구애받지 않고 서버의 상태가 항상 동일할 때
해당 HTTP 메서드는 멱등성을 가진다고 할 수 있다.
멱등성을 따질 때 서버의 상태만 보면 되고 HTTP Status Code는 따지지 않아도 된다.

올바르게 구현된 Rest API의
Get, Put, Head, Options, Delete는 멱등성이 보장된다.

통계 기록(e.g. 게시물 조회수의 증가 등)을 제외하고

왜 이 메서드들은 멱등성이 보장되어야 하는걸까?

  • Get : 서버에 존재하는 리소스를 단순히 읽어오는 메서드이기 때문에 여러번 수행되어도 서버의 상태는 변하지 않는다. 마찬가지로 HEAD, OPTIONS 메소드도 조회에 대한 메소드이기 때문에 멱등하다고 할 수 있다.

  • Put : 서버에 존재하는 리소스를 다른 리소스로 통째로 대체 해버리기 때문에 여러번 실행하더라도 서버의 상태는 변하지 않는다.

  • DELETE : 존재하는 데이터를 삭제한 결과와 이미 존재하지 않은 결과를 삭제하려는 시도에 대한 응답 코드는 서로 다르겠지만, (200 OK 또는 404 NOT FOUND) 서버의 상태 자체는 변하지 않으므로 올바르게 구현되었다면 여러번 수행되어도 멱등성이 보장된다.

하지만 POST는 데이터베이스의 리소스를 추가한다거나 하는 서버의 상태를 이전과 바꾸는 행위를 하기 때문에 멱등성이 보장되지 않는 메서드이다. (호출 시마다 서버의 상태를 바꿈)

그렇다면 PATCH 메서드는 어떨까? 패치는 항상 멱등성을 보장한다고 할 수는 없지만 멱등성을 보장하게끔 설계할 수는 있다.
PATCH는 리소스의 일부에 대하여 변화를 명령할 수 있기 때문이다.

{
  "operation": "add",
  "age": 10
}

위 요청을 PATCH 메소드로 실어 보낸다면, 해당하는 리소스의 age 라는 필드는 요청마다 10씩 증가하게 될 것 이다. 따라서 단일 호출에 대한 응답과 다중 호출에 대한 응답에 대한 서버의 상태가 다를 것이고, 곧 이는 멱등하지 않음을 의미한다.

안전한 메소드 (Safe Methods)

안전한 메소드란, 서버의 상태를 변경시키지 않는 HTTP 메소드를 의미한다. GET, OPTIONS, HEAD 와 같이 조회에 사용되는 메소드를 안전하다고 이야기할 수 있다. 모든 안전한 메소드는 멱등성을 갖지만, 그 역은 성립하지 않는다.

앞서 이야기한 PUT과 DELETE 메소드는 멱등성을 갖는다고 이야기 했다. 하지만 PUT은 리소스를 수정하고, DELETE는 리소스를 제거하므로 안전한 메소드라고는 이야기할 수 없다.

즉, 멱등성을 갖는 메소드가 서버의 상태를 변경하지 않는다고 오해하면 안된다. 멱등성을 갖는 메소드도 서버의 상태를 변경시킬 수 있다. 멱등성의 핵심은 "요청에 대한 서버의 상태가 항상 같은가?" 이다.

참고: https://hudi.blog/http-method-idempotent/

profile
what's important is an unbreakable heart

0개의 댓글