GET | POST | |
---|---|---|
정의 | 클라이언트가 서버에게 어떤 리소스로부터 정보를 요청하기 위해 사용되는 메소드 | 클라이언트가 서버에게 (리소스를 생성/업데이트하기 위해) 어떤 데이터를 전송하는 메소드 |
기능 | 데이터 읽기, 검색 | 데이터 추가, 수정 |
데이터의 위치 | 요청 헤더(Header) | 요청 바디(Body) |
전송 방식 | URL 주소 끝에 변수(쿼리 스트링)를 포함시켜 전송한다. (URL 노출) | 데이터를 HTTP 메세지의 Body에 담아서 전송한다. (URL에 노출하지 않고 요청) |
데이터 전송량 | 간단한 데이터를 URL에 넣도록 설계된 방식으로 데이터 전송량에 한계가 있다. | * HTTP 메시지의 Body는 길이의 제한없이 데이터를 전송할 수 있어 대용량 데이터 전송 가능. * 그러나 최대 요청 시간 Time Out이 존재 → 클라이언트가 페이지를 요청하고 기다리는 시간) |
Content-Type | * 특별히 전송하는 데이터가 없어 body는 보통 빈 상태로 전송됨. * 또한 Content-type 헤더필드도 들어가지 않음. | * 헤더 중 Body의 데이터를 설명하는 Content-Type이라는 헤더 필드가 들어가고, body의 데이터 타입을 명시해줘야 한다. |
캐싱 (한번 접근 후, 또 요청할 때 빠른 접근을 위해 레지스터에 데이터를 저장시켜 놓는 것) | 캐싱 가능 URL에 데이터가 노출되므로, 캐싱을 하여 속도를 높이거나 즐겨찾기, 북마크 등 추가 가능함 | 캐싱 불가능 * URL에 데이터가 노출되지 않으므로 즐겨찾기, 북마크 불가능. * 하지만 쿼리스트링(문자열)데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송 가능 |
보안 | URL에 데이터가 노출되기 때문에 보안에 취약하다. (민감한 데이터는 GET 요청을 사용하지 않음) | POST는 BODY에 숨겨서 보내는 방식으로, GET 방식보다 비교적 덜 공개적이기 때문에 아이디, 패스워드 같이 중요한 정보를 보낸다. 그러나 완전히 안전하진 않으므로, http 프로토콜의 암호화된 버전인 HTTPS를 사용한다. |
GET, POST 메소드 모두 데이터 전송과 요청이 가능한데, 어떤 이유로 ‘GET’은 주로 조회, ‘POST’는 수정할 때 사용해야 한다는 걸까?
GET
은 Idempotent, POST
는 Non-idempotent하게 설계되었기 때문이다.
여기서 ‘Idempotent’는 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나는 것을 뜻한다.
dempotent하도록 설계된 GET 방식은 서버에게 동일한 요청을 여러 번 전송해도 동일한 응답이 돌아와야 하고,
Non-idempotent하게 설계된 POST는 동일한 요청을 여러 번 전송해도 응답이 항상 다를 수 있다.
따라서 GET은 서버의 데이터나 상태를 변경하지 않아야 Idempotent를 유지하므로 주로 조회할 때 사용하고,
POST는 응답이 달라도 되니 서버의 상태나 데이터를 변경할 때 사용된다.
https://velog.io/@songyouhyun/Get과-Post의-차이를-아시나요
https://mangkyu.tistory.com/17
https://betterprogramming.pub/understand-the-flow-of-a-http-request-1a268ec193f0