본문 바로가기

프로그래밍/이것저것 일하면서

[RESTful API] DELETE 요청에 Body를 사용하지 않는 이유

반응형

API 서버에서 HMAC 검증을 추가했는데, 게 중에는 DELETE 메소드를 사용하는 API도 있다. 그런데 iOS 개발팀에서 DELETE 요청에 payload를 담을 수 없으니 이 API만 payload 대신 query string으로 생성한 HMAC으로 검증해달라는 요청을 했다. 이유를 들어보니, 그쪽 진영에서 가장 흔하게 사용하는 라이브러리에서는 DELETE 요청에 payload를 담을 수 없다는 것이다. 그래서 어차피 DELETE가 적합하지 않았던 API라 POST로 변경을 해주고, 관련 내용을 좀 찾아보았다.

REST API URL 설계 지침

우선 API URL을 설계할 때에는 다음과 같은 지침을 따르는 것이 좋다.

  • URL은 명사 형태로 작성하고, 동사는 HTTP Method로 나타낸다.
  • URL Path의 단어는 소문자로 작성하고, 띄어쓰기 대신 하이픈(-)을 사용한다.
  • URL Path의 끝에 슬래시(/)를 사용하지 않는다.
  • URL Path에는 동사보다는 명사를 사용하고, 복수형으로 작성한다.
  • URL Path에서 특정 리소스를 나타내는 경우에는 해당 리소스의 ID를 URL Path에 추가한다. 이때, ID는 숫자 또는 문자열로 표현한다.

DELETE API요청에서 Http Body 사용

DELETE 메서드는 HTTP 표준에서 요청 본문(Request Body)을 포함하지 않아도 되도록 정의되어 있다. 따라서 DELETE 메서드 요청에는 일반적으로 요청 본문이 포함되지 않는다.

HTTP/1.1 스펙 문서에서는 DELETE 메서드를 다음과 같이 정의한다.

9.7 DELETE

The DELETE method requests that the origin server remove the
association between the target resource and its current functionality.

A payload within a DELETE request message has no defined semantics;
sending a payload body on a DELETE request might cause some existing
implementations to reject the request.

즉, DELETE 메서드는 요청 대상 리소스와 해당 리소스와의 연결을 제거하는 것을 요청하는 메서드이며, 요청 본문의 의미가 명확하게 정의되어 있지 않다. 따라서 DELETE 메서드 요청에서는 요청 본문을 포함하지 않는 것이 일반적이라고 볼 수 있다.

하지만, HTTP 표준에서는 요청 본문을 포함하지 않아야 한다는 엄격한 제약은 없으므로, 구현에 따라 DELETE 메서드 요청에 요청 본문을 포함할 수는 있다. 이러한 경우, API 사용자에게 요청 본문의 형식과 내용에 대한 문서화가 필수적이다.

결론

DELETE 메서드 요청에서는 요청 payload를 포함하지 않는 것이 일반적이라고 볼 수 있지만, 기능상 엄격하게 제약되어 있는 것은 아니므로 요청 본문(payload)를 포함하도록 설계할 수는 있다. 다만 이를 지원하지 않는 라이브러리가 있다는 것을 유념해야 한다.

실무에서 DELETE에 payload를 포함해야하는 경우가 생긴다면, 되도록 payload를 필요하지 않는 방법을 찾아보고 그것이 어렵다면 API를 호출하는 팀이나 개발자에게 꼭 확인 후 진행하자.

반응형

개발자가 그리는 인스타툰 팔로우하세요!