REST - HTML Form에서 GET/POST만 지원하는 이유
연재 목록
- REST - 긴 여정의 시작
- REST - HTML Form에서 GET/POST만 지원하는 이유
- REST - 논문(요약) 훑어보기
- REST - REST 좋아하시네
- REST - Roy가 입을 열다
- REST - 당신이 만든 건 REST가 아니지만 괜찮아
- 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의 가장 큰 차이
- 따라서
- GET은 form에 있는 정보를 줄테니 나에게 리소스(representation)를 줘
- POST는 form에 있는 정보를 줄테니 이걸로 처리 좀 해줘
- 라는 의미가 되지만,
- DELETE에서 URI는 리소스를 정확하게 식별하고 요청을 보내기 때문에 form을 통해 값을 전달할 게 없으며
- 권한을 획득하기 위해선 header를 이용해야할 것 같다
- PUT도 전송해야할 것은 대상 리소스를 대체할 representation 그 자체인데, 대상 리소스더러 조각난 form 데이터를 처리하라고 보낼 수는 없는 노릇
- DELETE에서 URI는 리소스를 정확하게 식별하고 요청을 보내기 때문에 form을 통해 값을 전달할 게 없으며