CS/네트워크

HTTP 멱등성

infitry 2022. 9. 22. 08:34
반응형

HTTP의 멱등성에 대해 알아보겠습니다.

 

* 멱등성이란? 

연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질

 

HTTP Method

HTTP Method의 멱등성에 대해 알아보겠습니다.

자주 사용되는 Method로는 GET, POST, PUT, PATCH, DELETE가 있습니다. 

GET

예를 들어 어떠한 사용자의 정보를 가져오는 API가 있습니다. 

GET /users/1 HTTP/1.1

 

단순 조회만 하기 때문에 GET 요청을 몇 번을 하더라도 같은 결과를 가져옵니다.

따라서 멱등성이 성립한다고 볼 수 있습니다.

POST

사용자를 등록하는 API입니다.

POST /users HTTP/1.1

{ 
	"name" : "이이원",
	"age" : "15"
}

사용자를 등록하는 API는 서버의 상태가 변경되고, 데이터가 계속 추가되기 때문에 항상 다른 결과를 가져옵니다.

사용자의 이름, 나이는 같을 수 있으나 실제로는 다른 데이터가 계속 쌓입니다.

따라서 POST 요청은 멱등성이 성립하지 않습니다.

PUT

사용자를 수정하는 API입니다.

PUT /users/1 HTTP/1.1

{ 
	"name" : "이우지",
	"age" : "15"
}

사용자가 수정되고, 해당 요청을 계속해서 시도하더라도 처음 수정된 상태와 같습니다.

같은 데이터만 똑같은 데이터로 수정하기 때문입니다.

따라서 PUT 요청은 멱등성이 성립됩니다.

PATCH

사용자 정보의 일부만 수정합니다.

PATCH /users/1 HTTP/1.1

{ "name" : "이이원" }

 

사용자 정보의 일부만 수정하나, 상황에 따라 멱등성을 가질 수도 있고 갖지 않을 수도 있습니다.

위의 요청은 1번 사용자의 이름을 "이이원" 으로 변경합니다. 계속하여 같은 요청을 보내도 같은 상태를 유지합니다.

하지만 예를 들어 아래와 같은 요청이 있습니다.

 

PATCH /users/1 HTTP/1.1

{ 
	"requestType" : "addAge",
	"age" : "3"
}

서버에서는 HTTP 메시지 Body의  requestType을 분석하여 age를 계속하여 더합니다.

계속하여 같은 요청을 하게되면 1번 사용자의 나이가 "3"씩 늘어납니다.

계속해서 나이가 "3"씩 늘어나기 때문에 멱등성을 갖지 않습니다.

 

그럼 PUT 도?

PUT 는 사용자 정보의 전체를 변경하는 HTTP 메서드이기 때문에, 사용자의 모든 정보에 대한 요청만 가능합니다.

(사용자의 정보가 name, age 뿐이라면 해당 값들만 요청 가능)

DELETE

사용자 정보를 삭제하는 API입니다.

DELETE /users/1 HTTP/1.1

사용자 정보를 삭제하는 요청을 여러 번 시도해도 결과는 같습니다.

첫 삭제된 이후 어차피 삭제할 데이터가 없기 때문에 같은 결과를 가져옵니다.

DELETE 요청도 멱등성이 성립됩니다.

안전한 메서드

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

위의 예제에서 PUT DELET 메서드는 멱등성을  갖습니다. 하지만 PUT은 사용자를 수정하고, DELETE는 사용자를 제거하므로(서버의 상태가 바뀌므로) 안전한 메서드라고 할 수 없습니다. 즉 멱등성을 갖는 HTTP Method도 서버의 상태를 변경시킬 수 있습니다.

반응형