Get
은 서버로부터 어떤 데이터를 가져와서 보여줄 때 사용한다.
Post
는 서버로 데이터 전송을 할 때 사용한다.
위의 사진처럼 GET
요청을 전송할 때는 URL 주소 끝에 파라미터 정보를 포함하여 전송되는데,
이 부분을 쿼리 스트링이라고 한다.
ex) https://search.naver.com/search.naver?ie=UTF-8&query=this+is+get&sm=chr_hty
이 예시는 파라미터인
where
,sm
,fbm
,ie
,query
를 통해 값을 전달받는다.
위의 경우처럼 파라미터가 여러개라면 중간에&
을 적는다.
query paramater
와 비슷하게 URL의 형태로 사용되지만 경로를 변수로서 사용한다.
ex) https://search.naver.com/search.naver/UTF-8/this_is_get/chr_hty
GET
요청의 경우, 오로지 데이터를 읽기 때만 사용되고 수정할 때는 사용하지 않는다.
resource를 식별해야할 경우 : Path Variable
정렬이나 필터링을 해야하는 경우 : Query Parameter
어떤 resource를 식별해야하는 상황이라면
서버에서는 받아온 resource의 id로 쿼리를 날리게 된다.
만약 존재하지 않는 resource의 id가 들어온 경우라면 어떻게 될까?
resoure가 존재하지 않는다는 의미로 404 에러를 발생시키는 것이 적절하므로 Path variable
이 더 적합하다.
정렬이나 필터링을 해야하는 경우라면
만약 필터링 데이터가 없거나, 정의되지 않은 정렬기준이라면 어떻게 될까
필터링 또는 정렬을 하는 상황에서 404 에러는 부적절 하므로 Query Parameter
가 더 적합하다.
쿼리 스트링을 포함한 URL이기 때문에
- GET은 브라우저 기록에 남는다.
- GET은 북마크에 추가할 수 있다.
- GET은 데이터 길이에 제한이 있다.
- GET은 민감한 데이터를 다룰 때, 보안에 취약해진다.
GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다.
-> 정적 컨텐트츨 요청하고 나면 브라우저에서는 요청을 캐시해두고, 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시된 데이터를 사용한다. (js, css, 이미지 같은 정적 컨텐츠는 데이터양이 큰 반면에 변경될 일이 적어 반복해서 동일한 요청을 보낼 필요가 없기 때문)
POST
는 리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는데 사용된다.
POST
방식으로 데이터를 보낼 때는 HTTP 메세지의 Body에 담아서 전송한다.
이 때문에 GET
과 달리 대용량 데이터를 전송할 수 있으며, 전송할 데이터가 URL에 담기지 않기 때문에 보안적인 면에서 좀 더 안전하다.
단, 개발자 도구나 Fiddler 등을 통해 요청 내용을 확인할 수 있기 때문에 보안에 민감한 데이터는 반드시 암화해서 전송해야 한다.
데이터를 HTTP 메세지의 Body에 담기 때문에
POST
는 브라우저 기록에 남지 않는다.POST
는 북마크에 추가할 수 없다.POST
는 데이터 길이에 대한 제한이 없다.
POST는 데이터를 서버로 보내 값을 생성/수정 하는 일을 수행한다. 그렇기 때문에 요청이 캐시되지 않는다. (GET과 반대)