HTTP란 무엇이고 왜 중요한가: 웹 개발 기본기부터 다시 이해하기

Development

웹 개발을 하다 보면 HTTP는 너무 익숙해서 오히려 제대로 다시 보지 않고 지나치기 쉬운 개념입니다.

  • 프론트엔드는 fetch를 쓰고
  • 백엔드는 API를 만들고
  • 브라우저는 요청을 보내고
  • 서버는 응답을 줍니다

이 흐름은 너무 당연해 보여서, 어느 순간부터는 HTTP를 그냥 "요청 보내는 것" 정도로만 받아들이게 되기도 합니다.

하지만 실제로는 그렇지 않습니다.

HTTP를 제대로 이해하지 못하면:

  • GETPOST를 나누는지 흐려지고
  • 왜 어떤 요청은 캐시되고 어떤 요청은 안 되는지 감이 없고
  • 상태 코드가 왜 중요한지 단순 암기에 그치고
  • 멱등성, 캐시, 쿠키, 인증, CORS 같은 주제가 전부 따로 노는 것처럼 느껴집니다

즉, HTTP는 단순한 통신 규약 하나가 아니라, 웹에서 클라이언트와 서버가 어떻게 대화할지를 정하는 기본 언어에 가깝습니다.

이번 글에서는 단순 용어 정리보다 한 단계 더 들어가서, 왜 이런 규칙이 생겼는지와 요청 하나가 실제로 어떤 의미를 갖는지까지 같이 보겠습니다.

  1. HTTP는 무엇인지
  2. 요청과 응답은 어떻게 오가는지
  3. 브라우저에서 요청 하나가 실제로 어떻게 처리되는지
  4. 메서드와 상태 코드는 왜 필요한지
  5. 헤더와 바디는 어떤 역할을 하는지
  6. stateless, HTTPS, 캐시, 멱등성은 왜 같이 이해해야 하는지

한눈에 보면

먼저 짧게 정리하면 이렇습니다.

  • HTTP는 웹에서 클라이언트와 서버가 데이터를 주고받는 규칙입니다.
  • 핵심 모델은 requestresponse입니다.
  • 메서드는 요청의 의도를 드러내고, 상태 코드는 결과를 드러냅니다.
  • 헤더는 부가 정보, 바디는 실제 데이터에 가깝습니다.
  • HTTP는 기본적으로 stateless하며, 그래서 쿠키나 토큰 같은 상태 유지 전략이 같이 등장합니다.
  • safe, idempotent, 캐시, 리다이렉트 같은 개념은 전부 HTTP 의미 체계 안에 있습니다.
  • 실무에서는 HTTP를 이해해야 API 설계, 캐시, 인증, 보안, 성능까지 연결해서 볼 수 있습니다.

즉, HTTP를 안다는 것은 단순히 메서드 이름을 외우는 것이 아니라, 웹에서 요청과 응답이 어떤 규칙으로 오가고 어떤 의미를 가지는지 이해하는 것에 더 가깝습니다.

HTTP는 정확히 무엇일까?

HTTPHyperText Transfer Protocol의 약자입니다.

이름만 보면 오래된 문서 전송 규약처럼 느껴질 수 있습니다. 실제로 시작점은 웹 문서를 주고받는 데 있었습니다. 하지만 지금은 HTML 문서만이 아니라 거의 모든 웹 데이터가 이 위에서 오갑니다.

예를 들어 지금 웹에서는 아래가 모두 HTTP 위에서 움직입니다.

  • HTML 문서
  • CSS 파일
  • JavaScript 번들
  • 이미지
  • JSON API 응답
  • 동영상 조각

즉, HTTP는 단순히 "페이지를 여는 규칙"이 아니라, 웹 자원을 주고받는 기본 프로토콜입니다.

여기서 프로토콜이라는 말도 가볍게 넘기지 않는 편이 좋습니다.

프로토콜은 간단히 말하면:

  • 어떤 형식으로 메시지를 보낼지
  • 상대가 그 메시지를 어떻게 해석할지
  • 어떤 순서와 규칙으로 통신할지

를 정한 약속입니다.

즉, HTTP는 데이터를 "보내는 기술" 자체라기보다, 클라이언트와 서버가 서로 이해 가능한 방식으로 요청과 응답을 구성하는 약속입니다.

HTTP는 웹 통신에서 어디에 있을까?

이 부분을 이해하면 HTTP를 훨씬 덜 추상적으로 느끼게 됩니다.

웹 통신은 한 층으로만 이뤄지지 않습니다. 아주 단순화하면:

  • 애플리케이션 계층에서는 HTTP
  • 전송 계층에서는 TCP
  • 인터넷 계층에서는 IP

같은 것들이 함께 움직입니다.

개발자는 보통 HTTP를 가장 직접적으로 다루지만, 실제로는 그 아래 계층이 데이터를 전달해주기 때문에 요청과 응답이 오갈 수 있습니다.

이 구분이 중요한 이유는 문제를 층위별로 나눠 볼 수 있기 때문입니다.

  • 서버 주소를 못 찾으면 DNS 문제일 수 있고
  • 연결이 안 되면 네트워크 문제일 수 있고
  • 연결은 되는데 응답이 이상하면 HTTP 문제일 수 있고
  • 응답은 왔는데 브라우저에서 못 읽으면 CORS 같은 브라우저 정책 문제일 수 있습니다

즉, HTTP는 인터넷 전체를 뜻하는 게 아니라, 웹 애플리케이션이 어떤 형식으로 대화할지 정의하는 상위 레벨 규약입니다.

가장 중요한 모델: 요청과 응답

HTTP의 핵심은 아주 단순합니다.

  • 클라이언트가 요청을 보냅니다
  • 서버가 응답을 줍니다

이 흐름이 전부입니다.

예를 들어 브라우저가 페이지를 여는 순간을 단순화하면:

sequenceDiagram
  participant Client as Browser
  participant Server as Web Server
 
  Client->>Server: HTTP Request
  Server-->>Client: HTTP Response

여기서 중요한 점은, HTTP는 기본적으로 클라이언트가 먼저 요청해야 서버가 응답하는 구조라는 것입니다.

즉, 서버가 아무 이유 없이 브라우저에 먼저 말을 거는 방식이 아니라, 요청에 대한 응답으로 대화가 진행됩니다.

이 단순한 구조가 중요한 이유는, 웹에서 거의 모든 동작이 이 패턴 위에서 설명되기 때문입니다.

  • 페이지를 여는 것
  • API를 호출하는 것
  • 이미지 파일을 받는 것
  • 로그인 상태를 확인하는 것
  • 캐시된 응답을 재사용하는 것

전부 결국은 요청과 응답의 변형입니다.

브라우저에서 요청 하나가 실제로 나갈 때는 무슨 일이 일어날까?

실제로는 fetch('/api/posts') 한 줄 뒤에서 꽤 많은 일이 일어납니다.

아주 단순하게 보면 이런 흐름입니다.

  1. 브라우저가 URL을 해석합니다.
  2. 필요하면 DNS로 서버 주소를 찾습니다.
  3. 서버와 연결을 준비합니다.
  4. HTTP 요청 메시지를 보냅니다.
  5. 서버가 요청을 해석합니다.
  6. 서버가 HTTP 응답 메시지를 돌려줍니다.
  7. 브라우저는 상태 코드, 헤더, 바디를 바탕으로 후속 동작을 결정합니다.

예를 들어 브라우저는:

  • Content-Type을 보고 JSON인지 HTML인지 판단하고
  • Set-Cookie가 있으면 쿠키를 저장하고
  • Cache-Control이 있으면 캐시 정책을 따르고
  • 리다이렉트 응답이면 다른 URL로 다시 요청할 수 있습니다

즉, 우리가 코드에서는 요청 한 줄만 보더라도, 실제로는 브라우저, 네트워크, 서버, 캐시, 쿠키 정책이 함께 작동하는 구조입니다.

요청(Request)은 무엇으로 이루어질까?

하나의 요청은 보통 아래 요소를 가집니다.

  1. 메서드
  2. URL
  3. 헤더
  4. 바디

예를 들어:

POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/json
 
{
  "email": "user@example.com",
  "password": "1234"
}

이 요청을 보면:

  • POST: 무엇을 하려는지
  • /api/login: 어디로 보내는지
  • 헤더: 어떤 형식인지 등 부가 정보
  • 바디: 실제 데이터

가 함께 들어 있습니다.

즉, 요청은 단순히 "API를 부른다"가 아니라, 어떤 의도로, 어떤 자원에, 어떤 형식의 데이터를 담아 보내는가를 표현하는 구조입니다.

여기서 특히 중요한 것은 요청이 함수 호출이 아니라 메시지라는 점입니다.

클라이언트는 서버 내부 로직을 직접 실행하는 것이 아닙니다. 대신:

  • 어떤 자원에 대해
  • 무엇을 하고 싶고
  • 어떤 형식의 데이터를 보낼지

를 약속된 형식으로 전달합니다.

즉, HTTP는 원격 함수 호출처럼 보일 수 있지만, 본질적으로는 시스템 간 메시지 교환 모델에 더 가깝습니다.

응답(Response)은 무엇으로 이루어질까?

응답도 비슷하게 구조가 있습니다.

  1. 상태 코드
  2. 헤더
  3. 바디

예를 들어:

HTTP/1.1 200 OK
Content-Type: application/json
 
{
  "id": 1,
  "name": "Marco"
}

여기서:

  • 200 OK: 결과가 어땠는지
  • 헤더: 응답 데이터 형식이나 캐시 정책 등
  • 바디: 실제 반환 데이터

를 담고 있습니다.

즉, 응답은 "성공/실패"만 말하는 것이 아니라, 결과 상태와 실제 데이터를 함께 전달하는 형식입니다.

그리고 응답은 단순 반환값이 아닙니다. 응답 헤더와 상태 코드는 브라우저나 클라이언트가 다음에 어떻게 행동할지도 결정합니다.

예를 들어:

  • 204 No Content면 본문이 없다는 전제로 처리해야 하고
  • 301, 302면 다른 주소로 다시 이동할 수 있고
  • 304 Not Modified면 캐시된 자원을 계속 써도 된다는 뜻이 됩니다

즉, 응답은 결과 통지이면서 동시에 클라이언트 동작을 유도하는 신호 묶음입니다.

메서드는 왜 필요할까?

HTTP 메서드는 요청의 의도를 드러냅니다.

대표적으로 많이 보는 것은:

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE

입니다.

GET

보통 자원을 조회할 때 씁니다.

GET /api/users/1

즉, 가져오는 요청에 가깝습니다.

POST

보통 새로운 자원을 만들거나, 서버에서 어떤 처리를 수행하게 할 때 많이 씁니다.

POST /api/users

PUT

보통 자원을 전체 교체하는 의미로 설명됩니다.

PATCH

보통 자원의 일부 수정으로 설명됩니다.

DELETE

보통 자원을 삭제하는 요청입니다.

즉, 메서드는 단순 문법이 아니라, 이 요청이 어떤 성격의 행위인지 서버와 클라이언트가 공유하기 위한 약속입니다.

중요한 점은 메서드가 서버 동작을 물리적으로 강제하는 것은 아니라는 것입니다.

기술적으로는 서버가 GET 요청을 받아서 데이터를 수정해버릴 수도 있습니다. 하지만 그렇게 설계하면:

  • 읽는 사람의 예측이 깨지고
  • 브라우저나 프록시의 기대와 어긋나고
  • 캐시 전략이 꼬이고
  • 운영과 디버깅이 어려워집니다

즉, 메서드의 진짜 힘은 문법보다 공통 의미를 공유하게 만드는 데 있습니다.

GETPOST를 구분해야 할까?

처음에는 "어차피 서버에서 처리하면 되는 것 아닌가?" 싶을 수 있습니다. 하지만 메서드 구분은 꽤 중요합니다.

왜냐하면 메서드는:

  • 캐시 가능성
  • 브라우저 동작
  • 프록시나 CDN 해석
  • 멱등성
  • API 의미

와 연결되기 때문입니다.

예를 들어 조회를 전부 POST로 만들면, 기술적으로는 동작할 수 있어도:

  • 캐시 이점을 잃을 수 있고
  • 읽는 사람 입장에서 의도가 불분명해지고
  • 운영과 디버깅도 덜 자연스러워질 수 있습니다

즉, 메서드 선택은 단순 취향이 아니라 프로토콜 의미를 얼마나 잘 활용할 것인가의 문제입니다.

safe와 idempotent는 어떻게 다를까?

HTTP 기본기에서 정말 중요한데, 처음에는 자주 섞여서 이해되는 개념입니다.

safe

safe한 메서드는 서버 상태를 바꾸지 않는 조회성 요청으로 기대됩니다.

대표적으로 GET은 safe하다고 봅니다.

즉, 사용자가 여러 번 조회하더라도 서버 자원이 바뀌지 않아야 자연스럽습니다.

idempotent

idempotent는 같은 요청을 여러 번 보내더라도 최종 결과 의미가 같게 유지되는 성질입니다.

예를 들어:

  • 같은 PUT 요청을 여러 번 보내도 결과가 같은 상태에 수렴할 수 있고
  • 같은 DELETE 요청을 여러 번 보내도 이미 삭제된 상태라는 점에서는 같은 결과 의미를 가질 수 있습니다

왜 둘을 구분해야 할까?

safe는 "읽기 요청인가"에 가깝고, idempotent는 "반복 요청 시 결과가 안정적인가"에 가깝습니다.

그래서:

  • GET은 보통 safe하면서 idempotent하고
  • DELETE는 보통 idempotent하지만 safe하진 않고
  • POST는 일반적으로 둘 다 아닐 수 있습니다

이 구분은 실무에서 재시도 전략, 중복 제출 방지, 프록시 동작을 이해할 때 중요합니다.

상태 코드는 왜 중요할까?

상태 코드는 서버가 요청 결과를 어떻게 해석했는지 알려줍니다.

대표적으로 많이 보는 것은:

  • 200 OK
  • 201 Created
  • 204 No Content
  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 500 Internal Server Error

입니다.

1xx: 정보성 응답

실무에서 직접 다루는 경우는 많지 않지만, 요청 처리 과정이 계속 진행 중임을 나타내는 계열입니다.

2xx: 성공

요청이 성공적으로 처리됐다는 뜻입니다.

3xx: 리다이렉션

다른 위치로 이동해야 하거나, 캐시 검증 결과 본문을 다시 보낼 필요가 없을 때 쓰입니다.

예를 들어:

  • 301 Moved Permanently
  • 302 Found
  • 304 Not Modified

같은 상태 코드가 여기에 포함됩니다.

4xx: 클라이언트 요청 문제

요청 형식이 잘못됐거나, 인증/권한이 없거나, 찾는 자원이 없을 때 자주 봅니다.

5xx: 서버 문제

서버 내부 에러나 처리 실패 쪽에 가깝습니다.

즉, 상태 코드는 단순 숫자가 아니라 문제의 책임이 어디에 가까운지와 결과를 어떻게 해석해야 하는지 알려주는 신호입니다.

실무에서는 이것이 디버깅 출발점이 되기도 합니다.

  • 400이면 요청 구조를 다시 봐야 하고
  • 401이면 인증 흐름을 봐야 하고
  • 403이면 권한 정책을 봐야 하고
  • 404면 URL이나 자원 존재 여부를 봐야 하고
  • 500이면 서버 내부 로직이나 인프라를 봐야 합니다

즉, 상태 코드는 단순 분류표가 아니라 문제를 어디서부터 추적할지 알려주는 지도에 가깝습니다.

200, 201, 204는 왜 나눌까?

이 세 개는 전부 성공이라서 대충 같은 느낌으로 쓰이기도 합니다. 하지만 의미는 분명히 다릅니다.

  • 200 OK: 일반적인 성공
  • 201 Created: 새로운 자원이 생성되었음을 강조하는 성공
  • 204 No Content: 성공했지만 응답 바디는 필요 없는 경우

예를 들어:

  • 게시글 조회 성공은 200
  • 회원 생성 성공은 201
  • 삭제 성공 후 별도 데이터가 없으면 204

처럼 구분하면 API 의미가 더 또렷해집니다.

401403은 왜 다를까?

기본기에서 자주 헷갈리는 예시입니다.

  • 401 Unauthorized: 보통 인증이 안 되었거나, 인증 정보가 유효하지 않을 때
  • 403 Forbidden: 인증은 되었지만, 해당 자원에 접근할 권한이 없을 때

즉:

  • "누구인지 확인이 안 됨"
  • "누구인지는 알겠는데 허용되지 않음"

의 차이에 가깝습니다.

이 차이를 이해하면 프론트에서도:

  • 로그인 페이지로 보내야 할지
  • 권한 없음 화면을 보여줘야 할지

를 더 명확하게 나눌 수 있습니다.

헤더는 무엇을 담고 있을까?

헤더는 요청이나 응답의 부가 정보를 담습니다.

자주 보는 예시는:

  • Content-Type
  • Authorization
  • Accept
  • Cache-Control
  • Cookie
  • Set-Cookie

입니다.

예를 들어:

  • Content-Type: application/json은 바디 형식을 말하고
  • Authorization은 인증 정보를 담고
  • Cache-Control은 캐시 정책을 말하고
  • Set-Cookie는 브라우저에 쿠키를 심습니다

즉, 헤더는 본문 그 자체보다, 이 데이터를 어떻게 해석하고 어떻게 다뤄야 하는가에 대한 메타 정보에 가깝습니다.

조금 더 구조적으로 보면 헤더는 몇 가지 큰 역할을 가집니다.

1. 표현 정보

  • Content-Type
  • Content-Length
  • Content-Encoding

같은 값으로 바디를 어떻게 해석해야 하는지 알려줍니다.

2. 협상 정보

  • Accept
  • Accept-Language

처럼 클라이언트가 어떤 형식을 선호하는지 전달할 수 있습니다.

3. 인증과 상태 유지

  • Authorization
  • Cookie
  • Set-Cookie

로 사용자를 식별하거나 인증 정보를 전달합니다.

4. 캐시 제어

  • Cache-Control
  • ETag
  • Last-Modified

로 응답을 얼마나 재사용할 수 있는지 알려줍니다.

즉, 헤더는 부가 정보라기보다 HTTP 동작 방식을 제어하는 중요한 계약면입니다.

바디는 언제 있고 언제 없을까?

이것도 헷갈리기 쉬운 부분입니다.

보통:

  • POST, PUT, PATCH는 바디가 있는 경우가 많고
  • GET은 보통 바디 없이 쓰는 편입니다

예를 들어 로그인 요청은:

POST /api/login
Content-Type: application/json
 
{
  "email": "user@example.com",
  "password": "1234"
}

처럼 바디에 데이터를 담기 쉽습니다.

즉, 바디는 보통 실제 전달하려는 데이터 본문입니다.

다만 "바디가 곧 JSON"은 아닙니다. 실제로 바디에는:

  • JSON
  • HTML
  • 텍스트
  • 파일 바이너리
  • multipart/form-data

같은 다양한 형태가 들어갈 수 있습니다.

즉, 바디는 내용이고, 그 내용을 어떻게 해석할지는 헤더가 알려줍니다.

URL은 왜 중요할까?

많은 경우 메서드만 생각하고 URL 설계를 가볍게 보는데, URL도 의도를 드러내는 중요한 부분입니다.

예를 들어:

  • /api/users
  • /api/users/1
  • /api/users/1/posts

는 자원의 구조를 보여줍니다.

즉, 좋은 HTTP 설계는 메서드만 REST스럽게 쓰는 것이 아니라, URL도 자원 중심으로 읽히게 만드는 것과 연결됩니다.

반대로 URL에 동사를 과하게 넣으면 메서드와 의미가 겹치기도 합니다.

예를 들어:

  • POST /createUser
  • POST /users

를 비교하면, 후자가 HTTP 메서드와 자원 개념이 더 자연스럽게 맞습니다.

즉, 메서드가 행위를 드러낸다면 URL은 그 행위의 대상인 자원을 드러내는 편이 좋습니다.

HTTP는 왜 stateless라고 할까?

이건 정말 중요한 기본기입니다.

HTTP는 기본적으로 stateless하다고 말합니다. 뜻은 간단합니다.

각 요청은 서로 독립적이고, 서버는 이전 요청을 기본 전제로 기억하지 않는다는 뜻

예를 들어:

  • 첫 번째 요청이 왔다고 해서
  • 두 번째 요청을 자동으로 "같은 사용자"의 흐름으로 이해하는 것은 아닙니다

그래서 웹에서는 상태를 유지하기 위해 별도 장치가 필요합니다.

  • 쿠키
  • 세션
  • 토큰

같은 것들이 여기서 등장합니다.

즉, HTTP가 stateless하다는 것은 "상태를 절대 못 가진다"가 아니라, 프로토콜 기본 모델은 상태를 들고 있지 않으므로 상태 유지는 별도 메커니즘으로 해야 한다는 뜻입니다.

이게 중요한 이유는 확장성과도 연결되기 때문입니다.

각 요청이 필요한 정보를 스스로 충분히 담고 있다면:

  • 어떤 서버 인스턴스가 받아도 처리하기 쉬워지고
  • 로드밸런싱이 쉬워지고
  • 서버를 수평 확장하기도 쉬워집니다

즉, stateless는 단순한 정의 문제가 아니라 웹 시스템을 확장 가능하게 만드는 설계 특성이기도 합니다.

왜 쿠키와 토큰이 HTTP와 같이 이야기될까?

이제 자연스럽게 연결됩니다.

HTTP 자체는 요청 사이 상태를 기본으로 기억하지 않기 때문에, 로그인 상태 유지 같은 문제를 풀려면 별도의 상태 전달 수단이 필요합니다.

예를 들어:

  • 서버가 Set-Cookie로 세션 식별자를 내려주고
  • 브라우저가 이후 요청에 Cookie 헤더로 자동 전송하거나
  • 클라이언트가 토큰을 헤더에 실어 보낼 수 있습니다

즉, 인증은 HTTP와 별개 주제가 아니라, stateless한 프로토콜 위에서 상태를 어떻게 이어붙일 것인가의 문제에 가깝습니다.

HTTPS는 HTTP와 무엇이 다를까?

많은 사람이 HTTPS를 그냥 "보안 버전" 정도로만 이해합니다. 방향은 맞지만 조금 더 정확히 보면 좋습니다.

HTTPSHTTP에 암호화 계층(TLS)이 추가된 형태에 가깝습니다.

즉, HTTP 메시지 구조 자체가 완전히 다른 것이 아니라:

  • 요청/응답은 여전히 HTTP 규칙을 따르되
  • 전송 구간이 암호화됩니다

그래서:

  • 중간에서 내용을 훔쳐보기 어려워지고
  • 전송 중 위변조 위험을 줄이고
  • 서버 신뢰성을 인증할 수 있습니다

즉, 오늘날 웹에서 HTTP를 이해한다는 것은 거의 항상 실제 운영에서는 HTTPS가 기본이라는 점까지 함께 이해하는 것을 포함합니다.

특히 로그인, 인증 토큰, 세션 쿠키, 결제 정보가 오가는 서비스에서는 사실상 필수입니다. 현대 웹에서는 "보안이 필요하면 HTTPS"가 아니라, 기본이 HTTPS이고 HTTP가 예외에 가까운 편입니다.

캐시는 왜 HTTP 기본기에서 중요할까?

이것도 실무에서 정말 중요합니다.

HTTP는 단순 통신만이 아니라, 자원을 효율적으로 전달하기 위한 캐시 모델도 함께 가집니다.

예를 들어 응답 헤더에:

Cache-Control: max-age=3600

같은 값이 있으면, 브라우저나 중간 캐시 계층이 일정 시간 응답을 재사용할 수 있습니다.

이게 중요한 이유는:

  • 성능
  • 서버 부하
  • 사용자 체감 속도

와 직접 연결되기 때문입니다.

즉, 캐시는 프론트 최적화의 부가 기능이 아니라, HTTP가 원래부터 갖고 있는 중요한 기본 기능입니다.

그리고 캐시는 단순히 "한 번 받아오면 저장한다"로 끝나지 않습니다.

실제로는:

  • 아예 재요청 없이 재사용할 수도 있고
  • 서버에 "이 버전 그대로인가요?"라고 검증 요청을 보낼 수도 있습니다

예를 들어 ETag, Last-Modified 같은 헤더를 활용하면 브라우저는 조건부 요청을 보낼 수 있고, 서버는 내용이 바뀌지 않았다면 304 Not Modified로 짧게 응답할 수 있습니다.

즉, HTTP 캐시는 네트워크 비용과 서버 비용을 줄이기 위한 정교한 약속 체계입니다.

멱등성은 왜 같이 알아야 할까?

멱등성(idempotency)은 같은 요청을 여러 번 보내도 결과 의미가 같게 유지되는 성질로 이해할 수 있습니다.

예를 들어:

  • GET은 보통 멱등적으로 기대하고
  • DELETE도 같은 자원을 여러 번 삭제 요청해도 상태가 크게 달라지지 않는 쪽으로 설계되며
  • POST는 일반적으로 멱등적이지 않을 수 있습니다

왜 중요할까요?

실무에서는:

  • 재시도 정책
  • 네트워크 실패 복구
  • 중복 요청 대응

과 연결되기 때문입니다.

즉, HTTP 메서드를 제대로 이해한다는 것은 단순 CRUD 암기가 아니라, 이 요청이 재시도 가능하고 안전하게 다뤄질 수 있는가까지 포함해서 보는 것입니다.

예를 들어 사용자가 결제 버튼을 눌렀는데 네트워크가 끊겼다고 해봅시다. 이때 같은 요청을 다시 보내도 안전한지, 중복 결제가 생기지 않는지 같은 문제는 결국 HTTP 의미와 API 설계를 제대로 이해해야 풀 수 있습니다.

즉, 멱등성은 이론 문제가 아니라 중복 요청과 장애 상황에서 시스템을 어떻게 안전하게 만들 것인가와 연결됩니다.

실제 예시로 보면 더 잘 보인다

예를 들어 게시글 API를 생각해보면:

GET /posts/1

은 게시글을 조회합니다.

POST /posts

은 새 게시글을 만듭니다.

PATCH /posts/1

은 일부 내용을 수정합니다.

DELETE /posts/1

은 삭제합니다.

이걸 보면 HTTP는 단순 URL 호출이 아니라, 자원과 행위를 함께 표현하는 규칙이라는 점이 더 잘 보입니다.

그리고 여기에 상태 코드와 캐시 정책까지 합쳐지면 하나의 API는 훨씬 풍부한 의미를 갖게 됩니다.

  • 조회 응답은 200
  • 생성 응답은 201
  • 삭제 성공은 204
  • 없어진 자원 조회는 404
  • 캐시 검증 성공은 304

즉, HTTP는 URL 하나만이 아니라 메서드, 상태 코드, 헤더, 바디가 함께 의미를 만드는 구조입니다.

프론트엔드와 백엔드가 HTTP를 볼 때 차이는 무엇일까?

둘 다 HTTP 위에서 일하지만, 관심 포인트는 조금 다를 수 있습니다.

프론트엔드가 주로 보는 것

  • 어떤 URL로 호출하는가
  • 어떤 메서드를 쓰는가
  • 어떤 상태 코드에 어떤 UI를 보여줄 것인가
  • 인증 헤더, 쿠키, CORS, 캐시

백엔드가 주로 보는 것

  • 어떤 자원 구조로 API를 설계할 것인가
  • 어떤 상태 코드를 돌려줄 것인가
  • 캐시 정책, 멱등성, 인증/인가 정책
  • 프록시, 로드밸런서, 서버 운영

즉, 역할은 조금 달라도 기본 언어는 같습니다. 그래서 HTTP 기본기를 잘 알수록 프론트와 백엔드 사이 커뮤니케이션도 더 정확해집니다.

결국 좋은 협업은 "엔드포인트 하나 만들었다"가 아니라:

  • 이 요청은 왜 GET인지
  • 왜 응답이 204인지
  • 왜 쿠키가 필요한지
  • 왜 캐시를 허용하거나 막았는지

같은 의미를 양쪽이 함께 이해할 때 가능해집니다.

HTTP는 결국 시스템 간 계약이다

여기까지 보면 HTTP는 단순히 요청 한 번 보내는 기술이 아니라는 점이 분명해집니다.

HTTP 안에는 이미:

  • 요청과 응답 구조
  • 메서드 의미
  • 상태 코드 의미
  • 표현 형식
  • 캐시 정책
  • 인증 전달
  • 리다이렉트

같은 시스템 간 계약 요소가 들어 있습니다.

그래서 좋은 API 설계란 새로운 규칙을 많이 만드는 것이 아니라, HTTP가 원래 제공하는 의미를 잘 활용하는 것에 가까운 경우가 많습니다.

자주 하는 오해

정리하면 아래 오해가 정말 많습니다.

1. HTTP는 그냥 API 부르는 방법이다

아닙니다. 웹에서 자원을 주고받는 기본 프로토콜입니다.

2. GETPOST는 그냥 취향 차이다

아닙니다. 의도, 캐시, 멱등성, 의미가 다릅니다.

3. 상태 코드는 성공/실패만 알면 된다

아닙니다. 책임 위치와 처리 방향을 구분하는 중요한 정보입니다.

4. stateless는 상태를 절대 못 가진다는 뜻이다

아닙니다. 기본 프로토콜이 상태를 기억하지 않는다는 뜻이고, 상태 유지는 별도 메커니즘으로 합니다.

5. HTTPS는 HTTP와 완전히 다른 것이다

완전히 다른 프로토콜이라기보다, HTTP 위 전송 구간 보안을 강화한 형태로 이해하는 편이 더 자연스럽습니다.

6. 헤더는 있으면 좋고 없어도 되는 부가 정보다

아닙니다. 인증, 캐시, 콘텐츠 해석, 쿠키, 압축 여부 등 핵심 동작이 헤더를 통해 결정됩니다.

7. HTTP를 알면 결국 메서드와 상태 코드만 외우면 된다

아닙니다. 중요한 것은 각 요소가 왜 존재하는지, 그리고 서로 어떻게 연결되는지 이해하는 것입니다.

같이 보면 좋은 글

결론

HTTP는 웹 개발에서 너무 기본이라 오히려 얕게 알고 지나가기 쉬운 주제입니다. 하지만 실제로는 요청과 응답, 메서드, 상태 코드, 헤더, 상태 유지, 보안, 캐시까지 모두 연결하는 핵심 기본기입니다.

짧게 정리하면:

  • HTTP는 클라이언트와 서버가 대화하는 규칙이고
  • 요청과 응답 구조를 중심으로 이해해야 하며
  • 메서드, 상태 코드, 헤더는 전부 의미를 가진 약속이며
  • stateless, 캐시, 안전한 재시도 같은 특성까지 함께 이해해야 제대로 보입니다

결국 HTTP를 제대로 안다는 것은 단순히 API를 호출할 줄 안다는 뜻이 아니라, 웹에서 데이터가 어떤 규칙과 의미를 가지고 오가는지 이해하는 것에 더 가깝습니다.