GET 과 POST의 차이
저번 HTTP 프로토콜, TCP/IP를 쭉 훑으면서 GET과 POST방식에 대해서 학습하려고 한다.
결국은 GET과 POST, XML, Soap이 궁금해서 시작된 학습이지만, 기초부터 다시 다져보자 하는 마음에 처음부터 글을 작성해 나갔다. 이제야 GET과 POST에 대해서 학습하려고 한다. GET과 POST는 개발까지 같이 학습할 예정이다.
GET
HTTP/1.1 스펙인 RFC2616의 Section9.3에 따르면 GET은 서버로부터 정보를 조회하기 위해 설계된 메소드 입니다.
GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송합니다. URL의 끝에 ? 와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 쿼리스트링이라고 합니다. 만약, 파라미터가 여러 개이면 &로 연결합니다. 쿼리스트링을 사용하게 되면 URL에 조회 조건을 표시하기 때문에 특정 페이지를 링크하거나 북마크 할 수 있습니다.
* 쿼리 스트링(Query String) : URL 끝에 "?"와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 말한다.
쿼리스트링을 포함한 URL의 샘플은 아래와 같습니다. 여기서 요청 파라미터명은 name1, name2이고, 각각의 파라미터는 value2, value2라는 값으로 서버에 요청을 보내게 됩니다.
그리고 GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있습니다. JS, CSS, 이미지 같은 정적 콘텐츠는 데이터양이 크고, 변경될 일이 적어서 반복해서 동일한 요청을 보낼 필요가 없습니다. 정적 컨텐츠를 요청하고 나면 브라우저에서는 요청을 캐시 해두고, 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시 된 데이터를 사용합니다. 그래서 프론트엔드 개발을 하다 보면 정적 컨텐츠가 캐시 돼 콘텐츠를 변경해도 내용이 바뀌지 않는 경우가 종종 발생합니다. 이 때는 브라우저의 캐시를 지워주면 다시 컨텐츠를 조회하기 위해 서버로 요청을 보내게 됩니다.
오로지 데이터를 읽거나(Read), 검색(Retrieve)할 때만 사용되고 수정할 때는 사용되지 않는다.
즉, 데이터의 변형의 위험 없이 사용할 수 있다.
GET 요청에 대한 참고 사항
- GET은 불필요한 요청을 제한하기 위해 요청이 캐시 될 수 있다.
- 파라미터에 내용이 노출되기 때문에 민감한 데이터를 다룰 때 GET요청을 사용해서는 안된다.
- GET요청은 브라우저에 기록이 남는다.
- GET요청을 북마크에 추가할 수 있다.
- GET요청은 데이터 길이에 대한 제한이 있다.
- GET요청은 성공시 200OK 응답코드를 XML, JSON 등 여러 데이터, 여러 형식의 데이터와 함께 반환이 된다.
- GET 요청은 Idempotent하다.
POST
POST는 리소스를 생성/변경하기 위해 설계되었기 때문에 GET과 달리 전송해야될 데이터를 HTTP메시지의 Body에 담아서 전송합니다. HTTP 메시지의 Body는 길이의 제한 없이 데이터를 전송할 수 있습니다. 그래서 POST요청은 GET과 달리 대용량 데이터를 전송할 수 있습니다. 이처럼 POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 GET보다 보안적인 면에서 안전하다고 생각할 수 있지만, POST 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 합니다.
그리고POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 합니다. 데이터 타이블 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추합니다. 만약, 알 수 없는 경우에는 application/octet-stream 로 요청을 처리합니다.
POST요청에 대한 참고사항
- POST요청은 캐시되지 않는다.
- POST요청은 브라우저 기록에 남아 있지 않다.
- POST요청을 북마크에 추가할 수 없다.
- POST요청은 데이터 길이에 제한이 없다.
- POST요청 중 자원 생성은 201(Created) HTTP 응답 코드를 반환한다.
- POST요청은 Idempotent하지 않는다.
GET과 POST의 차이
GET은 ldempotent, POST는 Non-idempotent 하게 설계되어 있습니다.
Idempotent는 수학적 개념으로 다음과 같이 나타낼 수 있습니다.
"수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질입니다."
즉, 멱등이라는 것은 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야 합니다.
여기서 GET이 Idempotent하도록 설계되었다는 것은 GET으로 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야 한다는 것을 의미합니다. 이에 따라 GET은 설계원칙에 따라 서버의 데이터나 상태를 변경시키지 않아야 Idempotent 하기 때문에 주로 조회를 할 때에 사용해야 합니다. 예를 들어, 브라우저에서 웹페이지를 열어보거나 게시글을 읽는 등 조회를 하는 행위 GET으로 요청하게 됩니다.
반대로 POST는 Non-idempotent 하기 때문에 서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있습니다.
이에 따라 POST는 서버의 상태나 데이터를 변경시킬 때 사용하게 됩니다. 게시글을 쓰면 서버에 게시글이 저장되고, 게시글을 삭제하면 해당 데이터가 없어지는 등 POST로 요청을 하게 되면 서버의 무언가는 변경되도록 사용됩니다.
이처럼 POST는 생성, 수정, 삭제에 사용할 수 있지만, 생성에는 POST, 수정는 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메서드라고 할 수 있습니다.
참고자료
https://hongsii.github.io/2017/08/02/what-is-the-difference-get-and-post/