Network

[2편] HTTP 메서드부터 상태 코드, 주요 헤더까지

readyoun 2025. 3. 26. 03:23

“Top 10” HTTP Status Code explained you need to know as a Front End Developer

1. 개요

이번 포스트에서는 HTTP의 핵심 요소인 메서드, 상태 코드, 주요 헤더에 대해 살펴봅니다.

 

REST API 설계, 클라이언트-서버 통신 흐름 파악, 인증 및 보안 처리 등

실무 전반에서 자주 마주치는 필수 기초입니다.


2. HTTP 메서드 – 요청의 목적을 나타내는 방식

HTTP는 클라이언트가 서버에 요청을 보낼 때 무엇을 하고 싶은지를 명시합니다.
이는 HTTP 메서드(Method)를 통해 표현됩니다.

 

메서드 설명
GET 리소스를 조회할 때 사용. URL에 데이터를 포함하고 본문은 없음
HEAD GET과 같지만 본문 없이 헤더 정보만 요청
POST 서버에 리소스를 생성할 때 사용. 본문에 데이터 포함
PUT 리소스를 전체 수정할 때 사용
PATCH 리소스를 일부 수정할 때 사용
DELETE 리소스를 삭제할 때 사용

✅ 예시: GET 요청

GET /posts/1 HTTP/1.1
Host: example.com

✅ 예시: POST 요청

POST /posts HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 52

{
  "title": "Hello",
  "body": "World"
}

3. 상태 코드 – 요청 결과를 알려주는 번호

HTTP 응답은 항상 세 자리 숫자인 상태 코드(Status Code) 를 포함하며,
클라이언트가 요청한 작업의 처리 결과를 알려줍니다.

✅ 상태 코드 범위

범위 설명
1xx 처리 중 (정보성 응답)
2xx 요청 성공
3xx 리다이렉션 (다른 URL로 이동 필요)
4xx 클라이언트 오류 (요청 문제)
5xx 서버 오류 (서버 문제)

✅ 자주 사용하는 2xx 상태 코드

코드 설명
200 OK 요청이 성공적으로 처리됨
201 Created 새로운 리소스가 생성됨 (POST)
202 Accepted 요청을 받았지만 아직 처리되지 않음
더보기
『이것이 취업을 위한 컴퓨터 과학이다』, p.454

✅ 리다이렉션 관련 3xx 상태 코드

리다이렉션(redirection)이란?

: 클라이언트가 요청한 자원이 다른 곳에 있을 때 다른 곳으로 요청을 이동시키는 것

『이것이 취업을 위한 컴퓨터 과학이다』, p.455

자원이 이동되었을 때 서버는 Location 헤더와 함께 리다이렉션 상태 코드를 반환하여
“이 자원은 여기로 옮겨졌어요” 라고 클라이언트에게 알려줍니다.

클라이언트는 이를 수신한 후, Location에 명시된 주소로 자동으로 재요청을 수행하고,
새 위치의 자원에 대한 응답을 새롭게 받아 처리하게 됩니다.
코드 설명
301 Moved Permanently 요청한 리소스가 영구적으로 이동됨
302 Found 일시적으로 이동됨
304 Not Modified 클라이언트 캐시 사용 가능 (변경 없음)
더보기
『이것이 취업을 위한 컴퓨터 과학이다』, p.455

🔁 리다이렉션(Redirection)의 종류와 상태 코드 비교

1. 영구적 리다이렉션 (Permanent Redirect)

자원이 영구적으로 이동되었음을 나타내는 리다이렉션입니다.

- 대표 상태 코드: `301 Moved Permanently`, `308 Permanent Redirect`

- 클라이언트는 이후부터 항상 새 URL을 사용해야 함

- 검색 엔진도 URL 변경을 반영함 (SEO 영향 있음)

『이것이 취업을 위한 컴퓨터 과학이다』, p.456

- `301`: 원래는 GET 요청만 고려했으나, 실제 구현에서는 POST → GET으로 바뀌는 경우도 있음  

- `308`: 요청 방식(예: POST)을 그대로 유지하고 새 URL로 리다이렉트 (보다 명확한 동작)

 

2. 일시적 리다이렉션 (Temporary Redirect)

자원이 임시로 다른 위치에 있는 경우, 혹은 특정 조건에서만 위치가 변경된 경우 사용됩니다.

- 대표 상태 코드: `302 Found`, `307 Temporary Redirect`, `303 See Other`
- 이후 요청에서는 여전히 원래 URL을 사용할 수 있음

『이것이 취업을 위한 컴퓨터 과학이다』, p.457

- `302`: 전통적으로 많이 사용되었으나, 명확한 의미 없이 POST → GET으로 바뀌는 등 불명확성 존재
- `307`: 요청 메서드를 그대로 유지하여 재요청 (POST → POST)
- `303`: 메서드를 GET으로 변경하여 리소스를 다시 요청하는 방식 (주로 응답 페이지 안내 시 사용)

 

✅ 상황에 따라 적절한 리다이렉션 선택이 중요합니다!

상태 코드 설명 요청 방식 유지 여부 주 용도
301 영구 이동 유지 안 될 수 있음 URL 구조 변경
308 영구 이동 유지됨 REST API 안전한 리다이렉션
302 임시 이동 유지 안 됨 (대개 GET) 전통적 웹 페이지 이동
307 임시 이동 유지됨 폼 제출 등 보존 필요
303 다른 위치 보기 GET으로 변경됨 응답 안내 페이지 등

💡 REST API에서는 308, 307을 사용하는 것이 안전하며, 브라우저 기반 응답 페이지 안내에는 303이 유용합니다.

✅ 클라이언트 오류 4xx 상태 코드

코드 설명
400 Bad Request 잘못된 요청 형식
401 Unauthorized 인증 필요 (로그인 안 됨)
403 Forbidden 권한 없음 (로그인해도 접근 불가)
404 Not Found 존재하지 않는 자원 요청
405 Method Not Allowed 지원하지 않는 메서드 사용
『이것이 취업을 위한 컴퓨터 과학이다』, p.457

💡 401 vs 403의 차이:
401은 인증(authentication)이 필요함,
403은 인증했지만 인가(authorization)가 없음.

[ 여기서 잠깐! ]  
인증(Authentication) vs 인가(Authorization)

구분 인증 (Authentication) 인가 (Authorization)
의미 "당신이 누구인지 확인" "당신이 이걸 할 수 있는 권한이 있는가?"
목적 사용자의 신원 확인 접근 권한 부여 여부 결정 
예시 로그인 (ID/PW, 토큰 등) 관리자만 설정 페이지 접근 허용
상태 코드 관련 401 Unauthorized 403 Forbidden

인증은 "너 누구야?", 인가는 "너 이거 해도 돼?"

인증 vs 인가 자세히 : 👨‍💻 쉽게 이해하는 Authentication vs Authorization 차이

✅ 서버 오류 5xx 상태 코드

코드 설명
500 Internal Server Error 서버 내부 처리 오류
502 Bad Gateway 중간 게이트웨이 서버 오류
더보기
『이것이 취업을 위한 컴퓨터 과학이다』, p.458

『이것이 취업을 위한 컴퓨터 과학이다』, p.458


 

4. HTTP 주요 헤더

HTTP 헤더는 요청과 응답 메시지에 포함되어 메타데이터를 전달합니다.
헤더는 이름과 값으로 구성되며, Header-Name: value 형식을 가집니다.

✅ 요청 메시지에서 자주 쓰는 헤더

헤더 설명
Host 요청 대상 도메인 이름 (필수)
User-Agent 브라우저/클라이언트 정보
Referer 이전 요청 페이지의 주소 (출처)

✅ 응답 메시지에서 자주 쓰는 헤더

헤더 설명
Server 서버 소프트웨어 정보
Location 새로 생성된 리소스 주소 (POST 201, 리다이렉션 3xx)
Allow 지원하는 메서드 목록 (405 응답 시 포함됨)

✅ 요청/응답 공통으로 사용되는 헤더

헤더 설명
Content-Type 본문의 타입 (예: application/json, text/html)
Content-Length 본문의 크기 (바이트 단위)
Content-Language 콘텐츠 언어 (예: ko-KR)
Content-Encoding 압축 방식 (예: gzip)
Date 메시지 생성 시점
Connection 연결 방식 (keep-alive, close)

6. 면접 질문 예시

Q. HTTP의 킵 얼라이브(Keep-Alive)란 무엇인가요?

HTTP/1.0은 요청마다 TCP 연결을 새로 맺는 비지속 연결 방식이었지만,
HTTP/1.1부터는 기본적으로 연결을 끊지 않고 지속 연결(Persistent Connection)을 유지합니다.

 

Keep-Alive는 이러한 지속 연결을 가능하게 하는 HTTP 헤더로,
여러 개의 요청/응답을 하나의 TCP 연결로 처리할 수 있도록 합니다.

  • 장점: 연결 수 감소 → 속도 향상 + 리소스 절약
  • 예시 헤더: Connection: keep-alive
HTTP/1.0에서는 요청을 보낼 때마다 매번 새로운 TCP 연결을 맺고, 응답 후 즉시 연결을 끊는 방식인 비지속 연결을 사용했습니다. 하지만 HTTP/1.1부터는 기본적으로 지속 연결(Persistent Connection)을 지원하며, Connection: keep-alive 헤더를 통해 하나의 TCP 연결을 재사용할 수 있게 되었습니다. 이를 통해 여러 개의 요청과 응답을 하나의 연결로 처리할 수 있어, 연결 수를 줄이고 네트워크 자원을 절약하며 전체 통신 속도를 향상시킬 수 있습니다.

Q. HTTP 1.1과 HTTP 2.0의 차이점은 무엇인가요?

구분 HTTP/1.1 HTTP/2.0
데이터 형식 텍스트 기반 바이너리 기반
연결 방식 요청당 순차 처리 (HOL blocking 발생) 멀티플렉싱으로 동시 요청 가능
서버 푸시 미지원 서버 푸시(Server Push) 가능
성능 헤더 중복 많음, 느린 처리 헤더 압축 + 빠른 처리

HTTP/1.1은 텍스트 기반 프로토콜로, 요청을 순차적으로 처리하기 때문에 하나의 요청이 끝날 때까지 다음 요청을 대기해야 하는 HOL(Head-of-Line) 블로킹 문제가 있었습니다.

반면 HTTP/2.0은 바이너리 기반 프로토콜이며, 하나의 연결 내에서 여러 요청과 응답을 동시에 주고받을 수 있는 멀티플렉싱(Multiplexing)을 지원하여 병목 현상을 해결했습니다. 또한 헤더를 압축해 오버헤드를 줄이고, 서버가 클라이언트 요청 없이도 데이터를 푸시할 수 있는 서버 푸시 기능도 도입되어, 웹 페이지 로딩 성능이 크게 개선되었습니다.


Q. HTTP 메서드인 GET과 POST의 차이는 무엇인가요?

구분 GET POST
목적 데이터 조회 데이터 생성 / 전송
데이터 전달 위치 URL (쿼리 스트링) HTTP 본문 (Body)
브라우저 캐시 가능 일반적으로 불가능
예시 /search?q=chatgpt /login (본문에 id/pw 포함)

GET 메서드는 리소스를 조회할 때 사용되며, 전달할 데이터가 URL의 쿼리 문자열에 포함됩니다. 반면 POST 메서드는 리소스를 생성하거나 서버로 데이터를 전송할 때 사용되며, 데이터는 HTTP 메시지의 본문(Body)에 담깁니다. 

GET 요청은 브라우저의 캐시에 저장되거나 URL로 공유될 수 있는 반면, POST는 그렇지 않기 때문에 민감한 정보를 전송할 때는 반드시 POST 방식을 사용하는 것이 바람직합니다. 

특히 비밀번호, 토큰, 주민번호와 같은 정보는 URL에 노출될 경우 보안 사고로 이어질 수 있으므로, POST 본문을 활용하고 가능하면 HTTPS를 통해 암호화하여 전송해야 안전합니다.


Q. HTTP 메서드인 PUT과 PATCH의 차이는 무엇인가요?

구분 PUT PATCH
목적 전체 리소스 교체 일부 필드 수정
데이터 구조 전체 객체 필요 변경될 필드만 포함
멱등성 멱등 (같은 요청 여러 번 가능) 멱등일 수도, 아닐 수도 있음

PUT 메서드는 전체 리소스를 대체하는 방식으로 동작하며, 해당 리소스를 통째로 덮어쓰기 때문에 요청 본문에는 전체 객체 구조가 포함되어야 합니다. 

반면 PATCH는 리소스의 일부 필드만 선택적으로 수정할 때 사용되며, 수정하고자 하는 필드만 전달하면 됩니다. 

예를 들어 사용자의 모든 정보를 업데이트할 때는 PUT을 사용하고, 비밀번호만 변경할 경우 PATCH를 사용하는 것이 적절합니다. PUT은 동일한 요청을 여러 번 보내더라도 결과가 같기 때문에 멱등성을 가지지만, PATCH는 구현 방식에 따라 멱등성이 보장되지 않을 수도 있습니다.


Q. 리다이렉션의 정확한 의미는?

리다이렉션은 서버가 클라이언트에게
“요청한 리소스는 다른 곳으로 이동되었어요” 라고 알려주는 응답입니다.

  • 대표 상태 코드: 301, 302, 303, 307, 308
  • 함께 전달되는 Location 헤더를 통해 이동할 URL 경로가 포함됩니다.
HTTP/1.1 301 Moved Permanently
Location: /new-page
리다이렉션은 서버가 클라이언트에게 요청한 리소스가 다른 위치로 이동되었음을 알리는 응답을 보내는 것을 말합니다. 이때 클라이언트는 응답에 포함된 Location 헤더 값을 참고하여 자동으로 새 위치로 이동합니다.

대표적인 상태 코드는 301 Moved Permanently, 302 Found, 303 See Other, 307 Temporary Redirect, 308 Permanent Redirect 등이 있으며, 각각 리다이렉션의 성격에 따라 영구/임시 여부와 요청 방식 유지 여부 등이 다릅니다. 예를 들어 301은 해당 리소스가 완전히 이동되었음을 의미합니다.

Q. HTTP 요청 메시지를 보낸 클라이언트들이 이전에 접속한 URL을 알고 싶을 때?

➡️ Referer(오타 아님) 헤더를 확인하면 됩니다.

Referer: https://www.example.com/previous-page
  • 브라우저가 이전에 방문한 페이지의 URL을 서버로 전송함
  • 사용 예시: 유입 경로 분석, 보안 정책 설정 (e.g., 이미지 hotlinking 방지)
이전 페이지에서 현재 페이지로 이동했을 때의 URL 정보를 알고 싶다면, 요청에 포함된 Referer 헤더를 확인하면 됩니다.

이 헤더는 클라이언트(주로 브라우저)가 현재 요청을 보내기 전 어떤 페이지에서 왔는지를 나타내는 정보를 담고 있어, 유입 경로 분석이나 리퍼러 기반 접근 제어 등에 사용됩니다.

예를 들어, 이미지 핫링크 방지를 위해 특정 사이트에서 온 요청만 허용하는 등의 보안 정책을 설정할 때도 활용됩니다.

Q. HTTP 요청 메시지를 보낸 클라이언트들의 접속 정보를 알고 싶을 때?

➡️ User-Agent 헤더를 확인합니다.

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/123.0
  • 브라우저, 운영체제, 디바이스 정보가 포함됨
  • 사용 예시: 사용자 환경별 렌더링, 크롤러 식별 등
클라이언트의 브라우저 종류나 운영체제, 디바이스 정보 등을 확인하고 싶을 때는 요청 메시지에 포함된 User-Agent 헤더를 확인합니다.

이 헤더에는 예를 들어 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/123.0" 같은 문자열이 포함되며, 이를 통해 접속한 클라이언트의 환경을 유추할 수 있습니다. 이 정보는 다양한 디바이스에 맞게 화면을 조정하거나, 웹 크롤러와 일반 사용자를 구분하는 용도로도 사용됩니다.

7. 마무리

이번 포스트에서는 다음을 학습했습니다.

  • HTTP 메서드를 통해 요청의 목적을 정의한다.
  • 상태 코드를 통해 요청 결과를 숫자로 표현한다.
  • 헤더를 통해 다양한 요청/응답 정보를 함께 전달한다.

다음 포스트에서는 HTTPS, TLS, 인증과 상태 유지 (쿠키/세션/토큰) 등을 심화 학습할 예정입니다.


참고 자료