본문 바로가기
3층 개발관/웹 지식

[HTTP] HTTP 멱등성이란??

by 개발관 2023. 4. 10.
반응형

1. HTTP 멱등성(Idempotent)이란??

 

HTTP 멱등성이란 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때 해당 HTTP 메서드가 멱등성을 가졌다고 설명한다.

 

 

올바르게 구현한 경우

 

멱등성을 가진 메서드 : GET, HEAD, DELETE, OPTIONS 등

멱등성을 가지지 않는 메서드 : POST, PATCH

 

 

2. 대표적인 Method들의 멱등성

 

멱등성을 가진 메서드(Method)

  • GET : 처음 요청에 대한 서버상태가 여러번 요청해도 바뀌지 않고 동일한 상태를 유지한다. (계속해서 index.html의 본문내용 조회)
요청
GET index.html

응답
<html>
     hello world!!
</html>

 

  • PUT : PUT요청은 데이터를 덮어쓰기 하는 것으로 만약 요청 시에 수정할 데이터를 일부분만 보낼 시 일부분에 해당하지 않는 데이터들은 NULL값을 가지게 된다. 하지만, 이 요청 역시 처음 요청에 대한 서버상태와 여러 번 요청에 대한 서버 상태가 같으므로 멱등성을 가진다.
기존 데이터
{
     name : 'abc'
     age : 20
}

요청
PUT /post
{
      name : 'kdk'
}

응답
{
     name : 'kdk'
     age : NULL
}

 

  • DELETE : DELETE 도 마찬가지로 삭제를 함으로 써 처음과 다른 응답 값을 주지만, 여기서 주목해야할 것은 응답값이 바뀜이 아니라 서버상태가 바뀌지않는다는 것을 주목해야한다 ( 주의! - DELETE 메서드를 사용해 "목록의 마지막 항목 제거" 기능을 구현한다면  계속해서 마지막 목록을 삭제함으로써 멱등성을 가지지 않는다. REST API에서는 이렇게 구현하면 안 된다!)
요청
DELETE /post/1

응답
200 OK

다음번 요청 시 응답
404 ERROR

 

멱등성을 가지지않은 메서드(Method)

 

  • POST : POST는 요청을 보낼 때마다 새로운 데이터를 생성함을 예상함으로 써 처음 서버의 상태와 여러 번 요청했을 때의 서버 상태가 다르다. 그러므로 멱등성을 가지지 않는다.
요청
POST /post
{
     name : 'kdk'
}

응답
{
     id : 1                               ----- 1, 2, 3 늘어남
     name : 'kdk
}

 

  • PATCH : PATCH는 기본적으로 멱등성을 가지지 않지만, PUT과 동일한 방식으로 쓴다면 멱등성을 가질 수 있다, 하지만 추가(append)하는 요청 역시 PATCH를 쓸 수 있어 결과가 매번 달라지는 추가 요청은 멱등성을 가진다고 할 수 없다.
1. PATCH → name: [”MangKyu”]
2. PATCH → name: [”MangKyu”, ”MangKyu”]
3. PATCH → name: [”MangKyu”, ”MangKyu”, ”MangKyu”]

자료 출처 -> 망나니개발자 블로그

 

멱등성을 갖는 메서드도 서버의 상태는 변경할 수 있으나,

멱등성의 핵심은 ' 요청에 대한 서버의 상태가 똑같은가? "이다.

 

3. 안전한 메서드

 

안전한 메서드란 서버의 상태를 변경시키지 않는 HTTP 메서드를 의미한다.

  • 모든 안전한 메서드는 멱등성을 갖는다.
  • 안전한 메서드 : GET, HEAD, OPTIONS

 

앞서 설명한 것들 중 PUT과 DELETE는 멱등성을 갖지만 안전한 메서드는 아니다.

PUT은 리소스를 수정하고, DELETE는 메서드를 제거하므로 안전한 메서드라고 이야기할 수 없다.

 - 서버의 상태를 변경시키기 때문에

 

 


** 참고자료 **

 

https://developer.mozilla.org/ko/docs/Glossary/Idempotent

https://june0122.github.io/2021/08/05/term-idempotent/

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

https://mangkyu.tistory.com/251

반응형