REST API - 멱등성과 안전성

이월(0216tw)·2024년 9월 4일

멱등성 (idempotency)

API를 여러번 호출해도 출력 결과가 달라지지 않는 성질을 의미한다.
GET 은 여러번 호출해도 동일한 출력 결과를 내므로 멱등하다.
(더 정확히 말하면 서버의 상태가 변하지 않는다.)
DELETE 도 삭제한 자원에 대해 "동일한 결과"를 내므로 멱등한 성질이며
PUT 도 자원을 "완전 변경" 하거나 없으면 "추가"하므로 멱등하다.
즉, 없으면 INSERT , 있으면 UPDATE 이므로 여러번 실행해도 동일한 상태를 낸다.

왜 PATCH는 멱등하지 않은 건가?

PATCH는 PUT과 달리, 자원을 "부분적으로" 변경한다.
따라서 PATCH를 실행할 때마다 변경되는 부분이 다를 수 있으므로 멱등하지 않다.
(물론 전체 변경을 한다면 .. PUT과 같은 의미가 되어 멱등이 되기는 한다)

왜 POST는 멱등하지 않는 건가?

당연한 이야기지만 새로운 자원이 "생성(POST)" 되므로 멱등하지 않는다.



안전성 (safety)

API를 여러번 호출해도 자원(리소스)이 변경되지 않는 성질을 의미한다.
GET은 여러번 호출해도 동일한 자원을 반환하지만,
POST , PUT , PATCH , DELETE 등은 호출시 자원이 변경(혹은 삭제) 되므로
동일한 자원이 반환되지 않는다.



멱등성과 안전성의 관계

멱등(idempotency) 하면 안전(safety) 한가?? >> NO

예를 들어 PUT 은 리소스를 "완전히" 대체하는 메서드이다.
따라서 PUT을 여러번 실행해도 "완전히 변경된" 리소스가 동일하게 유지된다. (멱등)
하지만 PUT은 자원의 상태를 변경하므로 안전한 것은 아니다. (안전하지 않음)

안전(safety) 하면 멱등(idempotency) 한가? >> YES

안전한 연산이라는 것은, API를 여러번 실행해도 자원이 변경되지 않는다는 것이다.
따라서 바뀌지 않은 결과를 항상 리턴하므로 멱등하다고 볼 수 있다.


왜 이런 개념이 필요할까 ?

예를 들어 GET 메서드는 항상 멱등하고 안전하다는 것을 알게 된다면 추가 요청을 하지 않아도 된다.

) 
결제 처리 로직을 실행했고, 결제는 처리되었으나 응답 반환중에 오류가 발생했다. 
이때 사용자는 다시 결제 처리 로직을 수행해야할까?

똑같은 결제ID에 대해 응답결과는 항상 동일하기 때문에 
추가적인 결제 처리 요청없이 GET을 하면 된다., GET의 멱등성에 의해 자원의 낭비를 줄일 수 있다. 



참고

https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP%EC%9D%98-%EB%A9%B1%EB%93%B1%EC%84%B1-%C2%B7-%EC%95%88%EC%A0%95%EC%84%B1-%C2%B7-%EC%BA%90%EC%8B%9C%EC%84%B1-%F0%9F%92%AF-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0 (Inpa Dev 님의 HTTP의 멱등성 · 안정성 · 캐시성 💯 완벽 이해하기 )

https://hudi.blog/http-method-idempotent/ (Hudi 님의 HTTP 메소드의 멱등성, 그리고 안전한 메서드 )

profile
#SQLD강사 #AI개발 #AI강사 #개발자 개발도 하고 강의도 하지만 고민을 제일 많이 합니다

0개의 댓글