웹을 지탱하는 기술 04
POST vs PUT
POST와 PUT은 둘 다 비슷한 기능을 구현할 수 있다.
POST
POST로 리소스를 작성할 경우, 클라이언트는 리소스의 URI를 지정할 수 없다.
URI의 결정권은 서버측에 있다.
글을 포스팅하는 경우 그 글의 URI는 서버가 결정한다.
PUT
PUT으로 리소스를 작성할 경우, 리소스의 URI는 클라이언트가 결정한다.
WIKI의 수정은 클라이언트가 결정한 타이틀이 그래도 URI가 된다. 이 경우는 PUT이 적합하다.
단 PUT은 리소스가 중복되어 덮어쓰기 되는 것을 방지하기 위해 클라이언트에서 사전에 URI 존재 여부를 체크해야 할 수도 있다.
일반적으로 클라이언트가 적합한 URI를 결정하기 위해선 클라이언트단이 서버 내부 구조를 숙지하고 있어야 한다. 이런 점 때문에 PUT이 서버 단과 더 밀접하고, 특별한 이유가 없는 한 리소스 작성은 POST로 수행해 URI를 서버 측에서 결정하는 설계가 바람직하다.
GET과 POST밖에 사용이 안되는 상황에서 PUT과 DELETE를 사용하려면?
1. _method 파라미터를 이용한다
form의 숨겨진 파라미터 "hidden"을 이용한다.
<form action="#" method="post">
<input type="hidden" name="_method" value="put" />
</form>
2. X-HTTP-Method-Override 를 사용한다.
POST /articles
X-HTTP-Method-Override=PUT
---payload---
title=...&content=...
조건부 요청
If-Modified-Since 헤더를 사용해 GET 리소스가 이 시간 이후 갱신되어 있으면 GET 한다는 의미를 보낸다.
PUT과 조합하면 이 시간 이후로 갱신되어 있지 않으면 리소스를 갱신한다는 의미다.
멱등성과 안정성
<table style="border-collapse: collapse; width: 100%;" border="1"><tbody><tr><td style="width: 50%;">메서드</td><td style="width: 50%;">성질</td></tr><tr><td style="width: 50%;">GET, HEAD</td><td style="width: 50%;">멱등이고 안전하다</td></tr><tr><td style="width: 50%;">PUT, DELETE</td><td style="width: 50%;">멱등이지만 안전하지 않다</td></tr><tr><td style="width: 50%;">POST</td><td style="width: 50%;">멱등이지도 안전하지도 않다</td></tr></tbody></table>
멱등
동일한 조작을 반복해도 결과가 동일하다
안전
동일한 조작을 반복해도 리소스의 상태를 변화시키지 않는다
HTTP Method를 각각의 성질과 특징에 맞춰 사용하는 것이 바람직하다.
<table class="tt-plugin-interpark" style="background: #fff; border: 1px solid #e0e0e0; width: 408px;" border="0" width="100%" cellspacing="0"><tbody><tr><td style="vertical-align: top; padding: 10px 0 10px 10px;" width="70"><a href="http://book.interpark.com/blog/integration/product/itemDetail.rdo?prdNo=208294208&refererType=8303&bookblockname=bpmain_in&booklinkname=wg_search_EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB&key=EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB" target="_blank" rel="noopener"><img style="border: 0 none;" src="http://bimage.interpark.com/goods_image/4/2/0/8/208294208h.jpg" width="66" height="90"></a></td><td style="vertical-align: top; padding: 10px 10px 10px 15px;"><dl style="margin: 0; padding: 2px 0 0 0; list-style: none; font: 11px dotum, sans-serif; letter-spacing: -1px; color: #777;"><dt style="padding: 0; margin: 0;"><a style="font-size: 12px; color: #444 !important; font-weight: bold; text-decoration: none !important;" href="http://book.interpark.com/blog/integration/product/itemDetail.rdo?prdNo=208294208&refererType=8303&bookblockname=bpmain_in&booklinkname=wg_search_EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB&key=EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB" target="_blank" rel="noopener">웹을 지탱하는 기술</a></dt><dd style="padding: 7px 0 0 0; margin: 0; color: #a0a0a0;">국내도서</dd><dd style="padding: 17px 0 0 0; margin: 0;">저자 : 야마모토 요헤이(Yamamoto Yohei) / 김성훈역</dd><dd style="padding: 4px 0 0 0; margin: 0;">출판 : 멘토르출판사 <span style="letter-spacing: normal;">2011.05.30</span></dd></dl><a style="float: right; width: 44px; height: 11px; background: url('//t1.daumcdn.net/tistory_admin/static/images/icon_ipark_detail.gif') no-repeat; overflow: hidden; display: block; text-indent: -1000em;" href="http://book.interpark.com/blog/integration/product/itemDetail.rdo?prdNo=208294208&refererType=8303&bookblockname=bpmain_in&booklinkname=wg_search_EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB&key=EFEB8364BC43711681CC6C69032386A3753E74A4F9E4F62B3FA06C4836C10BAB" target="_blank" rel="noopener">상세보기</a></td></tr></tbody></table>