REST - HTML Form에서 GET/POST만 지원하는 이유

연재 목록

  1. REST - 긴 여정의 시작
  2. REST - HTML Form에서 GET/POST만 지원하는 이유
  3. REST - 논문(요약) 훑어보기
  4. REST - REST 좋아하시네
  5. REST - Roy가 입을 열다
  6. REST - 당신이 만든 건 REST가 아니지만 괜찮아
  7. REST - 논문 읽기(To Do)

HTML Form에서 GET/POST만 지원하는 이유

쉬어가는 마음으로 다음 장을 위한 사전 지식을 하나 쌓아보자.

왜 PUT과 DELETE를 지원하지 않는가에 대한 정리

  • 일본어다. 구글 번역기를 돌려보자

PUT/DELETE를 Form에 넣으려는 시도는 위 글에서 가장 자세히 나오긴 했다.

(구글 번역이 훌륭하긴 해도) 일본어라 원본을 알아볼 수가 없으므로,
대신 stackexchange에 올라온 글로 짧게 정리해봤다.

  • 초기 HTML5 draft에는 포함되어 있었고 Firefox의 베타 버전에서는 잠시 구현하기도 했었다.
  • W3C는 이 문제를 bug report 10671에서 논의를 했는데,
  • Mike Amundsen이란 사람이 언급하길
    • 리소스를 수정하기 위해 PUT과 DELETE를 실행하는 건 모던 브라우저의 XmlHttpRequest 객체를 사용하면 간단한데, 스크립트를 사용하지 않는 상황에선 쉽지 않다.
    • 이 패턴은 많은 일반적인 웹 프레임웍/라이브러리에서 기본으로 구현하고 있다.
    • (그리고 이를 우회하는 방식에 대한 문제를 언급함)
  • Tom Wardrop란 사람도 흥미로운 관점을 제시함
    • HTML은 HTTP와 떼려야 뗄 수 없는 관계다. HTML은 인간을 위한 HTTP 인터페이스다. 따라서 왜 HTTP에서 필요한 메소드를 모두 제공하지 않는 것인가에 대해 자동으로 의문을 가질 수 밖에 없다. 기계는 PUT과 DELETE를 할 수 있으면서 인간은 왜 안 되는가?
    • HTML이 시맨틱한 마크 업을 보장하는 데 많은 시간을 할애하면서, 시맨틱한 HTTP 요청을 보장하기 위한 노력을 하지 않았다는 것은 모순이다.
  • 결국 이 버그는 (HTML editor인) Ian Hickson에 의해 고치지 않는 것으로 결정났다.
    • “PUT을 form 메소드로 사용한다는 것은 말도 안 된다. 네가 form payload를 통해 PUT을 해야할 일은 없을 것이다. DELETE도 payload가 없어야만 말이 된다. 그러니 역시 form에서 제공할 이유가 없다.”
  • 하지만 포기하지 않고 추가 드래프트가 올라와 있다

일본어로 정리된 글에서도 왜 PUT과 DELETE가 Form에서 적합하지 않은지는 생각하진 않은 것 같다.

추가된 드래프트도 결국 애초의 HTML Form이 가진 기능/목적을 우회하여 Form을 활용한 PUT/DELETE를 실행할 수 있도록 Form의 기능 확장(extension)을 요구하고 있다.
여기에서 DELETE는 크게 이질감이 없지만, PUT의 경우 payload를 통해 헤더를 구성하는 방식을 제안하고 있다. 그 방식은 꽤나 어색해서 과연 HTML 에디터나 커뮤니티 차원에서 받아들일 수 있을지는 미지수이다.

이슈를 닫아버린 Ian Hickson 입장에선 Form에서 PUT/DELETE를 지원하는 게 너무 당연하게 말도 안 되는 일이라고 생각했을 것 같다. 이유는,

  • Form은 서버에 정보를 제출하기 위해 존재한다
  • GET과 POST는 form에 존재하는 대화형 컨트롤에 입력된 값을 보낸다
  • POST와 PUT의 가장 큰 차이
    • RFC2616에서는 ‘요청 URI의 다른 의미’라는 표현을 썼고
    • RFC 7231에서는 ‘동봉된 representation에 대한 다른 의도’라는 표현을 썼다
    • POST에서의 요청 대상 리소스는 동봉된 representation을 ‘처리하는’ 주체이고
    • PUT에서는 동봉된 representation은 대상 리소스의 상태를 대체한다. 즉, 리소스 자체가 되어야 한다
  • 따라서
    • GET은 form에 있는 정보를 줄테니 나에게 리소스(representation)를 줘
    • POST는 form에 있는 정보를 줄테니 이걸로 처리 좀 해줘
  • 라는 의미가 되지만,
    • DELETE에서 URI는 리소스를 정확하게 식별하고 요청을 보내기 때문에 form을 통해 값을 전달할 게 없으며
      • 권한을 획득하기 위해선 header를 이용해야할 것 같다
    • PUT도 전송해야할 것은 대상 리소스를 대체할 representation 그 자체인데, 대상 리소스더러 조각난 form 데이터를 처리하라고 보낼 수는 없는 노릇