- Published on
HTTP 프로토콜 정리
- Authors
- Name
- JaeHyeok CHOI
- none
HTTP 메시지
HTTP 메시지는 서버와 클라이언트 간에 데이터가 교환되는 방식이다.
메시지
- 요청 (Request) : 클라이언트가 서버로 전달해서 서버가 액션이 일어나게 함.
- 응답 (Response) : 요청에 대한 서버의 답변
메시지는 ASCII로 인코딩된 텍스트 정보이며, 여러 줄로 되어 있다. HTTP 프로토콜 초기 버전과 HTTP/1.1 에서는 클라이언트와 서버 사이의 연결을 통해 공개적으로 전달되었다. 이렇게 한 때 사람이 읽을 수 있었던 메시지는 HTTP/2 에서 최적화와 성능 향상을 위해 HTTP 프레임으로 나누어 진다.
웹 개발자가 손수 HTTP 메시지를 텍스트로 작성하는 경우는 없고 SW, 브라우저, 프록시 혹은 웹 서버가 HTTP 메시지를 생성하며 전송한다. HTTP 메시지는 설정 파일 (프록시 혹은 서버의 경우), API(브라우저의 경우) 혹은 다른 인터페이스를 통해 제공된다.
HTTP/2 의 이진 프레이밍 메커니즘 (binary framing mechanism)은 사용중인 API나 설정 파일 등을 변경하지 않아도 되도록 설계 되었기 때문에, 사용자가 보고 이해하기 쉽다.
HTTP 요청과 응답의 구조는 서로 닮았다.
- 시작 줄(’start-line’) 에는 실행되어야 할 요청 또는 요청 수행에 대한 성공/실패가 기록된다.
- 옵션으로 ‘HTTP 헤더’ 세트가 들어간다. 여기엔 요청에 대한 설명 혹은 메시지 본문에 대한 설명이 들어간다.
- 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄(’blank line’)이 삽입된다.
- 요청과 관련된 내용 (HTML 폼 컨텐츠 등)이 옵션으로 들어가거나 응답과 관련된 문서가 들어간다. 본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시된다.
HTTP 메시지의 시작 줄과 HTTP 헤더를 묶어서 ‘요청 헤드(head)’ 라고 부르며 이와 반대로 HTTP 메시지의 페이로드는 ‘본문(body)’라고 한다.
HTTP 요청
시작 줄
HTTP 요청은 서버가 특정 동작을 취하게 끔 만들기 위해 클라이언트에서 전송하는 메시지이다.
시작 줄의 요소
‘HTTP 메서드’
- GET
- PUT
- POST
- HEAD
- OPTIONS
위 메서드를 사용해 서버가 수행해야 할 동작을 나타낸다.
‘요청 타겟’
- 주로 URL, 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수도 있으며 이들은 요청 컨텍스트에 의해 특정지어 진다. 요청 타겟 포맷은 HTTP 메소드에 따라 달라진다. 포맷에는 다음과 같은 것들이 있다.
- POST / HTTP/1.1
- GET /background.png HTTP/1.0
- HEAD /test.html?query=alibaba HTTP/1.1
- OPTIONS /anypage.html HTTP/1.0
- ‘absolute 형식’으로 알려진 완전한 URL은 프록시에 연결하는 경우 대부분
GET
과 함께 사용됨. authority 형식
으로 알려지고 도메인 이름 및 옵션 포트 (’:’ 가 앞에 붙는다.)로 이루어진 URL의 인증 컴포넌트이다. HTTP 터널을 구축하는 경우에만CONNECT
와 함께 사용할 수 있다.OPTIONS
와 함께 별표'*'
하나로 서버 전체를 나타내는 ‘asterisk 형식’ 이다.OPTIONS * HTTP/1.1
- 주로 URL, 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수도 있으며 이들은 요청 컨텍스트에 의해 특정지어 진다. 요청 타겟 포맷은 HTTP 메소드에 따라 달라진다. 포맷에는 다음과 같은 것들이 있다.
메시지의 남은 구조를 정의하는 HTTP 버전은 응답 메시지에서 써야 할 HTTP 버전을 알려주는 역할을 한다.
헤더
요청에 들어가는 HTTP 헤더는 HTTP 헤더의 기본 구조를 따른다.
대소문자 구분없는 문자열 다음에 콜론이 붙으며, 그 뒤에 오는 값은 헤더에 따라 달라진다. 헤더는 값까지 포함해 한 줄로 구성되지만, 꽤 길어질 수도 있다.
요청 헤더의 종류
General 헤더 - 메시지 전체에 적용됨
HTTP 헤더를 가리키는데 사용되는 구식 용어, 요청 메시지와 응답 메시지 모두에 사용할 수 있지만 콘텐츠 자체에 적용되지는 않는다.
Response 헤더
조건적으로 제한(If-None-Match)하거나 컨텍스트(Referer)를 제공하여 특정하여 요청을 수정한다.
Representation 헤더
메시지 데이터의 원본 형식과 적용된 인코딩을 설명한다. (Content-Type)
본문
본문은 요청의 마지막 부분에 들어간다. 모든 요청에 본문이 들어가지는 않는다. GET
, HEAD
, DELETE
, OPTIONS
처럼 리소스를 가져오는 요청은 보통 본문이 필요 없다. 일부 요청은 업데이트를 하기 위해 서버에 데이터를 전송한다.
종류
Content-Type
과Content-Length
로 정의된 단일 파일로 구성되는 단일-리소스 본문- 각각 서로 다른 정보를 담고 있는 멀티파트 본문으로 구성되는 다중 리소스 본문
HTTP 응답
상태줄
HTTP 응답의 시작 줄은 ‘상태 줄’ 이라고 불린다.
- HTTP/1.1 인 프로토콜 버전
- 요청의 성공 여부를 나타내는 상태 코드
- 사람이 HTTP 메시지를 이해할 때 도움이 되는 상태 코드에 대한 상태 텍스트
헤더
응답에 들어가는 HTTP 헤더는 다른 헤더와 동일한 구조를 따른다. 대소문자를 구분하지 않는 문자열 다음에 콜론이 오며, 그 뒤에 오는 값은 구조가 헤더에 따라 달라진다. 헤더는 값을 포함해 전체를 한 줄로 표시한다.
응답 헤더의 종류
General 헤더
메시지 전체에 적용된다.
Via
Response 헤더
상태 줄에 포함되지 않은 서버에 대한 추가 정보를 제공한다.
Vary
,Accep-Ranges
Representation 헤더
메시지 데이터의 원래 형식과 적용된 인코딩을 설명한다.
Content-Type
본문
응답의 마지막에 들어간다. 모든 응답에 본문이 들어가지는 않는다. 해당 페이로드 없이도 요청에 충분히 응답하는 201 **Created**
204 **No Content
** 과 같은 상태 코드를 가진 응답에는 보통 본문이 없다.
본문의 종류
단일 리소스 본문
Content-Type
와Content-Length
라는 헤더의 정의하는 길이가 알려진 하나의 파일로 구성단일 리소스 본문
Transfer-Encoding
가chunked
로 설정된 청크로 나뉘어 인코딩되는 길이를 모르는 하나의 파일로 구성다중 리소스 본문
서로 다른 정보를 담고 있는 멀티 파트 본문
HTTP/2 프레임
HTTP/1.x 메시지는 몇가지 성능 결함이 있습니다.
- 본문은 압축이 되지만, 헤더는 압축이 되지 않습니다.
- 연속된 메시지들은 비슷한 헤더 구조를 가지지만 메시지마다 반복되어 전송되고 있습니다.
- 다중전송(multiplexing)이 불가능합니다. 서버 하나에 연결을 여러개 열어야 하고, 적극적인(warm) TCP 연결이 소극적인(cold) TCP 연결보다 효율적입니다.
HTTP/2에서는 추가적인 단계가 도입되었습니다. HTTP/1.x 메시지를 프레임으로 나누어 스트림에 끼워 넣는 것입니다. 데이터와 헤더 프레임이 분리 되었기 때문에, 헤더를 압축할 수 있습니다. 스트림 여러개를 하나로 묶을 수 있어서(이러한 과정을 '멀티플렉싱'이라 합니다), 기저에서 수행되는 TCP 연결이 좀 더 효율적으로 이루어집니다.
출처 : MDN
https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
웹 개발자 입장에서의 HTTP 응용
HTTP 요청과 응답
- HTTP 요청: 클라이언트(웹 브라우저 등)가 서버에게 특정 리소스에 대한 작업을 요청할 때 사용합니다. 요청은 메소드, URL, 헤더, 그리고 필요한 경우 바디(body)를 포함합니다.
- HTTP 응답: 서버가 클라이언트의 요청에 대해 응답할 때 사용합니다. 응답은 상태 코드, 헤더, 그리고 응답 바디를 포함할 수 있습니다.
HTTP 헤더
- 목적: HTTP 헤더는 요청과 응답에 대한 추가 정보를 제공합니다.
- 종류:
- 일반 헤더: 요청과 응답 모두에 적용되는 헤더입니다 (예:
Date
,Cache-Control
). - 요청 헤더: 서버에 대한 추가 정보와 클라이언트의 선호도를 나타냅니다 (예:
User-Agent
,Accept
). - 응답 헤더: 응답에 대한 추가 정보를 제공합니다 (예:
Server
,Set-Cookie
). - 엔티티 헤더: 요청이나 응답 바디의 정보를 제공합니다 (예:
Content-Type
,Content-Length
).
- 일반 헤더: 요청과 응답 모두에 적용되는 헤더입니다 (예:
HTTP 메소드
- GET: 리소스를 검색할 때 사용합니다.
- POST: 서버에 데이터를 제출할 때 사용합니다.
- PUT: 지정된 리소스를 업데이트할 때 사용합니다.
- DELETE: 지정된 리소스를 삭제할 때 사용합니다.
- HEAD: GET 메소드와 유사하지만, 리소스의 바디는 반환하지 않고 헤더 정보만 반환합니다.
HTTP 상태 코드
- 1xx (정보): 요청을 받았으며 프로세스가 계속됩니다 (예:
100 Continue
). - 2xx (성공): 요청이 성공적으로 수행되었습니다 (예:
200 OK
,201 Created
). - 3xx (리다이렉션): 추가 조치가 필요합니다 (예:
301 Moved Permanently
,302 Found
). - 4xx (클라이언트 오류): 클라이언트의 잘못된 요청 (예:
404 Not Found
,403 Forbidden
). - 5xx (서버 오류): 서버가 요청을 처리하지 못함 (예:
500 Internal Server Error
,503 Service Unavailable
).
HEAD 메소드
- 용도: HEAD 메소드는 해당 리소스에 대한 헤더 정보만을 요청합니다. 실제 데이터를 다운로드하지 않기 때문에, 리소스의 유무나 변경 여부를 확인하는 데 유용합니다.
- 응답: HEAD 요청에 대한 응답은 바디를 포함하지 않으며, 상태 코드와 헤더 정보만을 포함합니다.