GET과 POST를 설명하기 전에 HTTP부터 알고 넘어가자.
네이버 지식백과에서는 HTTP를 다음과 같이 설명하고 있다.
http는 1989년 팀 버너스 리(Tim Berners Lee)에 의하여 처음 설계되어 인터넷을 통한 월드 와이드 웹(World-Wide Web) 기반에서 전 세계적인 정보공유를 이루는데 큰 역할을 하였다. http의 첫번째 버전은 인터넷을 통하여 가공되지 않은 데이터를 전송하기 위한 단순한 프로토콜이었으나, 데이터에 대한 전송과 요구·응답에 대한 수정 등 가공된 정보를 포함하는 프로토콜로 개선되었다.
[네이버 지식백과] HTTP hypertext transfer protocol
즉, 인터넷에서 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위해 사용되는 통신 규약으로 데이터의 전송과 요구·응답 등에 대한 수행등이 일어난다.
이때 HTTP의 메소드를 이용해 수행이 일어나게 되는데 오늘 알아볼 GET과 POST가 HTTP 메소드에 속한다.
GET은 서버로부터 정보를 조회하기 위해 설계된 메소드다.
GET은 요청을 전송할 때 필요한 데이터를 Body가 아닌 Query String을 통해 전송한다.
URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 Query String이라고 부르는데 만약 요청 파라미터가 여러개라면 &으로 연결한다.
예를 들자면 쿼스트링을 통한 URL에서 요청 파라미터명이 param1과 param2이고, 각각의 파라미터는 value1, value2라는 값으로 서버에 요청을 보낸다고 할 때 다음과 같다.
www.coding.com/resources?param1=value1& param2=value2
그리고 GET 방식은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있어 js나 css, 이미지 같이 데이터 양이 크고 변경될 일이 적은 정적 컨텐츠들은 반복적으로 동일한 요청을 보낼 필요가 없기 때문에 브라우저에 요청을 캐시해두고 동일한 요청이 발생하면 캐시된 데이터를 사용하게 된다. 이때 정적 컨텐츠가 캐시돼 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 발생할 수 있으니 주의하여야 한다. 만일 브라우저의 캐시를 지워주면 서버로 요청을 보내게 된다.
POST는 리소스를 생성/변경하기 위해 설계되어 GET과 달리 데이터를 HTTP 메세지의 Body에 담아 전송하게 된다. HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있어서 POST의 요청은 GET과 달리 대용량 데이터를 전송할 수 있다. GET과 마찬가지로 크롬 개발자 도구 등과 같은 툴로 요청 내용을 확인할 수 있으니 민감한 데이터의 경우 암호화가 필요하다.
POST 또한 GET처럼 URL의 query를 이용해 데이터를 가져올 수 있지만(필터링 제한 등) 일반적인 URL링크, 북마크 등을 통해 POST의 데이터 전송방식인 request body를 URL에 나타낼 수 없다.
GET과 POST의 가장 큰 차이는 바로 멱등성(idempotent)이다.
멱등성은 수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.
즉, 동일한 연산을 반복 하더라도 결과가 항상 같은지 아닌지라고 볼 수 있다.
GET은 멱등(idempotent)하게 설계되어 서버에 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야한다. 따라서 GET은 서버의 데이터나 상태를 변경시키지 않아야하기 때문에 데이터를 조회하는 경우에 주로 사용된다. 예를 들어, 게시글을 읽는 등의 행위를 말한다.
POST는 멱등하지 않게(Non-idempotent) 설계되었기 때문에 서버에 동일한 요청을 여러 번 전송한다면 응답이 다를 수 있다. 이에 따라 POST는 서버의 상태나 데이터를 변경시킬 때 주로 사용된다. 예를 들어, 게시글을 작성하여 서버에 저장이 되고, 게시글을 삭제하면 데이터가 없어지는 등 POST를 통한 요청은 데이터의 변경이 일어나게 된다. 따라서 POST는 주로 생성, 수정, 삭제 등에 이용될 수 있지만 생성은 POST, 수정은 PUT, 삭제는 DELETE라는 각각의 용도에 맞는 메소드들을 사용한다.
따라서 GET과 POST는 역할에 차이가 있기 때문에 설계원칙에 따라서 사용해야 한다.
출처 : hongsii github