http를 안다고하면 다음과 같은 질문에 답할 수 있어야 한다고 생각합니다.
- 얼마나 많은 클라이언트와 서버가 통신하는지
- 리소스가 어디서 오는지
- 웹 트랜잭션이 어떻게 동작하는지
- HTTP 통신을 위해 사용하는 메시지의 형식
- HTTP 기저의 TCP 네트워크 전송
- 여러 종류의 HTTP 프로토콜
- 인터넷 곳곳에 설치된 다양한 HTTP 구성요소
HTTP
HTTP는 전 세계의 웹 서버로부터 이 대량의 정보를 빠르고, 간편하고, 정확하게 사람들의 PC에 설치된 웹브라우저로 옮겨줍니다.
그리고 HTTP는 신뢰성 있는 데이터 전송 프로토콜을 사용하기 때문에, 데이터가 지구 반대편에서 오더라도 전송 중 손상되거나 꼬이지 않음을 보장합니다.
1. 웹 클라이언트와 서버
웹 콘텐츠는 웹 서버에 존재합니다.
웹 서버는 HTTP 프로토콜로 의사소통하기 때문에 HTTP 서버로도 불립니다.
이들 웹 서버는 인터넷의 데이터를 저장하고, HTTP 클라이언트가 요청한 데이터를 제공합니다.
2. 리소스
웹 서버는 웹 리소스를 관리하고 제공합니다.
리소스는 정적 파일일 수도 있고, 요청에 따라 콘텐츠를 생산하는 프로그램이 될 수도 있습니다.
요약하자면, 어떤 종류의 콘텐츠 소스도 리소스가 될 수 있습니다.
2.1 미디어 타입
인터넷은 수천 가지 데이터 타입을 다루기 때문에, HTTP는 웹에서 전송되는 객체 각각에 신중하게 MIME 타입이라는 데이터 포맷 라벨을 붙입니다.
그렇기에 웹 서버는 모든 HTTP 객체 데이터에 MIME 타입을 붙이고 웹 브라우저는 서버로부터 객체를 돌려받을 때, 다룰 수 있는 객체인지 MIME 타입을 통해 확인합니다.
MIME 타입은 /로 구분된 주 타입과 부 타입으로 이루어진 문자열 라벨입니다.
- HTML로 작성된 문서는 text/html
- JPEG 이미지는 image/jpeg
이 외에도 많고, 보내려는 데이터를 어떤 MIME 라벨이 붙어야 되는지는 필요할 때마다 찾아보시면 됩니다.
2.2 URI
URI는 인터넷의 우편물 주소 같은 것으로, 정보 리소스를 고유하게 식별하고 위치를 저장할 수 있습니다.
예를 들어 웹 서버에 있는 이미지 리소스에 대한 URI라면 다음과 같습니다.
http://www.daco.com/intro/hi.gif
※ URI는 URL과 URN을 포함하는 상위 개념입니다.
2.3 URL
URL은 리소스 식별자의 가장 흔한 형태입니다.
URL은 특정 서버의 한 리소스에 대한 구체적인 위치를 서술합니다.
그렇기에 리소스가 정확히 어디에 있고 어떻게 접근할 수 있는지 분형히 알려줍니다.
대부분의 URL은 세 부분으로 이루어진 표준 포맷을 따릅니다.
- 첫 번째 부분은 스킴이라고 불리는데, 리소스에 접근하기 위해 사용되는 프로토콜을 서술합니다.
ex) http:// - 두 번째 부분은 도메인 이름 혹은 호스트 명이라고 불리는데, 서버의 인터넷 주소를 제공합니다.
ex) www.daco.com - 세 번째 부분은 웹 서버의 리소스를 가리킵니다.
ex) /intro/hi.gif
대부분 URI는 URL처럼 사용합니다.
2.4 URN
URN은 콘텐츠를 이루는 한 리소스에 대해, 그 리소스의 위치에 영향 받지 않는 유일무이한 이름 역할을 합니다.
예를 들어, 인터넷 표준 문서 RFC 2648를 나타내는 URN은 다음과 같습니다.
urn:ietf:rfc:2648
이해가 잘 안되신다면 URN은 잘 쓰이지 않기 때문에 이런게 있구나하고 넘어가시면 됩니다.
3. 트랜잭션
HTTP 트랜잭션은 요청 명령과 응답 결과로 구성되어 있습니다.
3.1 메서드
HTTP는 HTTP 메서드라고 불리는 여러 가지 종류의 요청 명령을 지원합니다.
3.2 상태 코드
모든 HTTP 응답 메시지는 상태 코드와 함께 반환됩니다.
4. 메세지
HTTP 메시지는 단순한 줄 단위의 문자열입니다.
HTTP 메시지에는 요청 메시지와 응답 메시지가 있습니다.
위의 그림 처럼 HTTP 메시지는 다음의 세 부분으로 이루어집니다.
- 시작줄
메시지의 첫 줄은 요청이라면 무엇을 해야하는지, 응답이라면 무슨 일이 일어났는지 나타냅니다. - 헤더
시작줄 다음에는 0개 이상의 헤더 필드가 이어집니다.
각 헤더 필드는 쉬운 구문분석을 위해 :으로 구분되어 있는 하나의 키 값으로 구성됩니다.
헤더는 초록색 박스처럼 빈 줄로 끝납니다. - 본문
빈 줄 다음에는 어떤 종류의 데이터든 들어갈 수 있는 메시지 본문이 필요에 따라 올 수 있습니다.
5. TCP 커넥션
TCP는 인터넷 전송 프로토콜 중 하나로 전송 제어 프로토콜입니다.
메시지가 TCP 커넥션을 통해서 한 곳에서 다른 곳으로 옮겨갈 수 있습니다.
5.1 TCP/IP
HTTP는 애플리케이션 계층 프로토콜로써, 네트워크 통신의 핵심적인 세부사항에 대해서 신경 쓰지 않습니다.
대신 대중적이고 신뢰성 있는 인터넷 전송 프로토콜인 TCP/IP에게 맡깁니다.
TCP는 다음과 같은 특징이 있습니다.
- 오류없는 데이터 전송
- 언제나 보낸 순서대로 도착
- 언제든 어떤 크기로든 전송 가능
TCP/IP는 TCP와 IP가 층을 이루는, 패킷 교환 네트워크 프로토콜의 집합입니다.
TCP/IP는 각 네트워크와 하드웨어의 특성을 숨기고, 어떤 종류의 컴퓨터나 네트워크든 서로 신뢰성 있는 의사소통을 하게 해줍니다.
※ TCP는 IP 위의 계층
5.2 IP 주소와 포트번호
HTTP 클라이언트가 서버에 메시지를 전송할 수 있게 되기 전에, 인터넷 프로토콜(IP) 주소와 포트번호를 사용해 클라이언트와 서버 사이에 TCP/IP 커넥션을 맺어야 합니다.
http://145.32.211.22:80/index.html
위와 같은 URL이 있다고 하면 IP 주소는 145.32.211.22, 포트번호는 80입니다.
※ 글자로 된 도메인 이름 또는 호스트 명은 URL에 대한 이해하기 쉬운 형태의 별명이라 보시면 됩니다.
6. 프로토콜 버전
프로토콜 버전은 크게 0.9, 1.0, 1.1, 2.0, 3.0이 있습니다.
HTTP/0.9
간단한 HTML 객체를 받아오기 위해 만들어졌습니다.
HTTP/1.0
버전 번호, HTTP 헤더, 추가 메서드, 멀티미디어 객체 처리 추가
HTTP/1.1
기존 HTTP 설계의 구조적 결함 교정, 두드러진 성능 최적화, 잘못된 기능 제거에 집중
HTTP/2.0
기존 HTTP/1.x 버전의 성능 향상에 초점을 둔 프로토콜
HTTP/3.0
QUIC을 기반으로 나온 새로운 HTTP 메이저 버전
※ QUIC는 구글에서 개발한 UDP 기반의 전송 프로토콜입니다.
7. 웹의 구성요소
웹의 구성요소로 프락시, 캐시, 게이트웨이, 터널, 에이전트가 있습니다.
7.1 프락시
프락시는 클라이언트와 서버 사이에 위치한 HTTP 중개자입니다.
웹 보안, 애플리케이션 통합, 성능 최적화를 위한 중요한 구성요소입니다.
주로 보안을 위해 사용됩니다.
7.2 캐시
웹 캐시와 캐시 프락시는 자신을 거쳐 가는 문서들 중 자주 찾는 것의 사본을 저장해 두는, 특별한 종류의 HTTP 프락시 서버입니다.
멀리 떨어진 웹 서버보다 근처의 캐시에서 훨씬 더 빨리 문서를 받을 수 있습니다.
7.3 게이트웨이
게이트웨이는 다른 서버들의 중개자로 동작하는 특별한 웹 서버입니다.
주로 HTTP 트래픽을 다른 프로토콜로 변환하기 위해 사용됩니다.
7.4 터널
터널은 단순히 HTTP 통신을 전달하기만 하는 특별한 프락시입니다.
7.5 에이전트
에이전트는 사용자를 위해 자동화된 HTTP 요청을 만드는 준지능적 웹클라이언트 프로그램입니다.
자동화된 에이전트는 스파이더 또는 웹로봇라는 이름을 갖고 있습니다.
스파이더는 웹을 돌아다니며 전 세계의 웹페이지를 수집합니다.
마치며...
http에 대한 기본적인 내용만을 다루었기에, 이 글은 가볍게 봐주셨으면 좋겠습니다.
각 내용에 대한 좀 더 자세한 글은 책을 공부하며 추후에 쓸 예정입니다. ^-^