이 글에서 얻는 것

  • HTTP 메시지 해부: Start Line, Header, Body 구조를 명확히 이해합니다.
  • 메서드의 의미: GET vs POST 차이를 넘어, PUT vs PATCH, 멱등성(Idempotence)의 중요성을 압니다.
  • 상태 코드의 언어: 200, 201, 400, 401, 403, 404, 500, 502의 정확한 쓰임새를 익힙니다.

1. HTTP 메시지 구조: 편지 봉투와 내용물

HTTP 메시지는 텍스트 기반이며, 크게 3부분으로 나뉩니다.

POST /api/users HTTP/1.1     <-- Start Line (요청 라인)
Host: example.com            <-- Headers
Content-Type: application/json
Authorization: Bearer token

{                            <-- Body (본문)
  "name": "Alice",
  "age": 25
}
  1. Start Line:
    • 요청: Method PATH Version (예: GET /index.html HTTP/1.1)
    • 응답: Version StatusCode StatusText (예: HTTP/1.1 200 OK)
  2. Headers: 메타데이터 (보내는 사람, 타입, 길이, 인증 정보 등).
  3. Empty Line (CRLF): 헤더와 본문을 나누는 경계선. 필수입니다.
  4. Body: 실제 전송할 데이터 (HTML, JSON, 이미지 등). 없는 경우도 많습니다(GET 등).

2. HTTP 메서드(Method): 동사(Verb)

서버에게 “무엇을 하라"고 시키는 명령어입니다.

메서드의미Body 유무멱등성(Idempotence)
GET리소스 조회. 상태 변경 없음.XO
POST리소스 등록 또는 프로세스 처리.OX
PUT리소스 대체 (없으면 생성, 있으면 덮어쓰기).OO
PATCH리소스 부분 변경.O△ (구현 나름)
DELETE리소스 삭제.XO

**멱등성(Idempotence)**이란? 연산을 한 번 하든, 백 번 하든 결과(서버 상태)가 똑같은 성질.

  • DELETE /users/1: 1번 유저를 지운다. 100번 호출해도 1번 유저는 없는 상태. (멱등)
  • POST /users: 유저를 추가한다. 100번 호출하면 유저 100명 생성. (멱등 X)

3. HTTP 상태 코드(Status Code): 결과 보고

서버가 클라이언트에게 “일이 어떻게 됐는지” 알려주는 3자리 숫자입니다.

2xx: 성공 (Success)

  • 200 OK: 요청 성공. 가장 일반적.
  • 201 Created: 생성 성공. (주로 POST 요청의 응답, Location 헤더에 생성된 URI 포함)
  • 204 No Content: 성공했는데 줄 건 없음. (주로 DELETE 성공 시)

3xx: 리다이렉션 (Redirection)

  • 301 Moved Permanently: 영구 이동. (주소 바뀜, SEO 점수 이동)
  • 302 Found: 임시 이동.
  • 304 Not Modified: “너 캐시 가지고 있지? 그거 그대로 써.” (성능 최적화 핵심)

4xx: 클라이언트 오류 (Client Error) - “네가 잘못했어”

  • 400 Bad Request: 요청 파라미터가 틀림, JSON 형식이 깨짐 등.
  • 401 Unauthorized: 인증 필요. (로그인 안 함)
  • 403 Forbidden: 권한 부족. (로그인은 했는데 접근 불가)
  • 404 Not Found: 리소스 없음. (URL 오타)
  • 405 Method Not Allowed: GET만 되는데 POST를 보냄.
  • 429 Too Many Requests: 요청 너무 많이 보냄 (Rate Limit).

5xx: 서버 오류 (Server Error) - “내가(서버가) 잘못했어”

  • 500 Internal Server Error: 서버 내부 로직 에러 (NPE 등).
  • 502 Bad Gateway: 게이트웨이(Nginx)가 뒷단 서버(Tomcat)로부터 이상한 응답을 받음.
  • 503 Service Unavailable: 서버 과부하, 점검 중.
  • 504 Gateway Timeout: 뒷단 서버가 응답을 안 줌 (시간 초과).

4. HTTP 헤더(Header): 꼬리표

필수/주요 헤더

  • Host: 요청하는 도메인 이름. (가상 호스팅 환경에서 필수)
  • Content-Type: Body의 형식. (application/json, text/html)
  • Content-Length: Body의 길이(바이트).
  • Authorization: 인증 토큰 (Bearer ...).
  • User-Agent: 클라이언트 정보 (브라우저/OS).

협상(Negotiation)

  • Accept: 클라이언트가 원하는 데이터 타입 (application/json).
  • Accept-Language: 원하는 언어.

요약

  1. GET은 조회(안전, 멱등), POST는 처리(보안, 데이터 변경).
  2. 2xx는 성공, 4xx는 네 탓, 5xx는 내 탓.
  3. 401은 로그인 필요, 403은 권한 부족.
  4. 메시지는 Start Line, Header, Body로 구성되며 헤더와 바디 사이엔 빈 줄이 있다.