[HTTP] HTTP 메서드

HTTP 메서드는 클라이언트가 서버에게 무엇인가를 요청할 때 기대하는 행동이다. 

주로 사용하는 메서드는 다음과 같이 5가지가 있다. 

  1. GET : 리소스 조회
  2. POST : 요청 데이터 처리, 주로 등록에 사용
  3. PUT : 리소스를 대체, 해당 리소스가 없으면 생성
  4. PATCH : 리소스 부분 변경
  5. DELETE : 리소스 삭제

이 외에도 HEAD, OPTIONS, CONNECT, TRACE와 같은 메서드들이 존재한다.

  • HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
  • OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
  • CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
  • TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

여기서는 맨 위의 5가지 메서드들에 대해서만 자세히 알아보자.


📂 GET

GET은 이름 그대로 리소스를 조회하는 것이다.

서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달한다. 메시지 바디를 사용해 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다. 

위와 같은 상황을 보자.

클라이언트가 /members/100의 데이터를 달라는 요청을 보냈다. 서버는 이를 확인하고 내부의 데이터베이스를 조회해 오른쪽과 같은 JSON 메시지를 이용해 응답메시지를 만들어 클라이언트에 전송한다.


📂 POST

POST는 요청 데이터를 처리하는 것이다. 

GET은 요청할 때 데이터를 전달하지 않는다. 하지만 POST는 클라이언트에서 서버로 요청을 보낼 때, 메시지 바디를 통해 서버에서 요청 데이터를 처리하도록 전달하는 것이다. 서버는 이 요청 데이터를 처리한다(메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다).

주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용된다.

위의 상황을 보자. 

클라이언트는 POST를 통해 /members라는 곳에 리소스를 전달한다. 이때 서버와 클라이언트는 /members에 POST로 전송하면 그 데이터는 서버가 저장을 하거나 내부 프로세스를 처리하는 데 사용할 것이라는 것을 미리 약속해 놓는다. 지금은 신규로 등록을 하는 것이라 가정하자. 

서버는 이를 열어 확인해 보고 POST에 /members로 왔기 때문에 데이터베이스에 등록을 하고 신규 리소스 식별자를 생성하고 응답 메시지를 클라이언트에게 보내준다.

신규로 자원이 생성되면 보통 HTTP 201 Created로 응답 메시지를 전송한다. 200으로 보내도 상관없다. Location은 자원이 생성된 URI 경로를 나타낸다. 

 

POST는 다음과 같은 기능에 사용된다. 

  • HTML 양식에 입력된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공
    • 예) HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용
  • 게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시
    • 예) 게시판 글쓰기, 댓글 달기
  • 서버가 아직 식별하지 않은 새 리소스 생성
    • 예) 신규 주문 생성
  • 기존 자원에 데이터 추가
    • 예) 한 문서 끝에 내용 추가하기
이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 정해진 것이 없이 리소스마다 따로 정해야 한다. 

📂 PUT

PUT은 리소스를 대체하는 것이다. 폴더에 파일을 복사하는 것과 비슷하다. 이때 리소스가 있으면 대체하고 리소스가 없으면 생성한다. 쉽게 이야기하면 덮어버리는 것이다. 

중요한 것은 구체적인 리소스 경로를 다 알고 있어 클라이언트가 리소스를 식별한다는 것이다. 이것이 POST와의 큰 차이점이다. 

클라이언트가 리소스 위치를 알고 URI를 지정

위의 상황과 같이 이미 /members/100에 데이터가 있는 상황이라면,

이렇게 리소스가 대체된다.

리소스가 없으면 신규 리소스가 생성될 것이다. 

 

여기서 중요하게 봐야할 점이 있다. 

위의 상황과 같이 "young" 데이터의 나이 데이터가 잘못되어 이를 수정하고자 PUT을 사용해 age 값만을 넘겨버리면 다음과 같은 문제가 발생한다. 

PUT은 리소스를 완전히 대체하기 때문에 넘겨준 age만 저장되고 username 필드가 삭제되어 버린다. 

 

이럴 때 사용하는 메서드가 PATCH이다.


📂 PATCH

PATCH는 리소스를 부분 변경하는 것이다.

위에서 본 상황과 똑같은 상황이지만 메서드가 PUT에서 PATCH로 변경되어 전송된다.

이 경우에는 부분적으로 리소스가 변경된다.


📂 DELETE

DELETE는 리소스를 제거하는 것이다.


📂 HTTP 메서드 속성

출처: https://ko.wikipedia.org/wiki/HTTP

HTTP 메서드 속성에는 다음 3가지가 있다.

📄 안전(Safe Methods)

호출해도 리소스를 변경하지 않는 것을 말한다. 위의 표에서 볼 수 있듯 GET 같은 경우 단순히 조회만이 목적이기 때문에 안전하다 볼 수 있다. 하지만, POST, PUT, DELETE와 같은 것들은 데이터의 변경이 일어나기 때문에 안전하다 볼 수 없다. 

📄 멱등(Idempotent Methods)

한 번 호출하든 두 번 호출하든 몇 백번 호출하면 결과가 똑같은 것을 말한다. 

  • GET : 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.
  • PUT : 결과를 대체한다. 따라서 같은 요청을 여러 번 해도 최종 결과는 같다.
  • DELETE : 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 최종적으로 같다. 
  • POST : 멱등하지 않다!!! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다. 

이 멱등이 활용되는 예로 '자동 복구 메커니즘'을 들 수 있다.

DELETE를 호출했는데 서버에서 timeout 등의 이유로 정상 응답을 주지 못한 상황을 가정해 보자. 이때 클라이언트는 자동으로 DELETE를 재시도해도 상관없을 것이다. 멱등하기 때문에! 즉, 같은 요청을 두 번해도 괜찮기 때문이다. 하지만 POST 요청을 보낼 경우는 상황이 많이 달라질 것이다.

이처럼 클라이언트가 같은 요청을 다시 시도해도 되는가?에 대한 판단의 근거로 사용될 수 있다. 

📂 캐시가능(Cacheable Methods)

응답 결과 리소스를 캐시해서 사용해도 되는가에 대한 것이다. 

GET, HEAD, POST, PATCH가 스펙 상 캐시가능하지만, 실제로는 GET, HEAD 정도만 캐시로 사용한다. POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데 이 구현이 쉽지 않기 때문이다. 

'HTTP' 카테고리의 다른 글

[HTTP] HTTP 기본  (0) 2022.08.10
[HTTP] URI와 웹 브라우저 요청 흐름  (0) 2022.08.05
[HTTP] 인터넷 네트워크  (2) 2022.08.04