HTTP(하이퍼텍스트 전송 프로토콜)는 HTML 같은 하이퍼미디어 문서를 전송하는 응용 계층 프로토콜이다. 웹 브라우저와 서버의 통신을 위해 설계됐으며, API에 프로그램으로 접근하거나 기계끼리 통신하는 데에도 사용할 수 있다.[1][2]
1. 개요
2. 요청과 응답의 구성
HTTP 메시지는 클라이언트에서 서버로 보내는 요청과 서버에서 클라이언트로 보내는 응답으로 나뉜다. 두 종류의 메시지는 시작 행, 0개 이상의 헤더 필드, 헤더 끝을 표시하는 빈 줄, 선택적인 메시지 본문으로 이루어진다.[3]
요청에는 수행할 동작을 나타내는 메서드, 대상 리소스를 가리키는 URL, 메타데이터를 담는 헤더가 포함될 수 있다. 예를 들어 /api/products를 조회하는 요청에는 GET 메서드와 JSON 형식을 원한다는 Accept 헤더가 들어갈 수 있다.[4]
응답은 상태 코드와 헤더, 선택적인 본문을 담는다. 상태 코드 200과 Content-Type: application/json 헤더가 있는 응답은 성공 결과와 본문 데이터의 형식을 나타내며, 본문에는 실제 리소스 데이터가 들어갈 수 있다.[4][5]
3. 메서드와 상태 코드
HTTP 메서드는 리소스에 대해 수행할 동작을 나타내는 표현이다. GET은 리소스를 가져오고, POST는 데이터를 제출하며, PUT은 리소스를 대체하고, DELETE는 리소스를 제거하는 데 쓰인다.[4]
서버의 응답에는 결과를 나타내는 세 자리 상태 코드가 포함된다. 첫 숫자를 기준으로 1xx는 정보, 2xx는 성공, 3xx는 리디렉션, 4xx는 클라이언트 오류, 5xx는 서버 오류를 뜻한다.[4][5]
응답 메시지는 HTTP 버전과 상태 코드, 선택적인 사유 문구를 담은 상태 행으로 시작할 수 있다. 예를 들어 200 OK에서 200이 결과를 전달하며, OK는 사람을 위한 표기이고 프로토콜상 의미는 없다.[5]
4. 무상태 특성과 상태 유지
5. 헤더와 데이터 표현
헤더는 이름과 값의 쌍으로 메시지와 클라이언트, 서버에 관한 메타데이터를 전달한다. 요청의 Accept 헤더는 클라이언트가 원하는 표현 형식을 나타낼 수 있고, 응답의 Content-Type은 본문 데이터의 형식을 표시할 수 있다.[4][5]
헤더는 캐싱, 인증, 압축, 콘텐츠 협상, 세션 상태, 보안 정책 등에 활용된다. 응답에는 콘텐츠 형식과 길이, 캐시 정책을 나타내는 헤더가 함께 실릴 수 있다.[4][5]
HTTP는 전송 데이터의 표현 형식을 지정하고 협상할 수 있다. 따라서 서로 다른 시스템은 주고받을 데이터 형식을 정하면서, 데이터의 구체적인 내용과 독립적으로 구성될 수 있다.[2]
6. 전송 계층과 연결 과정
웹 페이지를 불러올 때 브라우저는 먼저 호스트 이름을 IP 주소로 확인한다. 그 뒤 전송 연결과 필요한 경우 TLS 연결을 설정하고, HTTP 요청을 보내 서버의 응답을 받는다.[5]
HTTP/1.0과 HTTP/1.1은 TCP 위에서 동작하며, HTTP/2는 TCP 연결에서 여러 스트림을 다중화한다. 연결을 유지하거나 다중화하면 같은 연결을 후속 요청에도 사용할 수 있다.[5]
HTTP/3은 QUIC 위에서 동작한다. 새 연결에서는 QUIC이 전송 연결과 TLS 설정 단계를 결합해 한 번의 왕복으로 처리하므로 연결 설정 지연을 줄인다.[5]
7. 관련 문서
- 클라이언트-서버 모델
- HTTP 메시지
- HTTP 헤더
- HTTP 상태 코드
- HTTP 버전과 연결 수명 주기