클라이언트가 서버로 request하는 방법인 HTTP Method는 2가지 방법을 많이 사용합니다. 바로 get과 post 방식입니다. 두 개를 바교해보겠습니다.
get은 말 그대로 정보를 가져와서 조회하기 위해 사용하는 방식입니다.
?id=123&age=100
"id" 와 "age" 를 key로 하여 조회하는 것을 보실 수 있습니다.
? 마크를 통해 URL의 끝을 알리고, id라는 키(Key)에 대해선 mang이라는 값(Value)를, pw라는 키(Key)에 대해서는 kyu라는 값(Value)를 전송하는 것을 볼 수 있습니다. 여러개의 Key와 Value를 보내는 경우에 &를 사용하여 이어주는 GET방식은 최소한의 보안유지도 하지 않기 때문에 실제 웹사이트에서 ID와 PW같은 중요한 정보를 GET방식으로 사용하면 개인정보가 노출되는 문제가 발생합니다. GET방식을 사용하여 데이터를 노출시키는 경우는 개인정보가 포함되지 않는 상황에서 *캐싱을 하여 속도를 높이거나 즐겨찾기를 편리하기 위해 사용되는 경우가 많습니다. 우리가 어떤 물건 a에 대해서 즐겨찾기를 추가하면 그 물건의 이름이 a라는 정보를 url에 추가하여 즐겨찾기를 생성할 수 있는 것입니다.
MangKyu's Diary에서 더 자세한 설명을 보실 수 있습니다.
get 요청은 캐시가 가능하다.(get을 통해 서버에 리소스를 요청할 때, 웹 캐시가 요청을 가로채 서버로부터 리소스를 다시 다운로드하는 대신 리소스의 복사본을 반환합니다. HTTP-Header에서 chche-control-header를 통해 캐시 옵션을 지정할 수 있습니다.)
주소에 값이 나온다.
get 요청은 브라우저 히스토리에 남는다.
get 요청은 북마크 될 수 있고, 조회가 가능하다.
/recommend/bookmark 와 같이 조회할 수 있다.
get 요청은 길이 제한이 있는데, 브라우저마다 제한이 다르다.(ms internet explorer는 2048자 제한, chrome은 37748자 제한, firefox는 100만 이상, safari는 400000만 이상, 오페라는 30만 이상 등)
get 요청은 파라미터를 노출시켜버리기 때문에 보안을 위해서 중요한 정보를 담으면 안됩니다.
민감한 정보를 담지 않게 작성한다.
/category?categoryId=3&page=3
post 방식은 주소창에 나오지 않습니다.
POST는 클라이언트에서 서버로 리소스를 생성하거나 업데이트하기 위해 데이터를 보낼 때 사용 되는 메서드입니다. 예를들면 게시판에 게시글을 작성하는 작업 등을 할 때 사용합니다.
POST는 전송할 데이터를 HTTP 메시지 body 부분에 담아서 서버로 보냅니다. ( body 의 타입은 Content-Type-header에 따라 결정)
GET에서 URL 의 파라미터로 보냈던 name1=value1&name2=value2 가 body에 담겨 보내진다 생각하면 됩니다.
POST 로 데이터를 전송할 때 길이 제한이 따로 없어 용량이 큰 데이터를 보낼 때 사용하거나 GET처럼 데이터가 외부적으로 드러나는건 아니라서 보안이 필요한 부분에 많이 사용됩니다.
( 하지만 데이터를 암호화하지 않으면 body의 데이터도 결국 볼 수 있습니다.)
POST를 통한 데이터 전송은 보통 HTML form 을 통해 서버로 전송됩니다.
캐시되지 않는다.
브라우저 히스토리에 남지않는다.
북마크되지 않는다.
데이터 길이에 제한이 없다.
주소에 값이 나타나지 않는다.
목적 : get은 서버의 리소스에서 데이터를 요청할 때, post는 서버의 리소스를 새로 생성하거나 업데이트할 때 사용
body 유무 : get은 url파라미터에 요청하는 데이터를 담아 보내기 때문에 HTTP message에 body가 없다. 하지만 post는 body에 데이터를 담아 보내서 HTTP message에 body가 존재한다.
불변성 : get은 리소스를 조회하기만 하기 때문에 여러번 요청해도 response가 똑같다. post는 리소스를 새로 생성하거나 업데이트할 때 사용되므로 response가 달라진다.(서버가 변경될 수 있다)
긴 파일이나 이미지 : post가 데이터 길이에 제한이 없기 때문에 긴 내용이나 그림파일일 경우 post, 간단한 텍스트 내용은 get으로 넘긴다.
참고 자료
https://korbillgates.tistory.com/182
https://noahlogs.tistory.com/35
https://www.w3schools.com/tags/ref_httpmethods.asp
https://blog.outsider.ne.kr/312
https://mangkyu.tistory.com/17
https://developer.mozilla.org/ko/docs/Web/HTTP/Caching