http 1.0을 알기 위해서 http가 어떻게 만들어졌는지 이해하면 좋다.
http 0.9는 내용이 너무 간단해서 1.0에서 함께 개념을 정리해본다.
이번에 정리하는 내용은 http 1.0의 syntax.

참고사항

http는 웹 브라우저와 웹 서버가 통신하는 절차와 형식을 규정한 것이다.
현재는 이런 규정을 넘어서 다양한 서비스의 인터페이스로 사용되면서 인터넷의 기초가 됐다.

  • 1990년 HTTP/0.9
  • 1996년 HTTP/1.0
  • 1997년 HTTP/1.1
  • 2005년 HTTP/2

http 0.9

HTML 도큐먼트를 요청해서 가져오기만 하는 단순 프로토콜
웹사이트의 페이지를 서버에 요청하고 그 응답으로 웹사이트의 내용을 받아온다.
수신 후에는 서버와의 연결이 끊어진다.
요청에는 host(혹은 ip)과 port 번호를 지정한다.

  • port는 생략하면 기본 80

http 0.9

  • 검색을 위해 주소 끝에 ?를 사용하는 것도 0.9에서 사용되었다.
  • 1.0 사양이 확정되고 1.0 이전이라는 의미에서 0.9로 불리게 됐다.
  • 0.9는 현행 프로토콜과 하위 호환성이 없다.

http 1.0

0.9는 매우 단순했고 할 수 없는 일들이 많았다.

  • 하나의 문서를 전송하는 기능 밖에 없었다.
  • 통신되는 모든 내용은 html 문서로 가정했으므로 다운로드할 콘텐츠의 형식을 서버가 전달할 수단이 없었다.
  • 클라이언트 쪽에서 검색 이외의 요청을 보낼 수 없었다.
  • 새로운 문장을 전송하거나 갱신 또는 삭제할 수 없었다.
  • 요청이 올바른지, 서버가 올바르게 응답했는지 알 수 없었다.

그렇기 때문에 1.0에선 다른 요소들이 추가 되었다.

  • 요청 시 method가 추가됐다. (GET ..)
  • 요청 시 http version이 추가됐다. (HTTP/1.0)
  • header가 추가됐다. (Host, USer-Agent)

http 1.0

http 1.0의 구성요소

http 1.0은 다른 기술들(전자메일, 뉴스그룹)을 참고해서 스펙이 결정됐다.
http의 네 가지 구성 요소.

  • header
  • method & url
  • body
  • status code

http의 header는 요청과 응답 양쪽에서 사용된다.
이 아이디어는 전자메일에서 가져왔다.1
header의 개념은 RFC에 규정되어 왔다.

예시

메일의 원시 정보를 참고하면 http의 header와 유사하다.

Delivered-To: [email protected]
(생략)
MIME-Version: 1.0
Recieved: by 10.176.69.212 with HTTP; Wed, 6 Apr 2023:06:18 -1200 (KST)
From: Yoichi Fujimoto <[email protected]>
Date: Wed, 6 Apr 2023:06:18 +1000
Message-ID: <ABCDE....>
Subject: hi
To: [email protected]
Content-Type" text/plain; charset=UTF-8

hello

header의 특징들

  • header 이름은 대소문자를 구분하지 않는다.
  • header에는 본문 이외의 모든 정보가 포함돼 있다.
  • RFC는 같은 header를 여러번 보내는 것도 허용한다.
    • 수신측에선 결합문자로 다루거나 배열의 개별 요소로 처리하기도 한다.
  • User-Agent, Authorization 같이 클라이언트가 보내는 header, Content-Type, Content-Length와 같이 서버가 보내는 header가 정의되어 있고, X- 로 시작하는 header는 각 서비스에서 자유롭게 사용해도 좋다고 되어 있다.

결과적으로 http 1.0은 전자메일이 고속으로 왕복하는 것과 유사하다.

method

method는 뉴스그룹으로부터 가져왔다.2
뉴스 그룹의 method들의 사용성과 유사하게 method를 도입했다.

  • LIST, HEAD, BODY, POST

http 규정이 생기기 전까지 많은 method의 제안이 있었지만 사라졌다.

  • LINK, UNLINK (1.0에 들어왔지만 1.1에 삭제)
  • CHECKOUT, CHECKIN, SHOWMETHOD, SEARCH (1992년 판에 제안됐지만 1.0에서 삭제)

status code

method와 같이 뉴스그룹으로부터 가져온 statusCode는 세 자리 숫자를 보고 서버의 응답을 한눈에 알 수 있는 값이다.

예시

지금 우리가 너무 잘 아는 에러 값이다.

  • 1XX, 2XX, 3XX, 4XX, 5XX
200 OK
404 NOT FOUND
500 INTERNAL SERVER ERROR
...

URL

schema://hostName/path 와 같은 구조로 이루어진다.
schema 해석은 브라우저의 책임. 브라우저는 schema를 보고 적절한 접속 방법을 선택해야 한다.
실제 통신하는 곳은 hostName으로 지정된 서버.
port가 생략되면 schema 별 기본 port를 사용한다.

  • http: 80
  • https: 443

URL 구성 문자는 ASCII 문자열(영문자, 숫자, 일부 기호)이었지만 RFC 2718에서 URL을 인코딩함으로써 다국어 문자를 다룰 수 있게 되었다.
HTTP 사양상 URL 길이에 제한은 없지만 인터넷 익스플로러에서 2083자까지만 다룰 수 있어 ‘대체로 2000자’가 기준이 되었다.

body

header 끝에 빈 줄을 넣으면 그 이후는 모두 body가 된다.

예시

아래 코드에서 header 끝에 빈 줄이 들어간 body start! 부터 body가 된다.

header1: header1value
header2: header2value
Content-Length: bytes of body

body start!

속도를 위해 body를 압축하기도 하고 Content-Encoding에서 지정된 압축 알고리즘으로 읽어 온 body의 데이터를 전개할 필요가 있다. 이런 경우에 Content-Length는 압축 후 통신 데이터 크기가 된다.

  • get에서도 body를 보낼 수 있지만 그렇게 하지 않는 것이 좋다.

reference

  • Real World Http chapter 1

  1. 전자메일이라고 불리는 메일 시스템은 인터넷이 보급 되기 이전부터 사용되던 기술로 http에 영향을 줬다. 

  2. 뉴스라는 이름이지만 매스미디어가 아닌 대규모 전자 게시판으로 인터넷 이전의 주요 미디어였다.