HTTP로 웹에서 통신할 때 클라이언트에서 서버에 요청하는 방식에는 여러가지가 있다.
일반적으로는 조회 목적으로 GET 방식을, 생성/수정/삭제 목적으로 POST 방식을 사용.
1. GET
- header만 존재하고, body가 없음
- get 요청에 대한 부가적인 데이터는 QueryString과 header로만 전달 가능
- URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 담음. &으로 여러개를 연결
- 파일 업로드 불가 : QueryString 포맷에는 파일을 담을 수 없음
- 불필요한 요청을 제한하기 위해 요청이 캐시(cache)될 수 있음
- 예를 들어 js, css, 이미지 같은 정적 컨텐츠는 데이터가 크고 변경될 일이 적어서 동일한 요청을 보낼 필요가 없음.
따라서 브라우저에서 요청을 캐시해두고 동일한 요청 발생 시 캐시 데이터를 그대로 사용
2. POST
- 리소스를 생성/변경하기 위해 설계됨
- 요청에 대한 부가적인 데이터는 QueryString과 header 뿐만 아니라 body에 담아 전달 가능
- 요청 패킹에 body가 있기에 파일 업로드 가능
- 조회에 사용할 수는 있지만, POST 요청은 캐싱이 불가.
- 따라서 매번 DB 조회가 발생하여 다량의 건 혹은 대량의 데이터 조회시 비효율적
- POST로 request 시, 요청 헤더의 Content-Type에 요청하는 데이터의 타입을 표시해야함.
표시하지 않을 시 서버에서 데이터 타입을 유추해서 전달.
3. GET과 POST의 차이
GET은 Idempotent, POST는 Non-idempotent하게 설계됨
Idempotent(멱등)은 수학적 개념으로 다음과 같이 나타낼 수 있습니다.
수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질
즉, 멱등이라는 것은 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야한다는 것이다.
GET이 Idempotent하도록 설계되었다는 것은 GET으로 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야 한다는 것을 의미한다. 이에 따라 GET은 설계원칙에 따라 서버의 데이터나 상태를 변경시키지 않아야 Idempotent하기 때문에 주로 조회를 할 때에 사용해야한다. 예를 들어, 브라우저에서 웹페이지를 열어보거나 게시글을 읽는 등 조회를 하는 행위는 GET으로 요청하게 됩니다.
반대로 POST는 Non-idempotent하기 때문에 서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있다. 이에 따라 POST는 서버의 상태나 데이터를 변경시킬 때 사용된다. 게시글을 쓰면 서버에 게시글이 저장이 되고, 게시글을 삭제하면 해당 데이터가 없어지는 등 POST로 요청을 하게 되면 서버의 무언가가 변경하여 응답한다. 이처럼 POST는 생성, 수정, 삭제에 사용할 수 있지만, 생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메소드라고 할 수 있다.
* 참고 : 장고 설계철학으로 시작하는 파이썬 장고 입문. by 이진석,
https://hongsii.github.io/2017/08/02/what-is-the-difference-get-and-post/
'ETC' 카테고리의 다른 글
[네트워크] http 패킷과 메서드 (0) | 2024.01.18 |
---|