RecoPick



안녕하세요. 레코픽팀 정재훈입니다.


오늘은 너무나도 당연해서 잊고 살았던 내용들에 대해서 복습을 해볼까 합니다.


HTTP GET과 POST의 차이점을 복습하고. GET, POST가 어떻게 명세 되어 있는지 확인 해보도록 하겠습니다.


HTTP (HyperText Transfer Protocol)는 서버와 클라이언트간에 통신을 위해 설계 되었습니다. 


요청 - 응답 프로토콜을 이용해 통신을 하는데요


HTTP 명세상에 Get과 Post는 아래와 같은 형태로 사용하라고 되어 있습니다. 


Get : 특정 리소스로 부터 데이터를 요청


GET


/blog/entry/1?rate=3&comment=2



Post: 특정 리소스에 데이터를 제출 


POST


POST /blog/post HTTP/1.1

Host:blog.recopick.com

post=글내용&title=글제목



GET 과 POST의 차이점

 

 GET

POST 

 브라우저 리로드

 동의없이 요청

 브라우저가 다시 전송할 지 물음

 브라우저 북마크

 가능

 불가능

 브라우저 히스토리

 가능

 불가능

 인코딩 타입

 application/x-www-form-urlencoded

 다양(multipart, json, xml, custom)  

 데이터 캐쉬

 캐쉬될 수 있음

 불가능 

 데이터 길이제한

 URL 길이가 2048로 제한 

 제한 없음 

 데이터 타입제한

 String만

 제한 없음 (바이너리 가능) 

 보안

 data가 URL상에 다 노출.

- 브라우저 북마크 될 수 있으며 ,히스토리에 남음. 

- 웹서버 로그에 데이터 저장됨.

Get가 비교했을 때 상대적으로 안전함.

- 브라우저 북마크, 히스토리에 데이터 노출 X

- 웹서버 로그에 데이터 저장 X

 가시성

 데이터 요청 형태가 URL에 다 보임

 안보임

 Idempotent method

 YES

 NO

 Safe method

 YES 

 NO 


* Safe method는 HTTP method중 resource를 수정하지 않는 method를 뜻합니다. 오해하시면 안되는 것은 Get method가 resource를 수정하지 않는다는 것을 뜻하는게 아니구요. resource를 수정하는 데 쓰지 말라는 뜻입니다.

 

idempotence (멱등성) 은 수학이나 전산학에서 연산의 성질 중 하나로 여러번 적용하더라도 결과가 달라지지 않는 것을 의미 합니다. 예를 들자면 abs(abs(x)) , 1x1 , max(x,x)등이 있습니다. 따라서 idempotent HTTP method는 여러번 요청해도 결과 값이 달라지지 않는 것을 의미 합니다.

HTTP 명세상으로는 GET은 데이터 요청 , POST는 데이터 제출로 둘이 하는 역할이 다르지만 GET도 데이터를 제출, 요청에 사용할 수 있습니다. 


하지만 명세와 다르게 Get을 non-safe , non-idempoent하게 사용할 경우에는 매우 주의해야 합니다. 

예를 들면, middleware에 프록시가 있고 Safe method (GET)으로 리소스를 수정하는 경우에 문제가 발생할 수 있습니다. http://api/article/1/rateup이라는 GET Method로 리소스를 변경 할 경우 이미 이전에 동일한 method가 다른사람에 의해 호출 되었다면 서버로 전송되지 않고 프록시에서 캐쉬 값을 바로 클라이언트에 전달하는 경우가 발생할 수 있습니다.  

 

그리고 가시성 부분 때문에 데이터를 제출 하는 경우에도 GET을 선호하는 분들이 있습니다. 보안상의 위험, 안전성 을 포기하더라두요.


HTTP 명세상에서 용도를 정해둔 것은 잠재적인 위험으로부터 보호하기 위한 것입니다.


GET은 Idempotent, Safe method라고 명세한 것은 일종의 규약인데 이걸 non idempotent, non safe 하게 쓰면 진짜 괴팍한 겁니다.


당연한 내용이 너무 길어 졌네요.


한줄 요약 들어갑니다.  POST는 Create , Get은 Read. 다른 용도로 쓰지말자.


다음에는 Hapi.js 2부나 REST API Versioning에 대해 글을 쓸 예정입니다. 


참고 (https://github.com/for-GET/know-your-http-well/blob/master/methods.md)

methoddescriptionsafeidem.cache.spec
CONNECT"requests that the recipient establish a tunnel to the destination origin server identified by the request-target and, if successful, thereafter restrict its behavior to blind forwarding of packets, in both directions, until the connection is closed."RFC7231#4.3.6,
RFC2616#9.9
DELETE"requests that the origin server remove the association between the target resource and its current functionality."RFC7231#4.3.5,
RFC2616#9.7
GET"requests transfer of a current selected representation for the target resource."RFC7231#4.3.1,
RFC2616#9.3
HEAD"is identical to GET except that the server MUST NOT send a message body in the response (i.e., the response terminates at the end of the header block)."RFC7231#4.3.2,
RFC2616#9.4
OPTIONS"requests information about the communication options available on the request/response chain identified by the effective request URI."RFC7231#4.3.7,
RFC2616#9.3
POST"requests that the target resource process the representation enclosed in the request according to the resource's own specific semantics."RFC7231#4.3.3,
RFC2616#9.5
PUT"requests that the state of the target resource be created or replaced with the state defined by the representation enclosed in the request message payload."RFC7231#4.3.4,
RFC2616#9.6
TRACE"is used to invoke a remote, application-layer loopback of the request message."RFC7231#4.3.8,
RFC2616#9.8





Posted by recopick
TAG , , ,