3장. [HTTP - 웹의 기초] HTTP 메시지
3장. [HTTP - 웹의 기초] HTTP 메시지
- 메시지가 어떻게 흘러가는가
- HTTP 메시지의 세 부분(시작줄, 헤더, 개체 본문)
- 요청과 응답 메시지의 차이
- 요청 메시지가 지원하는 여러 기능(메서드)들
- 응답 메시지가 반환하는 여러 상태 코드들
- 여러 HTTP 헤더들은 무슨 일을 하는가
❐ 1. 메시지의 흐름
1-1. 메시지는 원 서버 방향을 인바운드로 하여 통신한다
HTTP 메시지의 인바운드 / 아웃바운드 개념
- HTTP는 트랜잭션의 방향을 설명하기 위해 인바운드, 아웃바운드 용어를 사용한다
- 메시지가 원 서버를 향해 이동하면 인바운드이다
- 모든 처리가 끝난 뒤 메시지가 사용자 에이전트로 돌아오면 아웃바운드이다
- 중간에 프락시가 여러 개 있더라도 방향의 기준은 항상 원 서버이다
요청과 응답의 방향성
- 요청 메시지는 클라이언트에서 서버로 이동하므로 인바운드
- 응답 메시지는 서버에서 클라이언트로 이동하므로 아웃바운드
- 요청과 응답은 서로 반대 방향으로 흐르지만 하나의 트랜잭션을 이룬다
1-2. 다운스트림으로 흐르는 메시지
HTTP 메시지의 업스트림 / 다운스트림 개념
- HTTP 메시지는 강물처럼 항상 다운스트림 방향으로 흐른다
- 메시지의 송신자는 수신자의 업스트림
- 메시지를 받는 쪽은 항상 다운스트림
❐ 2. 메시지의 각 부분
2-1. HTTP 메시지는 구조화된 데이터 블록이다
HTTP 메시지의 본질
- HTTP 메시지는 단순하지만 구조화된 데이터 블록
- 각 메시지는 요청 또는 응답 중 하나
- 메시지는 시작줄, 헤더 블록, 본문으로 구성된다
- 본문은 선택 사항이며, 없는 경우도 있다
텍스트 기반 프로토콜
- 시작줄과 헤더는 줄 단위로 구분된 ASCII 문자열
- 각 줄은 캐리지 리턴(CR)과 개행(LF)으로 끝난다
- 견고한 구현은 CRLF가 아닌 개행 문자만 와도 처리 가능해야 한다
2-2. 메시지 문법
요청 메시지와 응답 메시지
- 모든 HTTP 메시지는 요청 메시지 또는 응답 메시지
- 요청 메시지는 서버에게 동작을 요구
- 응답 메시지는 요청 처리 결과를 클라이언트에게 반환
- 두 메시지는 구조는 같고 시작줄 문법만 다르다
2-3. 시작줄
요청줄(Request Line)
- 서버에게 무엇을 할지를 설명
- 메서드, 요청 URL, HTTP 버전을 포함
- 모든 필드는 공백으로 구분된다
- HTTP/1.0 이전에는 버전 정보가 없었다
응답줄(Status Line)
- 요청 처리 결과를 설명
- HTTP 버전, 상태 코드, 사유 구절로 구성
- 모든 필드는 공백으로 구분된다
- HTTP/1.0 이전에는 응답줄이 없었다
2-4. 메서드
메서드의 역할
- 클라이언트가 서버에게 수행해 달라고 요청하는 동작
- 한 단어로 표현된다 (GET, POST 등)
- HTTP 명세는 공통 메서드 집합을 정의한다
주요 HTTP 메서드
GET: 서버에서 문서를 가져온다HEAD: 문서에 대한 헤더만 가져온다POST: 서버가 처리해야 할 데이터를 전송PUT: 요청 메시지 본문을 저장DELETE: 서버에서 문서를 제거TRACE: 프락시 경로 추적OPTIONS: 서버가 지원하는 메서드 확인
메서드 확장성
- 모든 서버가 모든 메서드를 구현할 필요는 없다
- HTTP는 확장을 고려해 설계됨
- 서버별로 추가 메서드를 정의할 수 있다
2-5. 상태 코드
상태 코드의 의미
- 요청 처리 결과를 나타내는 세 자리 숫자
- 응답 메시지의 시작줄에 위치
- 첫 번째 숫자는 상태 코드의 분류를 나타낸다
상태 코드 분류
100–199: 정보200–299: 성공300–399: 리다이렉션400–499: 클라이언트 에러500–599: 서버 에러
상태 코드 처리 원칙
- 알 수 없는 상태 코드는 같은 범주의 일반 코드처럼 처리
- 숫자 코드는 기계 처리에 적합
- 사유 구절은 사람을 위한 설명일 뿐, 의미 판단 기준이 아니다
2-6. 사유 구절 (Reason Phrase)
사유 구절의 역할
- 상태 코드에 대한 사람이 읽기 쉬운 설명
- 상태 코드 이후에 위치
- 상태 코드와 1:1로 대응되지 않을 수 있다
사유 구절의 특징
- 애플리케이션 로직 판단 기준으로 사용하면 안 된다
- 동일한 상태 코드라도 사유 구절은 달라질 수 있다
- HTTP는 사유 구절에 대해 엄격한 규칙을 두지 않는다
2-7. 버전 번호
HTTP 버전의 의미
- 요청과 응답 메시지 양쪽에 포함된다
- 애플리케이션이 지원하는 HTTP 프로토콜 수준을 나타낸다
- 형식:
HTTP/<메이저>.<마이너>
버전 비교 규칙
- 버전은 소수가 아니라 숫자 쌍
- 메이저와 마이너를 각각 비교해야 한다
- 예: HTTP/2.22 > HTTP/2.3
호환성 주의 사항
- 응답의 버전은 서버가 이해할 수 있는 수준을 의미
- 버전 불일치로 인한 혼란이 발생할 수 있다
2-8. 헤더
헤더의 역할
- 요청과 응답에 추가 정보를 제공
- 이름과 값의 쌍으로 구성
- 시작줄 다음에 0개 이상 존재 가능
헤더의 기본 문법
이름: 값- 헤더 블록은 빈 줄(CRLF)로 끝난다
- 일부 HTTP 버전은 특정 헤더의 존재를 요구한다
2-9. 헤더 분류
헤더 분류
- 일반 헤더
- 요청과 응답 모두에 사용 가능
- 요청 헤더
- 요청에 대한 부가 정보 제공
- 응답 헤더
- 응답에 대한 부가 정보 제공
- 엔터티 헤더
- 본문 크기, 타입, 리소스 자체를 설명
- 확장 헤더
- 명세에 정의되지 않은 사용자 정의 헤더
2-10. 헤더 줄 나누기
긴 헤더 처리
- 긴 헤더는 여러 줄로 나눌 수 있다
- 다음 줄은 반드시 공백 또는 탭으로 시작해야 한다
- 가독성을 높이기 위한 문법이다
2-11. 엔터티 본문
엔터티 본문의 개념
- HTTP 메시지의 화물(payload)
- 선택적인 데이터 블록
- 이미지, HTML, 비디오, 소프트웨어 등 다양한 데이터 가능
본문 존재 여부
- 모든 메시지가 엔터티 본문을 가지는 것은 아니다
- 본문이 없으면 헤더 뒤에 바로 CRLF로 종료된다
2-12. HTTP/0.9 메시지
HTTP/0.9의 특징
- HTTP의 초기 버전
- 요청은 메서드와 URL만 포함
- 응답은 엔터티 본문만 존재
HTTP/0.9의 한계
- 상태 코드, 헤더, 버전 정보 없음
- 다양한 상황을 표현할 수 없음
- 오늘날의 HTTP 기능 대부분을 지원하지 못함
HTTP/0.9의 존재 이유
- 여전히 일부 오래된 애플리케이션이 사용
- HTTP 발전 과정을 이해하기 위한 참고 대상
❐ 3. 메서드
3-1. HTTP 메서드 개요
메서드의 역할
- 클라이언트가 서버에게 무엇을 할지 요청하는 수단
- 모든 서버가 모든 메서드를 구현할 필요는 없다
- HTTP/1.1 호환 서버는 최소한 GET, HEAD를 구현해야 한다
- 메서드 사용은 서버 설정과 정책에 따라 제한될 수 있다
3-2. 안전한 메서드 (Safe Method)
안전한 메서드의 의미
- 서버의 상태를 변경하지 않는 메서드
- 대표적으로 GET, HEAD
- 서버에 부작용이 없어야 한다는 의도적 약속
주의할 점
- 안전한 메서드라도 실제 구현에 따라 서버 동작이 발생할 수 있다
- 안전한 메서드는 사용자에게 위험이 없음을 알리기 위한 개념
3-3. GET
GET 메서드의 특징
- 가장 널리 사용되는 메서드
- 서버로부터 리소스를 조회
- HTTP/1.1 서버는 반드시 GET을 지원해야 한다
- 요청 본문은 보통 사용하지 않는다
3-4. HEAD
HEAD 메서드의 특징
- GET과 동일하게 동작하지만 본문은 반환하지 않음
- 오직 헤더만 반환
사용 목적
- 리소스 존재 여부 확인
- 리소스 타입, 크기 확인
- 리소스 변경 여부 확인
구현 규칙
- HEAD 응답 헤더는 GET 응답 헤더와 완전히 동일해야 한다
3-5. PUT
PUT 메서드의 특징
- 서버에 리소스를 생성하거나 교체
- 요청 URL이 리소스의 위치를 직접 지정
- 본문에 저장할 데이터 포함
주의 사항
- 서버의 리소스를 변경하므로 보안 제약이 필요
- 많은 서버는 PUT 사용 전에 인증을 요구한다
3-6. POST
POST 메서드의 특징
- 서버에 데이터를 전송
- 서버는 데이터를 가공하거나 다른 시스템으로 전달할 수 있다.
PUT과의 차이
- PUT: 리소스를 URL에 직접 저장
- POST: 서버가 데이터 처리 방식을 결정
3-7. TRACE
TRACE 메서드의 목적
- 요청이 서버까지 어떻게 전달되는지 경로 추적
- 서버는 받은 요청을 그대로 응답 본문에 반환
특징
- 주로 진단 및 디버깅용
- 요청 본문을 가질 수 없다
- 보안상 비활성화되는 경우가 많다
3-8. OPTIONS
OPTIONS 메서드의 목적
- 서버 또는 특정 리소스가 지원하는 메서드 목록 확인
- 실제 리소스를 접근하지 않고 기능만 조회
응답 특징
Allow헤더에 지원 메서드 목록 포함
3-9. DELETE
DELETE 메서드의 특징
- 지정한 URL의 리소스 삭제 요청
- 삭제가 반드시 수행된다는 보장은 없다.
특징
- 서버는 요청을 무시할 수도 있다.
- 응답 메시지는 성공 여부만 전달할 수 있다.
3-10. 확장 메서드
확장 메서드의 개념
- HTTP 명세에 정의되지 않은 메서드
- 서버가 자체적으로 정의하여 사용
특징
- 프락시는 모르는 메서드를 관대하게 전달해야 한다
- 프락시는 중간자일 뿐, 프로토콜 확장을 막는 게이트키퍼가 되면 안 됨
- 그래서 모르는 메서드는 ‘최대한 있는 그대로’ 전달
- 단, 전달 불가/정책 차단 같은 예외 상황에서는 실패 응답 가능
- 처리할 수 없으면
501 Not Implemented반환 - WebDAV 메서드(LOCK, COPY, MOVE 등)가 대표적 예
이 기사는 저작권자의
CC BY 4.0
라이센스를 따릅니다.
