HTTP는 웹상에서 클라이언트와 서버 간에 요청/응답으로 데이터를 주고 받을 수 있는 프로토콜이다. 클라이언트가 HTTP프로토콜을 통해 서버에게 요청을 보내면 서버는 요청에 맞는 응답을 클라이언트에게 전송 한다. 이때, HTTP요청에 포함되는 HTTP Method에는 크게 2가지 방식이 있는데, GET방식 과 POST방식 이다.
get의 사전적 의미로는 가져오다 이다. GET 은 어떠한 정보를 가져와서 조회하기 위해서 사용되는 방식이다.
GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송한다. URL의 끝에 ?
와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 쿼리스트링이라고 부른다. 만약, 요청 파라미터가 여러 개이면 &
로 연결한다. 쿼리스트링을 사용하게 되면 URL에 조회 조건을 표시하기 때문에 특정 페이지를 링크하거나 북마크할 수 있다.
쿼리스트링을 포함한 URL의 샘플은 아래와 같다. 여기서 요청 파라미터명은 name1, name2이고, 각각의 파라미터는 value1, value2라는 값으로 서버에 요청을 보내게 됩니다.
www.example-url.com/resources?name1=value1&name2=value2
캐싱(Caching) ?
한번 접근 후, 또 요청할시 빠르게 접근하기 위해 레지스터에 데이터를 저장시켜 놓는것.
GET은 불필요한 요청을 제한하기 위해 요청이 캐싱될수 있다. js,css, 이미지 같은 정적 컨텐츠는 데이터양이 크고, 병경될 일이 적어서 반복해서 동일한 요청을 보낼 필요가 없다. 정적 컨텐츠를 요청하고 나면 브라우저에게는 요청을 캐싱해두고, 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐싱된 데이터를 사용한다.
프론트 개발을 하다보면 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 있다. 이때는 브라우저의 캐시를 지워주면 다시 컨텐츠를 조회하기 위해 서버로 요청을 보내게된다.
post의 사전적 의미는 제출하다 라는 뜻이다. POST방식은 데이터를 서버로 제출하여 추가 또는 수정하기 위해서 사용하는 방식이다.
POST는 리소스를 생성/변경하기 위해 설계되었기 때문에 GET과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송한다. HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있다. 그래서 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다. 이처럼 POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 GET보다 보안적인 면에서 안전하다고 생각할 수 있지만, POST 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 한다.
그리고 POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 한다. 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추한다. 만약, 알 수 없는 경우에는 application/octet-stream
로 요청을 처리한다.
처리방식 | GET | POST |
---|---|---|
URL에 데이터 노출 여부 | O | X |
URL예시 | http://localhost:8080/boardList?name=제목&contents=내용 | http://localhost:8080/addBoard |
데이터 위치 | Header | Body |
전송길이 제한 | O | X |
캐싱 가능 여부 | O | X |
GET은 Idempotent, POST는 Non-idempotent하게 설계되었다.
Idempotent(멱등)?
수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러번 적용하더라도 결과가 달라지지 않는 성실 - 위키백과 멱등법칙
즉, 멱등이라는 것은 동일한 연산을 여러번 수행하더라도 동일한 결과가 나타나야 한다.
결론적으로 GET은 서버에게 동일한 요청을 여러번 전송하더라도 동일한 응답이 돌아와야 한다. 이에 따라 GET은 설계원칙에 따라 서버의 데이터나 상태를 변경시키지 않아야 하기 때문에 주로 조회를 할때에 사용한다. 예를 들면, 브라우저에서 웹페이지를 열어보거나 게시글을 읽는 등 조회를 하는 행위를 GET으로 요청한다.
반대로 POST는 서버에게 동일한 요청을 여러번 전송해도 응답은 항상 다를 수 있다. 이에 따라 POST는 서버의 상태나 데이터를 변경시킬 때 사용된다. 게시글을 쓰거나 삭제 할때 POST로 요청을 하게 되면 서버의 무언가는 변경되도록 사용된다. 이처럼 POST는 생성, 수정, 삭제에 사용할수 있지만, 생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메소드라고 할 수 있다.
참고