HTTP 메서드

파쏭쏭계란빡 ㅣ 2023. 8. 23. 23:26

HTTP 메서드란?

클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식

  • 서버가 수행해야 할 동작을 지정해서 요청을 보내는 방법

HTTP 메소드의 종류는 총 9가지가 있다.
이 중 주로 쓰이는 메소드는 5가지로 보면 된다.

주요 메소드

  • GET : 리소스 조회. GET 메서드는 데이터를 가져올때만 사용
  • POST : 서버로 데이터를 전송한다. 새로운 리소스를 생성(등록)할 때 주로 사용
  • PUT : 요청 데이터를 사용하여 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체
  • PATCH : 리소스를 부분적으로 변경
  • DELETE : 리소스 삭제

기타 메소드

  • HEAD : GET 메서드와 동일하지만, 헤더 정보만 반환 받음.
  • OPTIONS : 목표 리소스와의 통신 옵션을 설명하기 위해 사용됨. (주로 CORS에서 사용)
  • TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행.
  • CONNECT : 요청한 리소스에 대해 양방향 연결을 시작하는 메소드. 터널을 열기 위해 사용.

HTTP 메서드 속성

각 HTTP 메서드마다 용도와 특징이 다름
메서드 속성은 이러한 특징을 알 수 있는 지표

속성의 종류

  • 안전(Safe Methods)
  • 멱등(Idempotent Methods)
  • 캐시 가능(Cacheable Methods)
  • 요청에 본문(Body) 존재
  • 성공 응답에 본문(Body) 존재

1. 안전 (Safe)

안전(Safe)은 호출해도 리소스를 변경하지 않는 메서드 속성
즉, 데이터의 변경이 일어나지 않는다는 뜻
GET 메서드는 단순 데이터를 가져올때 사용, 이러한 GET 같은 메서드를 안전(safe) 하다고 함

2. 멱등 (Idempotent)

몇 번을 호출하든 최종적인 결과는 똑같은 메서드 속성
데이터를 가져오거나(GET), 삭제하거나(DELETE), 완전히 대체하는(PUT) 작업은 몇 번이 수행되건 상관없이 결과는 같음
하지만, **POST**의 경우는 다름

  • POST 메서드로 결제를 수행 가정하면, POST 메소드가 두 번 호출된다면 결제가 중복 발생
  • 사용자의 돈이나 제품의 수량 데이터가 계속해서 달라짐.
  • 따라서, 이러한 메소드는 멱등하지 않은 것

3. 캐시 가능 (Cacheable)

응답 결과 리소스를 캐시해서 사용 여부 메서드 속성
GET과 HEAD, POST, PATCH 메서드가 이 속성을 가짐
일반적으로 GET, HEAD 정도만 캐시로 사용

4. 요청 / 응답에 Body 존재

요청이나 응답 시 데이터를 Message Body에 담아 보내는지, 아닌지에 대한 속성

HTTP 메서드 종류

GET 메서드

GET은 리소스를 조회하는 메서드
서버에 전달하고 싶은 데이터는 **query(쿼리 파라미터, 쿼리 스트링)**을 통해서 전달
GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있음

  • js, css, 이미지 같은 정적 컨텐츠를 요청하고 나면 브라우저에서는 요청을 캐시해두고, 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시된 데이터를 사용
  • HTTP 헤더에서 cache-control 헤더를 통해 캐시 옵션 지정 가능
    브라우저 히스토리에 남음
    길이 제한(브라우저마다 다름)
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com

※ 참고: 메시지 바디를 통해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음.

  • 응답 헤더에 cache-control 사용하여 max-age(캐시가 유효한 시간) 설정해서 클라이언트 전송

캐시를 사용한 경우

HTTP/1.1 200 OK
Content-Type: iamge/jpeg
Cache-control: max-age=60
Content-Length: 12195

lk123ksqeqweqeqeqeqeeqweqwqe123123

query (쿼리 파라미터)

  • GET 메서드로 요청할 때 클라이언트에서 서버로 데이터를 전송하기 위해 사용하는 데이터 전송 방식
  • /serch 라는 리소스 뒤에 따라오는 q=hello&hl=ko 문자가 바로 쿼리 파라미터입니다.
  • 쿼리 파라미터는 리소스 경로 뒤에 '?' 문자를 붙여 시작하여, Key-Value 형태로 데이터를 전송합니다. 추가적인 데이터는 '&' 문자로 이어줍니다.

POST

POST는 요청 데이터를 처리하는 메서드

주로 전달된 데이터로 신규 리소스를 등록하거나, 프로세스 처리에 사용

HTTP 메세지의 Body에 담아서 전송

Body의 타입은 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시 따라 결정

  • Content-Type의 종류로: text/plain, multipart/form-data 등

HTTP 메세지의 Body는 길이의 제한 없이 데이터를 전송 가능

캐시되지 않음

브라우저 히스토리에 남지 않음

데이터 길이에 제한이 없음

POST /members HTTP/1.1
Content-Type: application/json

{
 "username": "young",
 "age": 20
}
  • HTTP 메시지에서 공백 아래에 오는 데이터가 Message Body, POST 메서드에서는 Message Body에 데이터를 담아 보냄
  • 서버에서는 신규 리소스를 등록하고 생성된 리소스의 경로를 응답데이터로 반환 EX) /member/100

PUT

리소스를 대체하는 메서드
리소스가 있을 경우 대체하고 없을 경우 생성
서버에 전달하고 싶은 데이터는 Message Body를 통해 서버로 요청 데이터를 전달
서버에서는 /member/100 이라는 경로의 데이터를 요청의 데이터로 완전히 대체하거나 새로 등록
따라서, PUT 메서드는 몇 번을 수행하더라도 결과 동일(멱등성)

PUT /members/100 HTTP/1.1
Content-Type: application/json

{
 "username": "hello",
 "age": 20
}

Put vs POST와 무슨 차이점이 있을까?

  • PUT /members/100 HTTP/1.1 이런 식으로 Location을 알고 있어야 함
  • POST는 새로운 데이터를 계속 생성하기 때문에 요청시마다 데이터를 생성하지만, PUT은 사용자가 데이터를 지정하고 수정하는 것이기 때문에 같은 요청을 계속하더라도 데이터가 계속 생성되지는 않음

PATCH

리소스 부분 변경할 때 사용

PUT과 보내는 양식은 비슷하지만, 서버에서는 PATCH로 전송된 경우 교체가 아닌 필요한 부분만 업데이트 해주는 방식

PATCH /members/100 HTTP/1.1
Content-Type: application/json 

{
     username: "young"
     age: 50 
}

위처럼 200번 회원의 age를 50으로 하고자 PATCH를 보낸다면 PUT과는 다르게 회원 정보에서 age만 변경

PUT vs PATCH 무슨 차이점이 있을까?

PUT은 지정한 데이터를 전부 수정하는 Method이지만 PATCH는 정보의 일부분이 변경되는 방법이다. 그래서 PUT은 멱등하지만, PATCH는 멱등하다고 볼 수 없다

DELETE

DELETE는 리소스를 제거하는 메서드
요청 리소스 경로의 데이터를 삭제
/member/100 경로의 리소스를 제거합니다.

DELETE /members/100 HTTP/1.1
Host: localhost:8080

 

HEAD

GET과 동일하지만 서버에서 Body를 Return 하지 않음
HEAD는 흔히 클라이언트가 요청한 URI의 컨텐츠가 웹서버에 존재하는지 여부를 확인

  • 클라이언트는 응답 헤더만 전달받게 되는데, 상태코드가 200 OK 면 컨텐츠가 웹서버에 존재하는것이고, 404는 웹서버에 존재 하지 않는 것을 의미

OPTION

예비 요청(Preflight)에 사용되는 HTTP 메소드
예비 요청이란 본 요청을 하기 전에 안전한지 미리 검사하는 것이라고 보면 된다
서버의 지원 가능한 HTTP 메서드와 출처를 응답 받아 CORS 정책 Visit Website을 검사하기 위한 요청

TRACE

TRACE 요청방식은 웹서버로 가는 네트워크 경로를 체크하는 메소드
서버에 도달 했을 때의 최종 패킷의 요청 패킷 내용을 응답 받을 수 있음
요청의 최종 수신자는 반드시 송신자에게 200(OK) 응답의 내용(Body)로 수신한 메세지를 반송

클라이언트의 요청 패킷이 방화벽, Proxy 서버, Gateway 등을 거치면서 패킷의 변조가 일어날 수 있는데, 그래서 TRACE 메서드를 통해 요청했던 패킷 내용과 응답 받은 요청 패킷 내용을 비교하여 변조 유무를 확인 가능

CONNECT

요청한 리소스에 대해 양방향 연결을 시작하는 메소드 Client가 Proxy를 통해서 Server와 SSL통신을 하고자 할 때 사용
클라이언트는 원하는 목적지와 TCP연결을 HTTP 프록시 서버에 요청한다.
그러면 서버는 클라이언트 대신하여 연결의 생성을 진행한다. 한번 서버에 의해 연결이 수립되면, 프록시 서버는 클라이언트에 오고가는 TCP 스트림을 계속해서 프록시한다

CONNECT server.example.com:80 HTTP/1.1
Host: server.example.com:80

 

의문사항

1. GET은 body를 쓰면 안될까?

HTTP GET 요청은 서버에서 리소스를 검색하기 위해 설계되었다.

GET Method라도 body로 전송을 받을 수 없는 것은 아니다
서버로 데이터를 보내기 위해 사용되지 않
HTTP GET 요청은 URL에 query parameters를 포함할 수 있지만, message body를 포함하는것을 권장하지 않는다.
GET 요청의 request message에는 정의된 의미가 없기 때문에, GET 요청에 body를 넣었을 경우 기존의 구현체에서는 요청을 거부할 수도 있다는 것

 

2. GET 메소드를 사용할때 body의 캐시는 어떻게 되는가?

캐싱과 관련하여, HTTP 캐싱은 주로 GET 요청의 URL과 헤더에 기반
즉, GET 요청에 body가 포함되어 있더라도 대부분의 캐싱 메커니즘은 body를 고려하지 않을 것

HTTP 메서드