-
GET과 POST웹 프로그래밍/BE(Back-End) 2021. 7. 3. 23:04
GET과 POST는 HTTP 통신에서 가장 많이 사용되는 HTTP Methods로 서버와 클라이언트가 통신하는데 정해진 기능을 제공한다.
여기서 HTTP는 무엇일까?
HTTP는 Hypertext Transfer Protocol의 약어로 클라이언트와 서버 사이에 통신이 가능하도록 고안된 프로토콜이다.
HTTP는 클라이언트와 서버사이에서 요청과 응답을 주고받을 수 있는 역할을 한다.
예를 들어, 웹 브라우저(클라이언트)가 HTTP 요청을 웹 서버(서버)로 보내게 되면 웹 서버는 브라우주에게 요청에 대한 응답을 보낼 수 있다.
그러면 지금부터 GET과 POST에 대해서 알아보자.
먼저, GET은 무엇일까?
GET은서버로부터 정보를 조회하기 위해설계된 메소드이다.
GET을 통한 요청은 필요한 데이터를 Body에 담지 않고 URL 주소 끝에 파라미터로 포함되어 전송되며 이 부분을 쿼리 스트링(query string)이라고 부른다.
쿼리 스트링은 URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 추가하는 형식으로 요청 파라미터가 여러 개이면 &로 연결한다.
www.tistory.com/ratel?name1=value1&name2=value2
요청을 받은 서버는 name1과 name2라는 파라미터 명으로 각각 value1과 value2의 파라미터 값을 전달 받을 수 있다.
GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다는 특징을 가지고 있다.
정적 컨텐츠는 데이터양이 크고 변경될 일이 적어서 반복해서 동일한 요청을 반복해서 보낼 필요가 없다.
정적 컨텐츠를 요청하고 나면 브라우저에서 요청을 캐시해두고 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시된 데이터를 사용한다.
이외에도 GET의 특징은 다음과 같다.
- GET 요청은 브라우저 히스토리에 기록이 남는다.
- GET 요청은 북마크될 수 있다.
- GET 요청은 민감한 데이터를 주고받을 때 사용되어서는 안된다.
(쿼리 스트링을 보면 알수 있듯이 URL에 데이터에 대한 정보가 노출되기 때문에 보안에 위험하다.)
- GET 요청은 길이 제한이 있다.
- GET 요청은 오직 데이터 가져오기를 요청할 때만 사용된다.
(데이터 수정과 같은 요청은 불가.)
POST는 무엇일까?
POST는 리소스를 생성/변경하기 위해 설계된 메소드로 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송한다.
HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있어 길이 제한을 가진 GET과 달리 대용량 데이터를 전송할 수 있다.
POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 GET보다 보안적인 면에서 안전하다고 생각할 수 있지만, POST 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 한다.
그리고 POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 한다. 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추한다. 만약, 알 수 없는 경우에는 application/octet-stream로 요청을 처리한다.
POST의 특징은 다음과 같다.
- POST 요청은 절대 캐시되지 않는다.
- POST 요청은 브라우저 히스토리에 기록이 남지 않는다.
- POST 요청은 북마크되지 않는다.
- POST 요청은 데이터 길이에 제한이 없다.
GET과 POST의 차이점을 정리해보자.
첫 번째로 사용목적이다.
GET은 서버의 리소스에서 데이터 조회를 요청할 때 사용되고 POST는 서버의 리소스를 새로 생성하거나 수정 등 데이터에 대한 작업을 요청할 때 사용한다.
두 번째로 HTTP 요청메시지의 body 유무이다.
GET은 URL 파라미터에 요청하는 데이터를 담아 보내기 때문에 HTTP 요청메시지에 body가 없다.
POST는 HTTP 요청메시지의 body에 데이터를 담아 보내기 때문에 HTTP 요청메시지에 body가 존재한다.
마지막으로 멱등성(idempotent)이다.
GET 요청은 멱등(Idempotent)하게 설계되었고 POST는 멱등하지 않게(Non-idempotent)설계 되었다.
더보기멱등이란 수학이나 전산학에서 연산의 한 성질을 나타내는 것으로 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다. 즉, 멱등이라는 것은 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야 한다.
GET이 Idempotent하도록 설계되었다는 것은 GET으로 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야 한다는 것을 의미한다. 이에 따라 GET은 서버의 데이터나 상태를 변경시키지 않아야 Idempotent하기 때문에 주로 데이터를 조회 할 때에 사용해야한다.
POST는 Non-idempotent하기 때문에 서버에게 동일한 요청을 여러 번 전송해도 응답은 다를 수 있다. 이에 따라 POST는 서버의 상태나 데이터를 변경시킬 때 사용된다. POST로 요청을 하게 되면 서버의 무언가는 변경되도록 사용된다.
<참고자료>
'웹 프로그래밍 > BE(Back-End)' 카테고리의 다른 글
SSH (Secure SHell) (0) 2021.07.07 MongoDB 알아보기 (0) 2021.07.06 SQL & NoSQL (0) 2021.07.02 AWS EC2 이용해보기 (0) 2021.06.30 Web Crowling & Web Scraping (0) 2021.06.28