HTTP 요청
HTTP 요청 메시지를 보면 가장 먼저 헤더(header) 부분이 나온다.
그리고 이 헤더는 크게 두 부분으로 나누어 생각할 수 있다.
첫 번째 줄에는 요청의 핵심 정보가 들어가고, 그 아래줄들에는 요청에 대한 추가 설명 정보가 들어간다.
가장 첫 줄에는 보통 HTTP 메서드, 요청 경로, HTTP 버전이 순서대로 들어간다.
예를 들어 GET /articles HTTP/1.1 같은 형태다.
이 한 줄만 봐도 클라이언트가 무엇을 하려는지 대략 알 수 있다.
어떤 방식으로 요청하는지, 서버의 어떤 경로에 요청하는지, 어떤 버전의 HTTP 규약을 쓰는지가 여기 담겨 있기 때문이다.
HTTP 요청에는 헤더뿐 아니라 바디(body) 도 들어갈 수 있다.
요청 바디는 말 그대로 클라이언트가 서버로 전달하고 싶은 실제 데이터가 담기는 영역이다.
예를 들어 회원가입 요청에서 아이디와 비밀번호, 게시글 작성 요청에서
제목과 내용, 상품 주문 요청에서 주문 정보 같은 값들이 요청 바디에 담길 수 있다.
보통 요청 바디에는 문자열 형태의 데이터가 들어간다.
다만 이 문자열이 단순 텍스트일 수도 있고, JSON 문자열일 수도 있고, 폼 데이터 형식일 수도 있다.
즉, 바디는 “데이터가 들어가는 자리”이고, 그 데이터가 어떤 형식인지는 Content-Type 같은 헤더를 통해 함께 설명해준다.
또한 클라이언트가 서버에 데이터를 보내는 방법은 요청 바디만 있는 것이 아니다.
URL 자체를 통해서도 데이터를 전달할 수 있다. 대표적으로는 Query String과 Path Variable이 있다.
Query String은 URL 뒤에 ?key=value 형태로 붙는 값이다.
예를 들어 /search?keyword=java&page=1 같은 주소에서 keyword와 page가 Query String이다.
보통 조회 조건이나 필터, 페이지 번호처럼 부가적인 조회 파라미터를 전달할 때 많이 사용된다.
Path Variable은 URL 경로의 일부에 직접 값을 포함시키는 방식이다.
예를 들어 /articles/10에서 10은 특정 게시글의 id를 나타내는 Path Variable이라고 볼 수 있다.
즉, Query String은 “조건” 느낌이 강하고, Path Variable은 “특정 자원 자체를 식별하는 값”이라는 느낌이 강하다.
HTTP 요청 메서드
HTTP 요청 메서드는 클라이언트가 서버에게 이 요청을 어떤 의도로 보내는지를 나타내는 중요한 정보다.
대표적으로 많이 쓰이는 메서드에는 GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS 등이 있다.
메서드의미주 용도예시
| 메서드 | 의미 | 주 용도 | 예시 |
| GET | 서버의 자원을 조회하거나 읽어오는 메서드 |
데이터 조회, 페이지 요청 | 게시글 목록 조회, 상세 조회, 브라우저 주소 입력 후 페이지 열기 |
| HEAD | GET과 비슷하지만 응답 바디 없이 헤더만 받는 메서드 |
자원의 존재 여부 확인, 헤더 정보만 확인 | 파일 크기 확인, 응답 헤더 점검 |
| POST | 새로운 자원을 생성하거나, 서버에 특정 처리를 요청하는 메서드 | 데이터 생성, 처리 요청 | 회원가입, 게시글 작성, 로그인 요청 |
| PUT | 기존 자원을 전체 수정하거나 대체하는 메서드 | 자원 전체 수정 | 회원 정보 전체 수정, 게시글 전체 내용 변경 |
| PATCH | 기존 자원의 일부만 수정하는 메서드 | 자원 부분 수정 | 프로필 이미지 변경, 게시글 제목만 수정 |
| DELETE | 특정 자원을 삭제하는 메서드 | 데이터 삭제 | 게시글 삭제, 회원 탈퇴 |
| OPTIONS | 해당 경로에서 사용할 수 있는 HTTP 메서드를 확인하는 메서드 |
지원 메서드 확인, CORS 사전 확인 |
특정 API가 GET/POST를 지원하는지 확인 |
보통 백엔드 공부 초반에는 CRUD와 연결해서 이해하면 편하다.
생성은 POST, 조회는 GET, 수정은 PUT 또는 PATCH, 삭제는 DELETE라는 식이다.
물론 실제 서비스에서는 더 복잡한 경우도 있지만, 기본 감각을 잡는 데는 이 방식이 가장 직관적이다.
HTTP 메서드를 공부할 때 자주 같이 나오는 개념이 안전성(safe)과 멱등성(idempotent) 이다.
먼저 안전한 메서드란, 해당 메서드를 사용하는 요청이 자원의 상태를 변경하지 않아야 하는 메서드를 뜻한다.
대표적으로 GET이 여기에 해당한다.
예를 들어 게시글 목록 조회 API를 GET으로 만들었다면, 이 요청을 여러 번 호출해도 게시글 데이터가 바뀌면 안 된다.
즉, 안전한 메서드는 “조회만 하고 상태는 바꾸지 않는다”는 성격을 가진다.
여기서 중요한 것은 프로토콜이 자동으로 보장해주는 것이 아니라,
개발자가 실제로 그렇게 동작하도록 코드를 작성해야 한다는 점이다.
다음으로 멱등성은 한 번 호출한 것과 여러 번 호출한 결과가 같은 자원 상태를 가지는지를 말한다.
여기서 핵심은 응답이 같아야 한다는 것이 아니라, 최종적인 자원의 상태가 같아야 한다는 것이다.
예를 들어 어떤 게시글을 삭제하는 DELETE 요청을 생각해보자.
한 번 삭제하든, 이미 삭제된 상태에서 여러 번 더 요청하든,
최종 상태는 “삭제된 상태”로 같다. 이런 경우 멱등성이 있다고 본다.
GET은 원래 자원 상태를 바꾸지 않으므로 멱등성이 있다.
PUT도 같은 내용을 여러 번 덮어써도 최종 상태가 같다면 멱등성이 있다고 볼 수 있다.
Content-Type
HTTP 메시지에서 매우 중요한 헤더 중 하나가 Content-Type이다.
이 헤더는 요청과 응답 양쪽 모두에서 등장할 수 있으며, 바디에 들어 있는 데이터가 어떤 형식인지를 나타낸다.
예를 들어 클라이언트가 서버에 JSON 데이터를 보낸다면
요청 헤더의 Content-Type을 application/json으로 설정할 수 있다.
그러면 서버는 “아, 이 요청 바디는 JSON 형식이구나”라고 이해하고 그에 맞게 파싱할 수 있다.
반대로 서버가 HTML 문서를 응답으로 보낼 때는 text/html 같은 값을 사용해
브라우저에게 “이 응답은 HTML로 해석해야 한다”는 정보를 전달한다.
예시로 자주 보는 값에는 text/html, application/json, text/plain, multipart/form-data 등이 있다.
HTTP 응답
HTTP 응답 메시지도 요청과 비슷하게 구조를 가진다.
응답 역시 크게 보면 첫 번째 줄, 그 아래의 응답 헤더, 그리고 응답 바디로 나눌 수 있다.
응답의 첫 번째 줄에는 보통 HTTP 버전과 상태 코드가 들어간다.
예를 들어 HTTP/1.1 200 OK 같은 형태다.
이 한 줄만 봐도 서버가 어떤 버전으로 응답했고, 요청이 성공했는지 실패했는지를 대략 알 수 있다.
그 아래에는 응답 헤더가 들어간다. 여기에는 응답 바디의 형식이 무엇인지,
캐시와 관련된 정보는 무엇인지, 쿠키를 내려주는지 같은 추가 정보가 포함될 수 있다.
그리고 마지막으로 응답 바디에는 실제로 클라이언트가 받아야 할 데이터가 담긴다.
HTML 문서일 수도 있고, JSON 데이터일 수도 있고, 이미지나 텍스트일 수도 있다.
응답 상태 코드
HTTP 응답에서 가장 먼저 눈에 들어오는 것 중 하나가 상태 코드(status code) 다.
상태 코드는 서버가 요청을 처리한 결과를 숫자로 표현한 것이다.
그리고 이 숫자는 대역별로 큰 의미가 나뉜다.
상태 코드 대역의미설명
| 상태 코드 대역 | 의미 | 설명 |
| 1xx | 정보성 상태 코드 | 요청을 받았으며, 처리가 계속 진행 중임을 의미한다. |
| 2xx | 성공 상태 코드 | 요청이 성공적으로 수신·이해·처리되었음을 의미한다. |
| 3xx | 리다이렉트 상태 코드 |
요청한 자원을 바로 반환하지 않고, 다른 위치로 이동하도록 안내한다. 경우에 따라 추가 HTTP 요청이 발생할 수 있다. |
| 4xx | 클라이언트 오류 상태 코드 |
요청에 잘못된 문법이 있거나, 인증/권한 문제 등으로 요청을 수행할 수 없음을 의미한다. |
| 5xx | 서버 오류 상태 코드 | 서버가 요청을 처리하는 과정에서 문제가 발생했음을 의미한다. |
이 상태 코드 대역만 익숙해져도 개발자도구나 서버 로그를 볼 때 문제를 훨씬 빨리 파악할 수 있다.
즉, 상태 코드는 단순 숫자가 아니라 요청 결과를 압축해서 알려주는 공통 신호라고 이해하면 된다.
자주 보는 HTTP 응답 상태 코드 정리
| 상태 코드 | 이름 | 의미 |
| 200 | OK | 요청이 정상적으로 처리되었음을 의미한다. |
| 201 | Created | 요청이 성공했고, 새로운 자원이 생성되었음을 의미한다. |
| 301 | Moved Permanently | 요청한 자원이 영구적으로 다른 URL로 이동했음을 의미한다. |
| 304 | Not Modified | 요청한 자원이 수정되지 않았으므로, 기존 캐시를 사용해도 됨을 의미한다. |
| 307 | Temporary Redirect | 요청한 자원이 임시로 다른 URL에 있음을 의미한다. |
| 308 | Permanent Redirect | 요청한 자원이 영구적으로 다른 URL로 이동했음을 의미한다. |
| 400 | Bad Request | 잘못된 요청 문법이나 잘못된 데이터로 인해 요청을 처리할 수 없음을 의미한다. |
| 401 | Unauthorized | 인증이 필요하거나 인증에 실패했음을 의미한다. |
| 403 | Forbidden | 서버가 요청을 이해했지만, 권한이 없어 접근을 허용하지 않음을 의미한다. |
| 404 | Not Found | 요청한 자원을 찾을 수 없음을 의미한다. |
| 405 | Method Not Allowed | 해당 자원에서 사용한 HTTP 메서드를 허용하지 않음을 의미한다. |
| 406 | Not Acceptable | 클라이언트가 요구한 형식으로 응답을 제공할 수 없음을 의미한다. |
| 413 | Content Too Large | 요청 본문의 크기가 서버가 허용하는 범위를 초과했음을 의미한다. |
| 429 | Too Many Requests | 너무 많은 요청이 짧은 시간 안에 들어와 서버가 제한하고 있음을 의미한다. |
| 500 | Internal Server Error | 서버 내부 오류로 인해 요청을 처리할 수 없음을 의미한다. |
| 502 | Bad Gateway | 게이트웨이 또는 프록시 서버가 잘못된 응답을 받았음을 의미한다. |
| 503 | Service Unavailable | 서버가 일시적으로 요청을 처리할 수 없는 상태임을 의미한다. |
| 504 | Gateway Timeout | 게이트웨이 또는 프록시 서버가 upstream 서버의 응답을 제때 받지 못했음을 의미한다. |
'공부 기록 > 이것이 백엔드 개발이다 With Java' 카테고리의 다른 글
| EP14. List를 이용한 상품 관리 애플리케이션 만들기 2편 (0) | 2026.04.08 |
|---|---|
| EP13. List를 이용한 상품 관리 애플리케이션 만들기 1편 (0) | 2026.04.07 |
| EP11. HTTP 트랜잭션 개요 (0) | 2026.04.04 |
| EP10. AJAX를 사용해서 서버와 비동기로 상호 작용하기 (0) | 2026.04.02 |
| EP9. JSON (0) | 2026.04.01 |