테마
HTTP의 기초
HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜)는 웹에서 클라이언트가 요청을 보내고 서버가 응답을 돌려주는 응용 계층(application layer)의 규칙이다. HTTP/1.1까지의 메시지는 사람이 읽을 수 있는 텍스트 형식이고(HTTP/2부터는 같은 내용을 이진 프레임으로 보낸다), 요청에는 "무엇을 어떻게 해 달라"는 메서드(method)가 붙는다. 메서드마다 서버 상태를 바꾸는지, 여러 번 보내도 결과가 같은지가 정해져 있어서, 응답을 못 받았을 때 요청을 다시 보내도 되는지가 여기서 갈린다.
요청과 응답 메시지
HTTP는 항상 클라이언트가 먼저 요청하고 서버가 그 요청 하나에 응답하는 방식으로 돈다. 두 메시지의 구조는 같다. 첫 줄 하나, 헤더(header) 여러 줄, 빈 줄 하나, 그리고 본문(body)이다.
http
GET /articles/42 HTTP/1.1
Host: www.example.com
Accept: text/html
User-Agent: Mozilla/5.0http
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234
<!doctype html> ...- 시작 줄: 요청이면 "메서드, 대상 경로, 버전"이고, 응답이면 "버전, 상태 코드(status code), 이유 문구(reason phrase)"다. 이유 문구는
OK처럼 상태 코드의 뜻을 사람이 읽기 쉽게 적은 짧은 말이다. - 헤더:
이름: 값형태의 부가 정보다. 본문의 형식과 길이, 인증 정보처럼 받는 쪽이 메시지를 처리하는 데 필요한 값을 담는다. - 빈 줄: 헤더가 여기서 끝난다는 표시다. 받는 쪽은 빈 줄을 보고 본문이 시작되는 위치를 안다.
- 본문: 실제로 주고받는 데이터다.
GET요청처럼 본문이 없는 메시지도 많다.
메서드와 안전·멱등성
메서드는 대상 리소스(resource)에 무엇을 하려는지 나타낸다. 리소스는 URL이 가리키는 대상, 예를 들어 글 한 편이나 사용자 한 명이다.
| 메서드 | 뜻 | 안전 | 멱등 |
|---|---|---|---|
GET | 리소스를 조회한다 | ○ | ○ |
HEAD | GET과 같지만 본문 없이 헤더만 받는다 | ○ | ○ |
OPTIONS | 대상이 지원하는 통신 옵션을 묻는다 | ○ | ○ |
POST | 데이터를 보내 처리를 맡긴다(주로 생성) | ✗ | ✗ |
PUT | 보낸 내용으로 리소스를 통째로 바꾼다(없으면 만든다) | ✗ | ○ |
PATCH | 리소스의 일부만 고친다 | ✗ | ✗ |
DELETE | 리소스를 지운다 | ✗ | ○ |
안전(safe)한 메서드는 서버 상태를 바꾸지 않는 읽기 전용 요청이다. 검색 엔진의 수집기(crawler)나 브라우저의 미리 가져오기(prefetch)가 안전한 메서드만 골라 보내도 되는 이유가 이것이다. 안전한 GET의 응답은 다시 받아도 결과가 같으므로 브라우저나 중간 서버가 캐시(cache)에 저장해 두고 재사용할 수 있지만, POST 응답은 보통 저장하지 않는다.
멱등성(idempotency)은 같은 요청을 한 번 보내든 여러 번 보내든 서버에 남는 결과가 같은 성질이다. HTTP 규격 문서인 RFC(Request for Comments, 인터넷 표준 문서) 9110번은 PUT, DELETE와 안전한 메서드를 멱등으로 정한다. DELETE를 두 번 보내면 두 번째 응답은 대상을 찾을 수 없다는 404일 수 있지만, "그 리소스가 없다"는 서버 상태는 같다. 멱등성이 중요한 이유는 재시도다. 응답을 못 받았을 때 멱등한 요청은 다시 보내도 안전하지만, POST를 무작정 다시 보내면 주문이 두 번 생길 수 있다. PATCH는 "값을 1 늘려라"처럼 쓸 수 있고, 이런 요청은 보낼 때마다 값이 또 늘어나므로 멱등이 보장되지 않는다(RFC 5789).
이어지는 내용은 HTTP의 기초 2에서 다룬다. 응답의 상태 코드와 자주 쓰는 헤더, 무상태(stateless) 성질과 연결 재사용을 본다.
면접 포인트
- "HTTP 메시지 구조는?" → 시작 줄, 헤더 여러 줄, 빈 줄, 본문. 빈 줄이 헤더의 끝을 알린다.
- "GET과 POST 차이는?" → GET은 조회·안전·멱등, POST는 처리 요청·비멱등. 재시도·캐시 가능 여부가 갈린다.
- "멱등한 메서드는?" → GET·HEAD·OPTIONS·PUT·DELETE. POST·PATCH는 보장 안 됨.
