HTTP(Hypertext Transfer Protocol) 알아보기 (3)

2026. 5. 28. 22:47네트워크/응용계층

HTTP 메서드

 

HTTP 요청에서 사용되는 다양한 메서드들을 알아보자. 메서드의 종류는 대표적으로 GET, HEAD, POST, PUT, PATCH, DELETE, CONNECT, OPTIONS, TRACE 등이 있다. 

HTTP 메서드 설명
GET 자원을 습득하기 위한 메서드
HEAD GET과 동일하나, 헤더만을 응답받는 메서드
POST 서버로 하여금 특정 작업을 처리하게끔 하는 메서드
PUT 자원을 대체하기 위한 메서드
PATCH 자원에 대한 부분적 수정을 위한 메서드
DELETE 자원을 삭제하기 위한 메서드
CONNECT 자원에 대한 양방향 연결을 시작하는 메서드
OPTIONS 사용 가능한 메서드 등 옵션을 확인하는 메서드
TRACE 자원에 대한 루프백 테스트를 수행하는 메서드

 

굵게 표시된 메서드는 자주사용되는 메서드들이다. 

 

GET - "줘"

 

GET 메서드는 특정 자원을 조회할 때 사용되는 메서드다. 클라이언트가 서버에게 '이것을 가져다 줘.'라고 요청을 보내는것과 같다. 여기서 '이것'은 조회하고자 하는 자원을 의미한다. 이는 HTML이 될 수도 있고 JSON이 될 수도 있으며, 이미지나 일반 텍스트가 될 수도 있다. 

 

GET은 가장 흔히 사용되는 메서드 중 하나이며, 웹 브라우저에서도 빈번하게 사용된다. 웹 브라우저를 통해 조회되는 것들은 대부분 GET 요청에 의해 대한 응답들이다. 예를 들어 웹 브라우저에 'http://www.example.com'을 입력했다고 가정해보자. 그럼 웹 브라우저는 해당하는 웹 페이지를 보여준다. 사실은 웹 브라우저가 'www.example.com'에게 '당신의 웹 페이지 자원을 주세요'라고 요청하고, 해당 자원을 응답받은 것과 같다. 

 

GET은 '이것을 가져다주세요'와 같은 요청 메서드라고 했다. 그렇다면 '이것'에 해당하는 자원을 요청 메세지에 포함해야 한다. 이를 위해 사용되는 것이 요청 라인의 '요청 대상' 그리고 'Host 헤더'이다. 다음은 예시 URL에 대한 간략화된 GET 요청 메시지다. 실제로는 더 많은 헤더가 붙긴 하지만, 강조된 것 위주로 살펴보자. 요청 라인의 '요청 대상'에는 일반적으로 요청할 자원에 대한 쿼리가 포함된 경로가 명시된다. 예제는 '/example-page'로 표현되었다. 'Host 헤더'에는 요청을 보낼 호스트가 명시된다. 다음 예제에선 'www.example.com'이 명시되어 있다. 

 

① 요청 메시지

GET /example-page HTTP/1.1
Host: www.example.com
Accept: *

 

GET 요청 메세지가 성공적으로 처리되었다면 이에 대한 응답으로서 요청한 자원을 전달받게 된다. 다음 예제는 HTML 문서를 응답 받은 에제다. 메시지 본문에 HTML 문서 내용이 적혀있다. 

 

② 응답 메시지

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

<!DOCTYPE html>
<html>
<head>
 <title>Example Page</title>
</head>
<body>
 <h1>Hello, World!</h1>
</body>
</html>

 

참고로, GET 메서드에 요청 메시지 본문을 포함시키는 것은 바람직하지 않다. GET 요청 메시지에서는 메시지 본문보다 다음 예시처럼 쿼리 문자열이 사용되는 경우가 많다.

 

③ 요청 메시지

GET /index.html?name=value&name2=value2 HTTP/1.1
Host: www.example.com
Accept: *

 

HEAD - "헤더만 줘"

 

HEAD 메서드는 사실상 GET과 동일한 역할을 한다. 차이점은 응답 메시지에 메시지 본문이 포함되지 않는다는 것이다. 즉, HEAD 메서드를 사용하면 서버는 요청에 대한 응답으로 응답 메시지의 헤더만을 반환한다. 다음 예시는 앞의 예시와 동일한 URI로 HEAD 요청을 보낸 예시다. 

 

① 요청 메시지

HEAD /example-page HTTP/1.1
Host: www.example.com
Accept: *

 

아래는 이에 대한 응답 메시지다. 본문 없이 헤더만 보내진다. 

 

② 응답 메시지

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

 

POST - "처리해줘"

 

POST 메서드는 서버로 하여금 특정 작업을 처리하도록 요청하는 메서드다. GET이 '이거 줘'와 같은 메서드라면 POST는 '이걸 처리해 줘'와 같은 메서드로 이해하면된다. 이에 따라 POST는 범용성이 매우 넓은 메서드다. 

 

예를들어 'http://example.com/posting'에 접속했을 때 화면이 다음과 같고, 어떤 클라이언트가 입력 폼에 글을 입력한 뒤, [게시하기] 버튼을 눌렀다고 가정해보자.

 

이때 클라이언트는 서버에 어떤 요청을 보낼까? '이 글을 처리해 주세요'라는 요청을 보내야한다. 이때 POST 메서드가 사용된다. 처리할 대상은 흔히 메시지 본문으로 명시된다. 다음은 이에 대한 예시다. 

POST /posting HTTP/1.1 // 시작 라인(요청 라인)
Host: www.example.com //필드 라인
--나머지 헤더 생략-- //필드 라인

{ // 이하 메시지 본문 
 "Id": 1, // 게시글 ID
 "Title": "오늘도 즐거운 날입니다", // 글 제목
 "Contents": "재미있는 글 보고 가세요~" // 본문
}

 

POST 메서드가 범용성이 넓은 메서드라고는 하나, 많은 경우에 '클라이언트가 서버에 새로운 자원을 생성하고자 할 때' 사용된다. 그리고 만약 성공적으로 POST 요청이 처리되어 새로운 자원이 생성되면 서버는 응답 메시지의 Location 헤더를 통해 새로 생성된 자원의 위치를 클라이언트에게 알려줄 수 있다. 다음 응답 메시지의 예시를 보자. 새로 생성된 자원은 '/posting/1'에서 확인할 수 있다는 의미다.

HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 100
Date: Mon, 14 Oct 2024 16:35:00 PST
Location: /posting/1

{
 "Id": 1,
 "Title": "오늘도 즐거운 날입니다",
 "Contents": "재미있는 글 보고 가세요~"
}

 

PUT - "덮어써줘"

 

PUT 메서드는 쉽게 말해 '덮어쓰기'를 요청하는 메서드다. 요청 자원이 없다면 메시지 본문으로 자원을 새롭게 생성하거나, 이미 자원이 존재한다면 메시지 본문으로 자원을 완전히 대체하는 메서드다. 예를 들어 다음의 예시에서 'example.com/posts/1'에 우측 상단과 같은 자원이 있다고 가정하고, 이에 대해 좌측 하단과 같이 PUT 요청을 보낸다면 해당 위치에 있는 자원이 요청 보낸 내용으로 대체된다.

 

PUT 요청이 성공적으로 처리되면, 추후에 'example.com/posts/1'에 접근할 시에 다음과 같은 자원을 받게 된다.

PUT 요청을 보낸 내용으로 대체된 JSON을 받는다.

 

PATCH - "일부만 수정해줘"

 

PATCH 메서드는 PUT 메서드와의 차이와 비교하며 이해하는 것이 좋다. PUT 메서드가 덮어쓰기, 완전한 대체에 가깝다면 PATCH 메서드는 부분적 수정에 가깝다. 바로 앞 예제에서의 요청 메시지를 PATCH 메서드로 바꿔 보낸 결과는 다음과 같다. PUT 메서드로 요청을 보냈을 경우 메시지 본문으로 덮어써졌지만, PATCH 메서드로 요청을 보낼 경우 메시지 본문에 맞게 자원이 일부 수정되는 것을 볼 수 있다. 

 

DELETE - "요거 삭제해줘"

 

DELETE 메서드는 특정 자원을 삭제하고 싶을 때 사용하는 메서드다. 다음 예시는 'example.com/texts/a.txt'라는 자원을 삭제하도록 요청하는 메시지다. 

DELETE /texts/a.text HTTP/1.1
Host: www.example.com

 

 

(첨언)

여기까지가 대표적인 HTTP 메서드이다. 실제 상황에서 특정 URI(URL)에 어떤 메서드로 요청을 받았을 때 서버가 어떻게 행동해야 하는지 설계하는 것은 오로지 개발자의 몫이다. 어떤 메서드는 구현할 수도 있고, 어떤 메서드는 구현하지 않을 수도 있다.

 

같은 URL에 대한 요청일지라도 사용된 메서드가 다르면 각기 다른 요청으로 간주하기 때문에, 때로는 같은 URL에 대해 메서드별 동작을 여러개 구현할 수도 있다.

 

'어떤 URL로 어떤 요청을 받았을 때 서버는 어떻게 응답할 것인가?'에 대한 개발자들의 고민의 결과는 이미 만들어진 서비스들에서 공개하는 API 문서를 보면알 수 있다. 

Youtube API
네이버 API

 

정리

 

1. HTTP 메서드란? 

  • 개념: HTTP 요청을 통해 상대 호스트(서버)에 특정 동작을 수행하게 하는 명령어.
  • 특징: 같은 URI(URL)로 요청하더라도, 어떤 메서드(명령어)를 사용하느냐에 따라 서버는 완전히 다르게 동작함.

2. 주요 HTTP 메서드 

메서드 요약 주요 특징
GET "이 자원 좀 보여줘(조회)." 요청 자원을 식별하는 정보를 본문(body)에 담지 않고, 주로 쿼리 스트링을 통해 전달함.
HEAD "헤더만 보내줘." 실제 자원을 받지 않고, 자원의 존재 여부나 메타데이터만 확인할 때 씀.
POST "내가 준 데이터로 특정 작업 좀 처리해줘." 가장 범용적인 메서드. 요청 본문에 데이터를 담아서 보냄.
PUT "기존 자원을 내가 보낸 걸로 통째로 덮어써줘." 대상 자원이 없으면 새로 생성.
PATCH "기존 자원의 일부만 수정해줘." PUT과 달리 자원의 특정 필드만 변경.
DELETE "이 자원 좀 지워줘." 지정한 자원을 삭제함.

 

기타 (자주보기힘듬)

  • OPTIONS: 서버가 지원하는 메서드가 무엇인지 확인할 때 사용 (CORS 정책에서 자주 보임).
  • CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 구축 (프록시 서버 거칠 때 사용).
  • TRACE: 대상 자원에 대한 경로를 따라 루프백 테스트를 수행 (디버깅용).

3. 메서드별 상세 설명

3.1 GET & HEAD - 자원 조회

  • GET (가져오기): '요청 대상'에 있는 서버의 자원을 가져옴.
    • 서버는 응답 헤더에 컨텐츠 타입(Content-Type), 컨텐츠 길이(Contents-Length) 등을 명시하고, 메시지 본문(body)을 통해 요청한 자원을 전달함.
    • GET 요청은 메시지 본문을 사용하지 않고 쿼리 스트링을 통해 요청 대상을 식별 할 수 있는 정보를 전달함. 
    • 예) "ID 가 255인 글을 가져와줘"의 GET 요청 라인 > 'GET /post/search?id=255 HTTP/3.0'  
  • HEAD (머리만 가져오기?): GET과 완전히 똑같지만, 응답 헤더만 받음.
    • 서버는 HEAD 메서드에 대한 응답으로 메시지 본문(body)를 제외한 헤더만 전달함.
    • 네트워크 대역폭을 아끼면서 "이 파일이 서버에 잘 있나?", "파일 크기가 얼마나 되나?" 등을 확인할 때 유용.

3.2 POST - 데이터 처리 및 생성

  • 특징: 서버에게 특정 작업을 지시하는 가장 범용적인 메서드.
  • 용도: 대표적으로 새로운 자원을 생성(글쓰기, 회원가입 등)할 때 쓰임. 생성할 데이터는 요청 메시지의 본문(body)에 담아 전달함.
  • 응답: 요청이 성공하면 서버는 새로 생성된 자원의 위치(URI)를 Location 헤더에 담아 클라이언트에게 알려줄 수 있음.

3.3 PUT vs PATCH - 자원 수정

  • PUT (전체 대체): 자원을 통째로 덮어씀.
    • 예를 들어 이름/나이가 있는 프로필에서 이름만 바꾸려고 PUT으로 이름만 보내면, 나이는 빈값(null 또는 기본값)으로 날아감.
    • 만약 요청한 대상이 서버에 없으면 새로 생성함.
  • PATCH (일부 수정): 자원의 일부만 변경.
    • 프로필에서 이름만 변경해서 보내면, 나이는 기존 상태 그대로 유지.

3.4 DELETE - 자원 삭제

  • 특징: 지정한 URI에 있는 자원을 삭제함.

4. 추가로 알면 좋은 점

  • HTTP 메서드를 공부할 때 세트로 따라오는 3가지 속성이 있음. 웹 개발 시 이 규칙을 지키면서 설계해야 정석(RESTful)이라고 인정받음.

4.1 안전 (Safe Methods)

  • 의미: 호출해도 서버의 리소스를 변경하지 않는 메서드.
  • 해당 메서드: GET, HEAD, OPTIONS, TRACE (백날 호출해도 서버 데이터 안 바뀜.)
  • 비해당 메서드: POST, PUT, PATCH, DELETE (서버 데이터를 바꾸거나 지우니까 안전하지 않음.)

4.2 멱등성 (Idempotence)

  • 의미: "같은 요청을 한 번 보내든, 백 번 보내든 서버의 최종 결과 상태가 똑같다"는 성질.
  • 해당 메서드:
    • GET: 백 번 조회해도 서버 데이터는 그대로임.
    • PUT: 백 번 똑같은 데이터로 덮어써도 최종 데이터는 똑같음.
    • DELETE: 한 번 지우나 백 번 지우나 결국 지워진 상태는 똑같음. (두 번째부턴 404에러가 나도 서버의 상태 자체는 '삭제됨'으로 동일)
  • 비해당 메서드 (중요!): POST
    • 게시글 작성을 누를 때마다 새 글이 1개, 2개, 3개... 계속 늘어남. 즉, 호출할 때마다 서버 상태가 바뀌므로 멱등하지 않음.
    • 결제 버튼을 실수로 두 번 눌렀을 때 POST 라면 중복 결제가 일어날 수 있는 이유가 바로 이 때문임.

3. 캐시 가능성 (Cacheable)

  • 의미: 웹 브라우저가 응답 결과를 자기 메모리에 저장(캐싱)해두고 재사용해도 되는가?
  • 해당 메서드: GET, HEAD (주로 조회 메서드만 캐시해서 브라우저 로딩 속도를 높임)
  • 실무 팁: 스펙상 POST, PATCH 도 캐시가 가능하지만, 본문(body) 내용까지 매칭해서 캐시하기가 너무 복잡해서 실무에서는 거의 GET 위주로만 캐싱함.