HTTP 안전한 메서드? 멱등한 메서드?

무심코·2023년 2월 28일
0

HTTP 공식 문서(MDN)를 살펴보면 안전함, 멱등성 여부를 HTTP 메서드 속성으로 메서드마다 표시해준다. 여기서 말하는 안전함, 멱등성이란 무엇일까?

안전한 메서드?

안전한 메서드란 서버측의 상태 정보를 변경하지 않는 메소드, 다른 말로 하면, 읽기 작업만 수행하는 메서드를 가리킨다. 안전한 메서드는 멱등성을 가지지만 멱등성을 가진 메서드가 모두 안전한 것은 아니다.

GET, HEAD 메서드의 경우 요청을 아무리 해도 서버의 상태를 변경시키지 않으니 안전한 메서드라고 할 수 있고 POST, PUT, DELETE와 같은 메서드들은 요청을 할때마다 서버의 상태를 변경시키므로 안전하지 않은 메서드이다.

멱등한 메서드?

멱등한 메서드는 멱등성이 유지되는 메서드를 말한다.

멱등성이란 수학에서 사용하는 용어에서 유래한 것으로. 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 뜻한다. HTTP 메소드에서는 응답이 다를 수는 있지만, 요청이 의도한 효과를 발휘할 때 멱등성이 유지됨을 의미한다.

즉 멱등성 유지의 판단 여부는 '요청의 효과'이다. 어떤 HTTP 요청을 하였을 때의 최종 결과가 원하는 요청의 결과로 맞닿을 때 멱등성이 유지된다고 할 수 있다.

결론적으로 말하면 HTTP 요청 중 GET, HEAD, PUT, DELETE 메서드는 멱등성을 가지고 POST는 멱등성을 가지지 않는다.

GET

GET부터 살펴보자

GET은 GET /data 와 같은 HTTP 요청을 보낸 때 그 원하는 최종 결과는 data를 응답받는 것이다.

다음과 같이 GET을 한번 요청해도, 여러번 요청해도 그 결과는 'data 응답' 으로 동일하고 이는 원하는 최종 결과와 일치한다. 즉, GET은 멱등성이 유지된다고 할 수 있다. (HEAD의 경우도 GET과 동일하다)

PUT

PUT은 어떨까

PUT은 PUT /data/10 (/date/:idx) 와 같은 HTTP 요청을 보낼 때 그 원하는 최종 결과는 10번째 인덱스의 데이터가 없다면 data로 생성하고 있다면 data로 수정하는 것이다. 즉, 정리하자면 10번째 인덱스의 데이터를 data 만드는 것이 최종 목표인 것이다.

PUT의 경우도 어떠한 경우에도 최종 결과(효과)가 원하는 최종 결과와 일치하므로 멱등성이 유지된다고 할 수 있다.

DELETE

그렇다면 DELETE를 살펴보자

DELETE는 표면적으로 살펴보면 멱등성이 유지되지 않아보인다.
초기 DELETE를 요청하면 HTTP 200 으로 정상 삭제 응답이 오지만,
이후 DELETE를 요청하면 지우고자 하는 목표 데이터가 이미 사라졌으므로 HTTP 404 응답이 올 것이기 때문이다.
여기서 멱등성 유지 조건이 요청의 대한 ‘응답’의 유지가 아닌 요청에 대한 ‘효과’의 유지인 것을 다시 생각해야한다.

DELETE의 경우를 위에 살펴본 방식으로 살펴보자.

DELETE는 DELETE /data/10 (/date/:idx) 와 같은 HTTP 요청을 보낼 때 그 원하는 최종 결과는 10번째 인덱스의 데이터를 삭제하는 것이다.

위와 같이 DELETE의 요청에 따른 응답은 다르지만 그 최종 결과(효과)는 원하는 최종 결과와 계속 동일하게 도출된다. 즉, DELETE 또한 멱등성이 유지된다고 할 수 있는 것이다.

POST

마지막으로 POST를 살펴보자

POST는 POST /data 와 같은 HTTP 요청을 보낼때 그 원하는 최종 결과는 data인 데이터를 1개 추가하는 것이다.

위와 같이 POST의 경우 요청을 반복하게 되면 data가 반복되는 횟수만큼 추가되게 되고 이는 원하는 최종 결과와 다른 결과(효과)를 초래한다. 즉, POST는 멱등성이 유지되지 않는 것을 확인할 수 있다.

그렇다면 왜 이런 것들이 필요할까?

먼저 HTTP 멱등성이 필요한 '기능적인 이유'는 요청의 재시도 때문이다. 만약 HTTP 요청의 멱등성이 유지된다면, 클라이언트 측에서 요청이 실패한 경우 별다른 고민없이 재요청을 보내도 된다. 하지만 HTTP 요청의 멱등성이 유지되지 않을 때 별다른 고민없이 재요청을 보낸다면, 동일 데이터가 중복되는 중복 요청이 일어날 수 있다.

'궁극적인 HTTP 멱등성, 안전함의 존재이유'는 불특정 클라이언트들과의 약속이라고 생각한다.

HTTP(HyperText Transfer Protocol)는 일종의 규약이다. 별도의 설명 없이 어떤 클라이언트들이 사용하더라도 해당 API의 HTTP 메서드만 보고서 API의 효과를 예상할 수 있고 이를 고려하여 호출을 진행할 수 있게 하기 위해 HTTP 메서드마다 멱등성과 안전함이 일종의 약속으로 구분되는 것이다.
위와 같은 이유로 백엔드 개발자는 HTTP 메서드의 멱등성과 안정성을 보장하면서 API를 설계하는 것이 중요하다는 것을 알 수 있다.

출처

GET - HTTP | MDN
멱등성 | MDN

profile
지나치지 않기 위하여

0개의 댓글