본문 바로가기
Programming/Network&Server

[HTTP] GET과 POST 차이

by eungbbang 2024. 1. 13.
반응형

 

 

GET과 POST 모두 클라이언트에서 서버에 요청을 전송하는 HTTP 메소드이다.

그 중에서도 GET은 데이터를 읽기 위해, POST는 데이터를 생성하기 위해 사용된다.

 


GET 방식

GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고 쿼리스트링을 통해 전송한다.

 

* 쿼리 스트링(QueryString) 

url의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터

요청 파라미터가 여러개면 &로 연결한다.

www.example-url.com/resources?name1=value1&name2=value2

base url www.example-url.com
특정 페이지 /resources
쿼리 시작 ?
요청 파라미터명 name1 = 파라미터 value1
연결 &
요청 파라미터명 name2 = 파라미터 value2

 

쿼리 스트링을 사용하게 되면 url에 조회 조건을 표시하기 때문에 특정 페이지를 링크하거나 북마크 할 수 있다.

이렇게 쿼리를 사용하는 것에서 눈치 챌 수 있듯이, GET은 쉽게 말해 무언가를 '조회'하기 위해 주로 사용된다.

 

또한 GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다.

js, css, 이미지와 같은 정적 컨텐츠는 데이터양이 크고, 변경될 일이 적기 때문에 캐시에 저장해두었다가 이후 같은 요청이 들어오면 서버에 요청을 다시 보내지 않고 캐시된 데이터를 사용한다.

때문에 정적 컨텐츠가 브라우저에 캐시되어 서버에서 컨텐츠를 변경하더라도 적용되지 않는 상황이 발생하는데, 이때 브라우저의 캐시를 지우면 저장된 데이터가 없으므로 서버에 재요청 하게 된다.

 

이 밖에도 길이 제한이 있고, 외부에서 쿼리를 쉽게 확인 할 수 있으므로 보안을 위해 중요한 정보를 담지 않는 것이 좋다.

 


POST 방식

POST는 리소스를 생성/변경하기 위해 설계되었으므로, 전송할 데이터를 HTTP의 Body에 담아서 전송한다.

이때 Body는 길이의 제한을 받지 않기 때문에 GET과 달리 대용량의 데이터를 전송할 수 있다. 또한 Body의 경우에도 크롬 개발자 도구 등으로 요청 내용을 확인 할 수 있으므로, 민감한 데이터의 경우 반드시 암호화하여 전송해야한다.

 

POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 한다.

데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추하며, 알 수 없는 경우에는 application/octet-stream로 요청을 처리한다.

 

생성, 수정, 삭제에 모두 POST를 사용하는 것이 가능하지만,

가급적이면 생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE를 사용한다.

 


GET vs POST

 

사용 목적

GET : 서버에 리소스에서 데이터를 요청할 때 (SELECT)

POST: 서버의 리소스를 새로 생성 할 때 (CREATE)

 

전송 방식

GET: URL 파라미터에 요청하는 데이터를 담아 쿼리로 전송 (쿼리스트링)

POST: HTTP 메시지 Body에 데이터를 담아 전송

 

멱등성(idempotent): 동일한 연산에 동일한 결과

GET: Idempotent(멱등) - 결과가 매번 같음

POST: Non-idempotent(멱등하지 않음) - 결과가 매번 같지 않을 수 있음

 

GET은 조회이기 때문에 같은 쿼리에 같은 데이터를 응답 받을 가능성이 높다.

반면 POST는 서버의 상태나 데이터를 변경시킬 때 사용되므로, 데이터가 매번 같을 것이라는 보장이 없다.

 


참고

 

GET과 POST의 차이

HTTP HTTP는 웹상에서 클라이언트와 서버 간에 요청/응답으로 데이터를 주고 받을 수 있는 프로토콜입니다. 클라이언트가 HTTP 프로토콜을 통해 서버에게 요청을 보내면 서버는 요청에 맞는 응답을

hongsii.github.io

 

 

 

반응형

'Programming > Network&Server' 카테고리의 다른 글

[Spring Boot] spring initializr 사용하기  (0) 2022.01.17
[Spring Boot] IntelliJ 설치하기  (0) 2022.01.17

댓글