포스트

[Network] HTTP (2) - HTTP 메서드 종류

Computer Science / Network

HTTP 메서드의 종류와 각 메서의 요청 흐름에 대한 개념 정리

HTTP 메서드(Method) 종류

HTTP 메서드(Method)란, 클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식을 말한다.

쉽게 말해서, 서버에 주어진 리소스에 수행하길 원하는 행동, 서버가 수행해야 할 동작을 지정하는 요청을 보내는 방법이다.

HTTP 메서드의 종류는 총 9가지가 있으며, 이 중 주로 쓰이는 것은 5가지이다.

주요 메서드

  • GET
    • 리소스 조회
  • POST
    • 요청 데이터 처리 (주로 등록에 사용)
  • PUT
    • 리소스를 대체(덮어쓰기)
    • 해당 리소스가 없다면 생성
  • PATCH
    • 리소스의 부분 변경
    • PUT: 전체 변경 / PATCH: 일부 변경
  • DELETE
    • 리소스 삭제

기타 메서드

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

HTTP 주요 메서드

GET

리소스를 조회(Read)하는 메서드이다.

만약에 서버에 전달하고 싶은 데이터가 있다면 쿼리스트링을 통해서 전달한다.

1
GET https://jsonplaceholder.typicode.com/comments?postId=1&postId=2 HTTP/1.1

위에서 ?postId=1&postId=2 부분이 쿼리스트링

쿼리스트링 외에 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 서버에서 따로 구성해야 되기 때문에 지원하지 얺는 곳이 많아서 권장하지 않는다.

조회할 때 POST를 사용해서 조회할 수도 있지만, GET 메서드는 캐싱이 가능하기 때문에 GET을 사용하는 것이 유리하다.

정적 데이터 조회 과정

  • 이미지나 정적 텍스트 문서를 GET
  • 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능
  1. 클라이언트에서 /members/100으로 100번 멤버를 조회해서 정보를 달라고 GET 요청을 보낸다.
    참고 이미지

    image_2

  2. 서버에서는 요청 메세지를 분석해서 내부의 유저 정보를 조회한 뒤, 결과 Response를 만든다.
    참고 이미지

    image_3

  3. 서버에서 클라이언트로 응답을 해주고, 응답을 정상적으로 받은 클라이언트는 200 OK Status를 가지며, 회원 정보를 얻게 된다.
    참고 이미지

    image_4 데이터 JSON형식이나 HTML, 또는 이미지 같은 멀티미디어 파일과 같이 다양할 수 있다.

동적 데이터 조회 과정

  • 주로 검색, 게시판 목록에서 검색어로 이용
  • 쿼리 파라미터를 사용해서 데이터를 전달
  • 쿼리 파라미터는 key_1=value_1&key_2=value_2 구조로 되어 있다.
  1. 요청 URL 뒤에 ?q=hello&hl=ko 쿼리 파라미터를 입력해서 상세한 조회 데이터를 얻는다.

    실제 구글 검색 URL : https://www.google.co.kr/search?q=hello&hl=ko

    참고 이미지

    image_5

HTML Form 데이터 조회 과정

  • HTML Form 태그 문서로 사용자와 UI로 상호작용하여 서버와 통신

HTML Form 전송은 GET, POST만 지원한다.

  1. 웹 문서에서 폼 입력 칸에 데이터를 적고 전송 버튼을 누른다.
    참고 이미지

    image_6_11

  2. 지정한 GET 메서드 동작에 따라 input 태그 안에 들어간 값들이 쿼리 스트링으로 서버에 전송된다.
    참고 이미지

    image_7

POST

전달한 데이터를 처리/생성(Create)하는 요청 메서드이다.

메시지 바디(body)를 통해 서버로 요청 데이터를 전달하면 서버는 요청 데이터를 처리하여 해당 데이터를 업데이트한다.

이때 전달된 데이터는 주로 신규 리소스 등록, 프로세스 처리에 사용되며, 만일 데이터를 GET하는데 있어서 JSON으로 조회 데이터를 넘겨야 하는 애매한 경우에는 POST를 사용하기도 한다.

JSON 데이터 전송 과정

  1. 클라이언트는 body에 등록할 회원 정보를 JSON 형태로 만들어 담고 서버로 전송한다.
    참고 이미지

    image_8

  2. 서버에서는 받은 메시지를 분석해서 로직대로 처리한다.

    데이터베이스에 등록하고 신규 아이디를 생성하는 것과 같은 로직

    참고 이미지

    image_9

  3. 신규 회원에 대한 데이터를 바디(body)에 담아서 클라이언트로 응답한다.

    • 신규 자원 생성은 200이나 201로 응답을 보낸다.
    • Location은 자원이 신규로 생성된 URI 경로를 의미한다.
    참고 이미지

    image_10

HTML Form 데이터 전송 과정

  • HTML Form 태그 문서로 사용자와 UI로 상호작용하여 서버와 통신
  • 회원가입, 상품 주문, 데이터 변경 등에 이용

HTML Form 전송은 GET, POST만 지원한다.

  1. 웹 문서에서 폼 입력 칸에 데이터를 적고 전송 버튼을 누른다.
    참고 이미지

    image_6_11

  2. 지정한 POST 메서드 동작에 따라 input 태그 안에 들어간 값들이 쿼리 스트링으로 서버에 전송된다.
    참고 이미지

    image_12

    [Content-Type 헤더 종류]

    • Content-Type: application/x-www-form-urlencoded
      • Form의 내용을 HTTP 메시지 바디를 통해서 전송(key=value, 쿼리 파라미터 형식)
      • 전송 데이터를 URL Encoding 처리

      abc김 → abc%EA%B9%80

    • Content-Type: multipart/form-data
      • 파일 업로드 같은 바이너리 데이터 전송 시 사용
      • 다른 종류의 여러 파일과 Form의 내용을 함께 전송 가능하며, 그래서 이름이 multipart이다.
    • Content-Type: application/json
      • text, xml, json 데이터 전송 시 사용

파일 데이터 전송 과정

  • enctypemultipart/form-data로 작성해서 해당 폼에 파일이 있다는 것을 표시한다.
  • 바이너리 데이터 전송 시에 사용한다.
  • multipart/form-data 형식이라면 HTTP 메시지에 임의의 구분자(------XXX)가 Form 데이터 간의 구분을 지어준다.
  • 여러 개의 Content-Type에 대한 데이터를 보낼 수 있다.

image_13

PUT

리소스를 대체 또는 수정(Update)하는 메서드이다.

만일 요청 메시지에 리소스가 있다면 덮어쓰고, 없다면 새로 생성한다.

  • /members/100 데이터가 존재한다면, 기존의 것을 완전히 대체한다.
  • /members/100 데이터가 존재하지 않는다면, 대체할 것이 없기 때문에 새로 생성한다.

데이터를 대체해야 하기 떄문에, 클라이언트가 리소스의 구체적인 전체 경로를 지정해서 보내줘야 한다.

  • 멤버 새로 추가
    1
    
    POST /members HTTP/1.1
    
  • 100번째 멤버 수정
    1
    
    PUT /members/100 HTTP/1.1
    

리소스가 있는 경우

  1. 100번 유저의 리소스를 교체하겠다는 요청을 보낸다.
    참고 이미지

    image_14

  2. 기존 데이터가 있다면, 데이터를 완전히 대체한다.
    참고 이미지

    image_15

리소스가 없는 경우

  1. 100번 유저의 리소스를 교체하겠다는 요청을 보낸다.
    참고 이미지

    image_16

  2. 기존의 데이터가 없다면 POST와 같이 신규로 생성한다.
    참고 이미지

    image_17

일부 리소스만 변경하기를 원하는 경우

  1. age50으로 변경하기 위해 해당 데이터를 PUT으로 전달한다.
    참고 이미지

    image_18

  2. 하지만 기존 데이터가 완전히 대체되어 username 필드 데이터가 삭제된다.

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

    참고 이미지

    image_19

PATCH

리소스의 일부분만 변경(Update)하는 메서드이다.

만약에 PATCH를 지원하지 않는 서버에서는 POST로 대체해서 사용할 수 있다.

데이터 변경 과정

  1. age50으로 변경하가 위해 해당 데이터를 PATCH로 전달한다.
    참고 이미지

    image_20

  2. PUT과는 다르게 회원 정보에서 age만 변경된다.
    참고 이미지

    image_21

DELETE

리소스를 제거(Delete)하는 메서드이다.

상태 코드는 대부분 200을 사용하고 상황에 따라 204를 사용한다.

데이터 삭제 과정

  1. 100번째 멤버를 제거하기 위해 DELETE로 데이터를 전달한다.
    참고 이미지

    image_22

  2. 서버에서 요청을 받고 해당 리소스를 데이터베이스로부터 제거한다.
    참고 이미지

    image_23

HTTP 기타 메서드

GET 메서드와 동일하지만 서버에서 Body를 Return하지 않는다.

그렇기 때문에, 응답의 상태 코드만 확인할 때와 같이 Resource를 받지 않고 오직 찾기만을 원할 때 사용하기 때문이다.

일종의 검사 용도

또한 서버의 응답 헤더를 확인함으로써 Resource가 수정되었는지 확인이 가능하다.

image_24

OPTIONS

예비 요청(Preflight)에 사용되는 HTTP 메서드이다.

예비 요청(Preflight)이란?

본 요청을 하기 전에 안전한지를 미리 검사하는 것이라고 보면 된다.

서버의 지원 가능한 HTTP 메서드와 출처를 응답받아 CORS1 정책을 검사하기 위한 요청이다.

image_26

CONNECT

동적 터널 모드를 교환, 프록시 기능을 요청 시에 사용한다.

프록시 서버와 같은 중간 서버 경유

이 메서드는 요청한 리소스에 대해 양방향 연결을 시작하는 메서드이다.

CONNECT 메서드는 SSL(HTTPS)를 사용하는 웹 사이트에 접속하는데에 사용할 수 있다.

클라이언트는 원하는 목적지와 TCP 연ㄱ녈을 HTTP 프록시 서버에 요청하고, 서버는 클라이언트를 대신하여 연결의 생성을 진행한다.

한 번 서버에 의해 연결이 수립되면, 프록시 서버는 클라이언트에 오고 가는 TCP 스트림을 계속해서 프록시한다.

TRACE

해당 메서드도 일종의 검사용 메서드이다.

서버에 도달했을 때의 최종 패킷의 요청 패킷 내용을 응답 받을 수 있다.

요청의 최종 수신자는 반드시 송신자에게 200 OK 응답의 내용(Body)으로 수신한 메시지를 반송해야 한다.

또한 최초 Client의 요청에는 Body가 포함될 수 없다.

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

image_25

참고 사이트

Inpa Dev - 🌐 HTTP 메서드 종류 & 요청 흐름 💯 총정리

Semantics - HTTP (3) - HTTP API

sublivan - HTTP Method


  1. 교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 브라우저가 자신의 출처가 아닌 다른 어떤 출처(도메인, 스킴 혹은 포트)로부터 자원을 로딩하는 것을 허용하도록 서버가 허가 해주는 HTTP 헤더 기반 메커니즘이다. ↩︎ ↩︎2

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.