이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.
공부 › 네트워크 › HTTP
HTTP 메시지와 상태 코드
요청과 응답은 이렇게 생긴 글자다
브라우저와 서버가 주고받는 HTTP 메시지는 정해진 모양의 글자입니다. 요청에는 "무엇을(주소) 어떻게(메서드)"가, 응답에는 "어떻게 됐는지(상태 코드)"가 첫 줄에 적힙니다.
일부만 실행으로 확인 · 메시지 구조는 실제 원문과 대조, 상태 코드는 표준 기준
이 실습에 나오는 개념
- HTTP와 무상태(Stateless)
- HTTP는 클라이언트가 요청을 보내면 서버가 응답하는 방식의 통신 규약이다. 무상태라는 것은 서버가 이전 요청의 내용을 기억하지 않아 각 요청이 그 자체로 처리에 필요한 정보를 모두 담고 있어야 한다는 뜻이다. 서버가 상태를 기억하지 않으므로 어느 서버가 요청을 받아도 되어 서버를 늘리기 쉽다. 로그인 상태처럼 이어져야 하는 정보는 쿠키, 세션, 토큰으로 유지한다.
- HTTP 메서드
- 요청이 자원에 대해 수행하려는 동작을 나타낸다. GET은 조회, POST는 생성이나 처리 요청, PUT은 전체 교체, PATCH는 일부 수정, DELETE는 삭제를 뜻한다. 메서드의 의미에 맞게 사용해야 캐시, 재시도 같은 HTTP의 동작이 기대대로 이뤄진다.
- HTTP 상태 코드
- 서버가 요청을 처리한 결과를 나타내는 세 자리 숫자다. 2xx는 성공, 3xx는 다른 위치로의 이동(리다이렉션), 4xx는 클라이언트의 요청에 문제가 있음, 5xx는 서버 쪽 오류를 뜻한다. 200(성공), 201(생성됨), 400(잘못된 요청), 401(인증 필요), 403(권한 없음), 404(없음), 500(서버 오류)이 자주 쓰인다.
- REST
- 웹의 자원을 URI로 식별하고, 그 자원에 대한 행위를 HTTP 메서드로 표현하며, 자원의 표현(JSON 등)을 주고받는 아키텍처 스타일이다. 서버가 클라이언트의 상태를 저장하지 않는 무상태성과 일관된 인터페이스를 특징으로 한다. 실무에서는 이 원칙에 따라 설계한 HTTP API를 REST API라고 부른다.
- URI와 URL
- URI는 자원을 식별하는 문자열이고, URL은 그중 자원의 위치(접근 방법과 주소)로 식별하는 것이다. 웹에서 쓰는 주소는 대부분 URL이며 URL은 URI에 포함되는 개념이다.
이렇게 바꿔 보세요
- 처음 설정으로 — 조회 성공. 200과 함께 본문이 옵니다.
- 새 주문 등록 — 201과 함께 새로 만들어진 주소를 알려 줍니다.
- 잘못된 요청 — 400. 보낸 쪽이 고쳐야 합니다.
- 로그인 안 함 / 권한 없음 — 로그인하지 않으면 401, 로그인했지만 권한이 없으면 403이 돌아옵니다.
- 없는 주문 — 404. 주소가 가리키는 대상이 없습니다.
- 서버 오류 — 500. 보낸 쪽이 아니라 서버가 고쳐야 합니다.
처음 설정으로 실행하면
- 요청의 첫 줄(시작 줄)입니다. 메서드 GET, 대상 경로 /orders/1, 프로토콜 버전 순서입니다. 메서드는 "무엇을 하려는지", 경로는 "무엇에 대해서인지"를 나타냅니다.
- 그다음 줄들은 헤더입니다. "이름: 값" 형태로 요청에 대한 부가 정보를 싣습니다. Host는 어느 사이트로 가는 요청인지, Authorization은 누가 보내는지 알려 줍니다.
- 헤더가 끝났다는 표시로 빈 줄이 하나 들어갑니다. 이 요청은 보낼 데이터가 없어 본문이 없습니다. 서버는 이 요청 하나만 보고 처리할 수 있어야 합니다. 앞서 보낸 요청을 기억하지 않기 때문입니다(무상태).
- 서버의 응답입니다. 첫 줄의 상태 코드는 200 OK입니다. 세 자리 숫자의 첫 자리가 큰 분류입니다: 2xx 성공.
- 요청한 주문을 찾아 본문에 담아 돌려줍니다.
실행 결과
- 상태 코드의 첫 자리만 봐도 대응이 갈립니다. 4xx는 대부분 요청 쪽을 고쳐야 풀립니다(408, 429처럼 잠시 뒤 다시 보내면 되는 경우도 있습니다). 5xx는 서버 쪽 문제라서 잠시 뒤 다시 시도해 볼 수 있습니다. 모니터링에서도 4xx와 5xx를 따로 셉니다.
- HTTP 메시지는 시작 줄, 헤더, 빈 줄, 본문의 네 부분입니다. 요청의 시작 줄에는 메서드와 경로가, 응답의 시작 줄에는 상태 코드가 들어갑니다.
코드
@GetMapping("/orders/{id}")
OrderDto get(@PathVariable long id) {
return orderService.find(id); // 200 OK + JSON 본문
}
이 모형의 전제
메시지의 구조(시작 줄, 헤더, 빈 줄, 본문)는 실제 HTTP 서버와 소켓으로 주고받은 원문에서 확인한 모양 그대로이며, 화면에서는 주요 헤더만 남겼습니다. 상황별 상태 코드는 HTTP 표준(RFC 9110)의 정의와 REST API에서 널리 쓰는 관례를 따랐습니다. 남의 자원에 대한 요청에 403 대신 404를 주어 자원의 존재를 숨기는 설계도 있습니다.
앞 실습: 흐름 제어와 혼잡 제어 · 다음 실습: HTTP/1.1, 2, 3