구글링을 통해 얻은 정보와 지식을 바탕으로 정리하여 글을 작성해보았습니다. (출처 : https://mangkyu.tistory.com/17, https://hongsii.github.io/2017/08/02/what-is-the-difference-get-and-post/)
고객이 웹 페이지에 접속하기 위해서는
URL(Uniform Resource Locator)을 브라우저 주소창에 입력 -> Enter -> 웹 페이지 접속이 성공!
고객은 URL만 입력했을 뿐, 서버 내부에서는 클라이언트의 요청에 응답하기 위해(웹 페이지 호출) 많은 처리를 수행해야한다. 여기서 클라이언트가 서버로 요청을 보내는 방법에 크게 2가지 방식이 있다. 바로 GET과 POST 방식이다.
단어 의미 그대로 '가져오다'라는 의미로 필요한 정보를 얻기 위해 어떠한 정보를 가져와서 조회하기 위해서 사용되는 방식
(Ex) 우리가 필요한 정보를 얻기 위해 도서관에서 책을 빌려 가져오는 상황과 유사
[특징]
URL에 변수(데이터)를 포함시켜 요청한다.
데이터를 Header에 포함하여 전송한다.
URL에 데이터가 노출되어 보안에 취약하다.
(Ex) http://hun.com/login?id=hun&pw=1111
-> id와 pw가 노출되어 보안에 취약하다!전송하는 길이에 제한이 있다.
캐싱 가능
GET방식은 간단한 데이터를 URL에 넣어 전송하도록 설계되어 있다. 따라서 데이터를 보내는 양에 한계가 있다. URL의 길이는 정해져 있다. 따라서 많은 양의 정보를 전달할 수 없고 URL형식에 맞지 않는 파라미터 이름이나 값은 인코딩되어 전달해야한다.
단어 의미 그대로 '제출하다'라는 의미로 데이터를 서버로 제출하여 추가, 수정하기 위해 사용하는 방식이다.
(Ex) 회사 인사팀에 서류(나에 대한 정보)를 제출하여 데이터를 추가하는 상황과 유사
[특징]
URL에 데이터(변수)를 노출하지 않고 요청한다.
데이터를 Body에 포함시킨다.
URL에 데이터가 노출되지 않아서 보안성이 GET보다 뛰어나다.
전송하는 길이에 제한이 없다.
캐싱 불가능
POST는 리소스를 생성, 변경하기 위해 설계되었다. GET과 달리 전송해야할 데이터를 HTTP 메세지의 Body에 담아서 전송한다. HTTP 메세지의 Body는 길이의 제한이 없어 많은 양의 데이터를 전송할 수 있다. 즉 대용량의 데이터를 전송할 수 있다. 이에 POST가 GET에 비해 많은 양의 데이터 전송가능, 보안성도 좋아 GET보다 훨씬 좋다고 생각할 수 있으나 POST방식도 크롬 개발자 도구(F12)와 같은 도구로 데이터의 정보를 확인할 수 있기 때문에 은닉해야할 데이터는 반드시 암호화하여 전송해야한다.
GET : Idempotent
POST : Non-Idempotent
Idempotent란?
멱등이란 의미로 수학적 개념으로 표현하면
수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질
즉, 멱등이란 동일한 연산을 여러 번 수행하더라도 동일한 결과가 출력되는 것을 의미한다.
GET은 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아오도록 설계되었다. 따라서 GET은 설계원칙에 따라 서버의 데이터나 상태를 변경시키지 않아야 Idempotent하므로 주로 조회를 할 때에 사용한다. 웹 페이지를 열어 게시글을 읽거나 조회를 하는 행위는 GET으로 요청하게 된다.
POST는 서버에게 동일한 요청을 여러 번 전송하여도 응답은 항상 다를 수 있다. 따라서 서버의 상태나 데이터를 변경시킬 때 사용한다. 게시글을 작성하면 서버에 게시글이 저장되고, 게시글을 삭제하면 해당 데이터가 없어지는 동작은 POST로 요청하여 서버의 무언가는 변경이 되도록 한다. 이처럼 POST는 생성, 수정, 삭제에 사용할 수 있으나 정확히 생성에는 POST방식, 수정은 PUT방식 또는 PATCH방식, 삭제는 DELETE 방식이 용도에 더 맞는 메소드라고 할 수 있다.
GET과 POST는 설계원칙에 따라 적절히 사용해야 한다!!