HTTP 요청 메서드
클라이언트가 웹서버에게 요청하는 목적 및 그 종류를 알리는 수단의 메소드이다.
- 요청 메소드의 위치 : HTTP 요청 메세지의 첫째줄
GET /dir/page.html HTTP/1.1
GET : 리소스 취득 ⭐
URL(URI) 형식으로 웹서버측 리소스(데이터)를 요청하는 메소드
- Conditional GET
- 최초 리소스를 요청할 때는 요청만 하고
그 이후의 요청 때는 첫 요청의 응답과 함께 온 HTTP 헤더 정보를 참고하여 변경사항이 있는지 물어보는 GET 이다.
- 웹브라우저의 캐싱 기능에 도움을 준다.
HEAD : 메세지 헤더 취득
GET 메소드와 비슷하게 서버에 존재하는 데이터를 요청하지만 header만 가져온다
- GET과 비슷하나, 실제 문서를 요청하는 것이 아니라 문서 정보를 요청한다.
- 이에 따라 HTTP 응답 메시지에 본문 (Body) 없이 HTTP 헤더 정보만 보낸다.
POST : 내용 전송 (파일 전송도 가능) ⭐
서버에 데이터를 생성하는 것을 요청하는 메소드
- 클라이언트에서 요청 데이터를 HTTP Body에 담아 웹서버로 전송한다.
- 이때, 요청 데이터의 HTTP header의 항목 Content-Type에 요청 데이터의 타입을 표시한다.
⇨ Content-Type:application/데이터 타입
- 예를 들어
Content-Type:application/x-www-form-urlencoded
이라면
해당 개체가 form으로 전송하는 데이터라는 의미다.
- 만약 요청된 리소스가 새롭게 작성된 또 다른 것이라면
서버는 HTTP header 항목의 Location에 새롭게 작성된 리소스의 URL 정보를 포함하여 응답한다.
⇨ Location: 새롭게 작성된 리소스의 URL 정보
PUT : 내용 갱신 위주 (파일 전송도 가능)
서버에 존재하는 데이터를 수정하거나
존재하지 않으면 생성하는 것을 요청하는 메소드
- 정보를 서버로 제출하는 형식이 POST와 동일하지만 갱신 위주이다.
- 그렇기 때문에 서버측에서 새롭게 갱신된 리소스의 URL 정보를 HTTP header 항목의 Location에 포함하여 보내지 않아도 된다.
- PUT 메소드는 클라이언트 측이 서버 측 구현에 관여하는 것이다.
- 통상적으로 PUT보다 POST를 많이 사용한다.
DELETE : 파일 삭제
서버에 데이터를 제거할 것을 요청하는 메소드
OPTIONS : 웹서버측 제공 메소드에 대한 질의
해당 uri에 대해 서버가 허용하는 메소드인지 확인할 때 사용하는 메소드
- 서버는 HTTP header 항목 중 Allow을
Allow: GET,POST,HEAD
로 설정한 응답메시지를 보낸다.
TRACE, CONNECT : (거의 사용 안함)
- TRACE : 요청 리소스가 수신되는 경로를 보여줌
- CONNECT: 프락시 서버와 같은 중간 서버 경유
📌보안상의 이유로 대부분의 웹서버가 Whitelist 방식을 통해 GET,POST 2개 또는 OPTIONS 포함 3개 만을 허용하는 경우가 일반적이다.
GET과 POST의 차이점
GET 특징
요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송한다.
(HTTP 요청 메시지의 Header부분의 url에 담겨 전송한다)
www.example-url.com/resources?name1=value1&name2=value2
위의 예시처럼 url에 ?
뒤에 name=value
형태의 쿼리스트링으로 데이터정보가 담긴다.
요청 파라미터가 여러 개이면 &
로 연결한다.
- GET 방식은 url을 통해 데이터를 전송하기 때문에 보낼 수 있는 데이터의 크기가 제한적이다.
- 또한 보안이 필요한 데이터를 전송할 때 GET 방식은 데이터가 모두 노출되기 때문에 적절하지 않다.
GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다.
그래서 캐싱되지 않는 요청은 GET 요청이 적합하지 않을 수 있다.
- js, css, 이미지 같은 정적 컨텐츠는 데이터양이 크고, 변경될 일이 적어서 반복해서 동일한 요청을 보낼 필요가 없다.
- 정적 컨텐츠를 요청하고 나면 브라우저에서는 요청을 캐시해두고, 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시된 데이터를 사용한다.
- 그래서 프론트엔드 개발을 하다보면 정적 컨텐츠가 캐시돼 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 종종 발생한다.
이 때는 브라우저의 캐시를 지워주면 다시 컨텐츠를 조회하기 위해 서버로 요청을 보내게 된다.
POST 특징
리소스를 생성/변경하기 위해 설계된 POST 메소드는 HTTP 요청 메시지의 Body부분에 데이터를 담아 전송한다.
- HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있다. 그래서 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다.
- 보안적인 측면에서 데이터가 Body로 전송되기 때문에 눈에 보이지 않아 GET보다 안전하다고 생각할 수 있지만 데이터를 암호화하지 않는 이상 고만고만하다.
(크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있다)
- POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 한다.
⇨ Content-Type:application/데이터 타입
- 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추하게 된다.
- 데이터 타입을 알 수 없는 경우
Content-Type:application/octet-stream
으로 표시한다.
GET과 POST의 차이
GET
GET으로 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야 한다는 성질을 가진다. (Idempotent)
- 주로 조회를 할 때에 사용해야합니다.
- GET은 불필요한 요청을 제한하기 위해 요청이 캐시된다.
- POST 방식으로 요청해야 할 것을 크기가 작고 보안적인 문제가 없다는 이유로 GET 방식으로 요청하면
caching 되었던 데이터가 응답될 가능성이 존재한다.
POST
POST으로 서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있습니다. (Non-idempotent)
- POST는 서버의 상태나 데이터를 변경시킬 때 사용된다.
- POST는 생성, 수정, 삭제에 사용할 수 있지만
생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메소드라고 할 수 있다.