사용자가 어떤 홈페이지로 이동하기 위해 URL을 브라우저 주소창에 작성하고 엔터를 누르면 원하는 페이지로 이동한다. 사용자는 단순히 URL(Uniform Resource Locator)을 입력했을 뿐이지만 서버 내부에서는 클라이언트의 요청에 응답(웹 페이지로 표현)하기 위해서 처리를 해주어야 한다.
여기서, 클라이언트가 서버로 요청을 보내는 방법이 2가지 있다.
GET
방식과 POST
방식이다.
GET
GET이란?
- GET은 클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 메서드이다.
- GET을 통한 요청은 URL 주소 끝에 파라미터로 포함되어 전송되며, 이 부분을 쿼리스트링(Query String)이라고 부른다.
- 방식은 URL 끝에 "?"를 붙이고 그 다음 변수명1=값1&변수명2=값2... 형식으로 이어 붙이면 된다.
특징
- URL에 변수(데이터)를 포함시켜 요청한다.
- 데이터를 Header(헤더)에 포함하여 전송한다.
- URL에 데이터가 노출되어 보안에 취약하다.
- GET요청은 캐시가 가능하다.
(GET을 통해 서버에 리소스를 요청할 때 웹 캐시가 요청을 가로채 서버로부터 리소스를 다시 다운로드 하는 대신 리소스의 복사본을 반환한다. HTTP 헤더에서 cache-control 헤더를 통해 캐시 옵션을 지정할 수 있다.)
- 간단한 데이터를 URL에 넣도록 설계된 방식이라 데이터를 보내는 양에 한계가 있다.
(HTTP 자체는 GET방식의 URL길이에 제약을 두고 있지는 않지만, 브라우저에서 최대 길이를 제한하고 있으며, URL 형식에 맞지 않는 경우 인코딩되어 전달해야 한다.)
POST
POST란?
- POST는 클라이언트에서 서버로 리소스를 생성하거나 업데이트 하기 위해 데이터를 보낼 때 사용되는 메서드다.
- POST는 전송할 데이터를 HTTP메시지 body부분에 담아서 서버로 보낸다.(body의 타입은 Content-Type 헤더에 따라 결정되며, GET에서 URL 의 파라미터로 보냈던 name1=value1&name2=value2 가 body에 담겨 보내진다 생각하면 된다.
- POST로 데이터를 전송할 때 길이 제한이 따로 없어 용량이 큰 데이터를 보낼 때 사용하거나 GET처럼 데이터가 외부적으로 드러나는 건 아니라서 보안이 필요한 부분에 많이 사용 된다.(하지만 데이터를 암호화 하지 않으면 body의 데이터도 결국 볼 수 있는 것은 같다.)
- 데이터 전송은 보통 HTML form을 통해 서버로 전송된다.
POST의 특징
- URL에 변수(데이터)를 노출하지 않고 요청한다.
- 데이터를 body(바디)에 포함시킨다.
- URL에 데이터가 노출되지 않아서 기본 보안은 되어있다.
- 캐시되지 않는다.
- 브라우저 히스토리에 남지 않는다.
- 북마크 되지않는다.
- 데이터의 길이에 제한이 없다.
GET과 POST의 차이점
- 사용목적 : GET은 서버의 리소스에서 데이터를 요청할 때, POST는 서버의 리소스를 새로 생성하거나 업데이트할 때 사용한다.
(DB로 따지면 GET은 SELECT에 가깝고, POST는 CREATE에 가깝다고 보면된다.)
- 요청에 body유무 : GET은 URL파라미터에 요청하는 데이터를 담아 보내기 때문에 HTTP 메시지에 body가 없다. POST는 body에 데이터를 담아 보내기 때문에 당연히 HTTP 메시지에 body가 존재한다.
- 여러번요청시 : GET은 리소스를 조회한다는 점에서 여러번 요청하더라도 응답이 같다. POST는 리소스를 새로 생성하거나 업데이트 할 때 사용되기 때문에 POST요청이 발생하면 서버가 변경될 수도 있다.
GET과 POST는 이러한 차이점이 있기 때문에 사용하려는 목적에 맞게 확인한 후에 사용해야한다.