HTTP
| 국제 표준 | RFC 1945 HTTP/1.0 (1996) RFC 2616 HTTP/1.1 (1999) |
|---|---|
| 개발사 | 처음에는 CERN; IETF, W3C |
| 도입일 | 1991년 |
| 웹사이트 | https://httpwg.org/specs/ |
| HTTP |
|---|
| 요청 방식 |
| 헤더 필드 |
| 상태 코드 |
| 인터넷 프로토콜 스위트 |
|---|
| 응용 계층 |
| 전송 계층 |
| 인터넷 계층 |
| 링크 계층 |
HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 통신 프로토콜이다. 주로 'HTML 문서를 전송'하는 용도에 쓰인다. TCP를 사용하고 HTTP/3부터는 UDP 및 80번 포트를 사용한다. 1996년 버전 1.0, 그리고 1999년 1.1이 각각 발표되었다.
HTTP는 클라이언트와 서버 사이에 이루어지는 상호 대화를 위한 요청-응답 프로토콜이다. 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다.
HTTP를 통해 전달되는 자료는 http:로 시작하는 URL(인터넷 주소)로 조회할 수 있다.
역사
[편집]
하이퍼텍스트라는 용어는 1965년 제너두 프로젝트에서 테드 넬슨이 만들었으며, 제너두 프로젝트는 《As We May Think》(1945년)라는 수필에서 마이크로필름 기반 정보 수신 및 관리 "메멕스" 시스템을 기술한 버니바 부시의 비전(1930년대)에 의해 영감을 받았다. 팀 버너스 리와 그의 팀은 CERN에서 HTML뿐 아니라 웹 브라우저 및 텍스트 기반 웹 브라우저 관련 기술과 더불어 오리지널 HTTP을 발명하였다. 버너스 리는 최초로 "월드와이드웹" 프로젝트를 1989년에 제안하였으며, 이것이 현재의 월드 와이드 웹이다. 이 프로토콜의 최초 버전은 서버로부터 페이지를 요청하는 GET이라는 이름의 하나의 메소드만 있었다.[1] 서버로부터의 응답은 무조건 HTML 문서였다.[2]
문서화된 최초의 HTTP 버전은 HTTP V0.9(1991년)이다. 데이브 레겟은 1995년 HTTP 워킹 그룹(HTTP WG)을 이끌었으며 확장된 조작, 확장된 협상, 더 보강된 메타 정보, 또 추가 메소드와 헤더 필드를 통한 더 효율적인 보안 프로토콜을 갖춘 프로토콜을 확장하기를 바랐다.[3][4] RFC 1945는 공식적으로 1996년 HTTP v1.0을 도입하였다.
HTTP WG는 1995년 12월 새로운 표준을 출간하기로 계획하였으며[5] 당시 개발 중인 RFC 2068(이른바 HTTP-NG)에 기반한 이전 표준 HTTP/1.1에 대한 지원이 1996년 초에 주요 브라우저 개발자들에 의해 빠르게 채택되었다. 1996년 3월, 이전 표준 HTTP/1.1을 지원한 웹 브라우저로 아레나,[6] 넷스케이프 2.0,[6] 넷스케이프 내비게이터 골드 2.01,[6] 모자이크 2.7, 링크스 2.5, 인터넷 익스플로러 2.0이 있다. 새로운 브라우저의 최종 사용자 채택 속도를 빨랐다. 1996년 3월, 한 웹 호스팅 회사의 보고에 따르면 인터넷 상에서 사용 중인 브라우저 중 40% 이상이 HTTP 1.1과 호환되었다. 같은 웹 호스팅 회사는 1996년 6월 기준으로 서버에 접근하는 모든 브라우저들 가운데 65%가 HTTP/1.1 호환이라고 보고하였다.[7] RFC 2068에 정의된 HTTP/1.1 표준은 공식적으로 1997년 1월에 출시되었다. HTTP/1.1 표준에 대한 개선과 업데이트는 1999년 6월 RFC 2616으로 출시되었다.
2007년에 부분적으로 HTTP/1.1 사양을 개정하고 분명히 하기 위해 HTTPbis 워킹 그룹이 창설되었다. 2014년 6월, WG는 RFC 2616를 obsolete 처리하는, 업데이트된 6 파트 사양을 출시하였다:
메시지 포맷
[편집]클라이언트와 서버 사이의 소통은 평문(ASCII) 메시지로 이루어진다. 클라이언트는 서버로 요청메시지를 전달하며 서버는 응답메시지를 보낸다.
요청 메시지
[편집]클라이언트가 서버에게 보내는 요청 메시지는 다음과 같다.
- 요청 내용
- 보기) GET /images/logo.gif HTTP/1.1
- 헤더
- 보기) Accept-Language: en
- 빈 줄 (empty line)
- 기타 메시지를 포함하여 표시된다.
요청 내용과 헤더 필드는 <CR><LF>로 끝나야 한다. 즉, 캐리지 리턴(carriage return) 다음에 라인 피드(line feed)가 와야 한다. 빈 줄(empty line)은 <CR><LF>로 구성되며 그 외 다른 화이트스페이스(whitespace)가 있어서는 안된다.
요약표
[편집]| HTTP 메소드 | RFC | 요청에 Body가 있음 | 응답에 Body가 있음 | 안전 | 멱등(Idempotent) | 캐시 가능 |
|---|---|---|---|---|---|---|
| GET | RFC 9110 | 선택 사항 | 예 | 예 | 예 | 예 |
| HEAD | RFC 9110 | 선택 사항 | 아니요 | 예 | 예 | 예 |
| POST | RFC 9110 | 예 | 예 | 아니요 | 아니요 | 예 |
| PUT | RFC 9110 | 예 | 예 | 아니요 | 예 | 아니요 |
| DELETE | RFC 9110 | 선택 사항 | 예 | 아니요 | 예 | 아니요 |
| CONNECT | RFC 9110 | 선택 사항 | 예 | 아니요 | 아니요 | 아니요 |
| OPTIONS | RFC 9110 | 선택 사항 | 예 | 예 | 예 | 아니요 |
| TRACE | RFC 9110 | 아니요 | 예 | 예 | 예 | 아니요 |
| PATCH | RFC 5789 | 예 | 예 | 아니요 | 아니요 | 아니요 |
응답 메시지
[편집]응답 메시지는 다음으로 구성된다.
- 상태표시 행(status line): 상태코드(status code)와 reason message를 포함한다. (예. HTTP/1.1 200 OK. 클라이언트의 요청이 성공적으로 전달되었음을 표시)
- 응답 헤더필드 (예.Content-Type: text/html)
- 빈 줄 (empty line)
- 기타 메시지
예제 세션
[편집]아래는 포트 80의 www.example.com에서 실행 중인 HTTP 클라이언트와 HTTP 서버 간의 샘플 변환이다. 모든 데이터는 줄 끝마다 2바이트 CR LF ('\r\n')를 사용하여 플레인 텍스트(ASCII) 인코딩을 통해 송신된다.
클라이언트 요청
[편집]GET /restapi/v1.0 HTTP/1.1
Accept: application/json
Authorization: Bearer UExBMDFUMDRQV1MwMnzpdvtYYNWMSJ7CL8h0zM6q6a9ntw