책 “HTTP 완벽 가이드”를 읽고 정리한 글입니다.
HTTP
오늘날 수많은 데이터가 인터넷 상에서 이동한다. 이 과정에서 HTTP(Hypertext Transfer Protocol)는 웹서버에서 사용자의 브라우저로 데이터를 옮겨준다. HTTP는 신뢰성 있는 데이터 전송(reliable data-transmission) 프로토콜을 사용하는데, 이로 인해 데이터가 전송 중 손상되지 않도록 해준다.
웹 클라이언트와 서버
웹 서버(HTTP 서버)는 웹 콘텐츠를 보관하고 있다가 웹 클라이언트로부터 요청을 받으면 데이터를 제공한다.
웹 클라이언트(HTTP 클라이언트)로는 대표적으로 웹 브라우저가 있다.
아래는 클라이언트가 서버에게 HTTP 요청을 보내고 서버가 이에 대한 응답으로 데이터를 돌려주는 모습이다.
리소스(Resource)
웹 리소스는 웹 콘텐츠의 원천으로 웹 서버가 관리한다. 대표적으로 웹 서버 파일 시스템의 정적 파일이 있다.
- 정적 파일 : 텍스트, HTML, 이미지 파일 등의 모든 파일 종류를 일컫는 개념
리소스는 정적일 수도 있고 동적일 수도 있다.
미디어 타입
HTTP는 객체 각각에 MIME 타입이라는 데이터 포맷 라벨을 붙인다. MIME(Multipurpose Internet Mail Extensions)는 데이터가 서로 다른 시스템을 오갈 때 발생할 문제를 방지하기 위해 만들어졌다.
서버는 HTTP 응답 헤더에 해당 타입을 붙이고 브라우저는 타입을 통해 다룰 수 있는 객체인지를 판단한다. MIME 타입은 /
을 통해 주 타입(primary-type)과 부 타입(specific-type)으로 구분된다.
대표적인 타입의 종류는 다음과 같다.
text/html
: HTML로 작성된 텍스트 문서image/jpeg
: JPEG 이미지video/quicktime
: 애플 퀵타임 동영상
아래는 www.naver.com을 요청했을 때의 HTTP 응답(response)이다. 응답 헤더의 content-type에서 MIME 타입(text/html)을 확인할 수 있다.
URI
URI (Uniform Resource Identifier, 통합 자원 식별자)는 리소스의 이름을 나타낸다. 이를 통해 정보 리소스를 식별할 수 있다.
URI에는 URL과 URN이 있다.
URL
URL (Uniform Resource Locator, 통합 자원 지시자)은 특정 리소스의 구체적인 위치를 나타낸다. 따라서 URL을 통해 리소스에 정확하게 접근할 수 있다. URI의 가장 흔한 형태로, 대부분의 경우 URI는 URL을 가리킨다.
URL | 설명 |
---|---|
http://www.oreilly.com/index.html | 오라일리 사이트 홈페이지의 URL |
http://www.yahoo.com/images/logo.gif | 야후 웹 사이트 로고의 URL |
http://www.joes-hardware.com/inventory-check.cgi?item=12731 | 12731번 물품의 재고가 있는지 확인하는 프로그램의 URL |
ftp://joe:tools4u@ftp.joes-hardware.com/lockingpliers.gif | 비밀번호로 보호되는 FTP를 통해 lockingpliers.gif 파일에 접근하는 URL |
URL은 일반적으로 스킴, 호스트, 경로로 이루어져있다.
- 예시.
http://www.yahoo.com/images/logo.gif
- 스킴(scheme)
- 리소스에 접근하기 위해 사용되는 프로토콜
http://
- 호스트(host)
- 서버의 인터넷 주소
www.yahoo.com
- 경로(path)
- 웹 서버의 리소스를 가리킨다.
/images/logo.gif
- 스킴(scheme)
URL은 리소스의 위치가 변경되면 기존 URL은 사용할 수 없어지는 단점이 있다.
URN
URN (Uniform Resouce Name, 통합 자원 이름)은 URL의 단점을 보완한 형태로, 리소스의 위치에 영향을 받지 않는다.
urn:ietf:rfc:2141
위 주소는 인터넷 표준 문서인 RFC 2141의 위치가 이동하더라도 찾을 수 있는 URN이다.
URN은 아직도 여전히 실험 중인 방식이다.
트랜잭션 (Transaction)
HTTP 트랜잭션은 요청 명령과 응답 명령으로 이루어져있다. 이러한 상호작용은 HTTP 메시지에 담겨서 행해진다. 아래 이미지는 트랜잭션이 이루어지는 모습을 나타낸다.
메서드(Method)
HTTP 메서드는 요청의 유형을 나타낸다. 이를 통해 서버는 어떤 동작을 취해야하는지를 알 수 있다. HTTP 요청 메시지는 하나의 메서드를 갖는다.
- 대표적인 메서드
GET
: 지정한 리소스를 클라이언트에게 보내라PUT
: 클라이언트가 보낸 데이터를 지정한 이름의 리소스로 저장해라DELETE
: 지정한 리소스를 서버에서 삭제해라POST
: 클라이언트 데이터를 서버 게이트웨이 애플리케이션으로 보내라HEAD
: 지정한 리소스에 대한 응답에서, HTTP 헤더 부분만 보내라
상태 코드(Status code)
HTTP 응답 메시지에 담겨 클라이언트로 반환되며 요청의 결과를 알려준다.
- 대표적인 상태 코드
200
: OK. 문서가 올바르게 반환되었다.302
: Redirect. 리소스를 얻기 위해 다른 곳으로 가라.404
: Not Found. 리소스를 찾을 수 없다.
웹페이지 = 객체 1개?
웹페이지는 이미지, 문서, 광고 등 다양한 구성요소로 이루어져있다. 따라서 하나의 웹페이지를 가져오려면 우선 뼈대가 될 HTML을 한 번의 트랜잭션으로 가져온 뒤, 이미지, 그래픽 조각, 자바 애플릿 등을 여러 번의 트랜잭션으로 나누어 가져와야 한다.
메시지
HTTP 메시지는 줄 단위의 문자열로 이루어져있다. 클라이언트가 서버에게 보낸 것을 요청 메시지, 서버가 클라이언트로 보낸 메시지를 응답 메시지라고 한다.
아래는 telnet을 통해 전송한 HTTP 요청 메시지와 돌아온 응답 메시지이다.
- 구성
TCP 커넥션
TCP/IP
HTTP는 애플리케이션 계층 프로토콜로, 네트워크 통신의 세부사항에는 관여하지 않는다. 이 부분은 TCP/IP가 담당하게 된다.
- 주요 기능
- 오류 없는 데이터 전송
- 순서에 맞는 전달
- 조각나지 않는 데이터 스트림
TCP/IP는 TCP(Transmission Control Protocol)와 IP(Internet Protocol)가 층을 이루는 패킷 교환 네트워크 프로토콜의 집합이다. 다음은 HTTP의 네트워크 프로토콜 스택이다.
접속, IP 주소, 포트 번호
클라이언트와 서버 사이에 TCP/IP 커넥션을 맺어야 HTTP 클라이언트가 서버에 메시지를 전송할 수 있다. 여기에 사용되는 것이 IP 주소와 포트 번호이다.
IP 주소와 포트 번호는 URL을 통해 알아낼 수 있다.
- http://223.130.200.104:80 의 경우 앞의
223.130.200.104
이 IP 주소, 뒤의80
이 포트 번호이다. - http://www.naver.com 과 같이 IP 주소, 포트 번호가 모두 없는 경우 IP 주소는 DNS를 통해 얻고 포트 번호는 기본 포트인 80번을 사용한다.
nslookup naver.com
을 입력하면 naver.com의 IP 주소를 알 수 있다.
접속 과정
- 웹브라우저는 서버의 URL에서 호스트명을 추출한다.
- 브라우저는 서버의 호스트명을 IP로 변환한다.
- 브라우저는 URL에서 포트번호를 추출한다.
- 브라우저는 웹 서버와 TCP 커넥션을 맺는다.
- 브라우저는 서버에 HTTP 요청을 보낸다.
- 서버는 브라우저에 HTTP 응답을 돌려준다.
- 커넥션이 닫히면 브라우저가 문서를 보여준다.
프로토콜 버전
HTTP의 버전은 다음과 같이 계속해서 진화해왔다.
HTTP/0.9
1991년에 나온 HTTP의 초기 버전이다. 이 버전은 구식 클라이언트와만 사용할 수 있으며 GET 메서드만을 지원하는 등 여러 제약이 있었다. 단순 텍스트만을 목적으로 만들어졌다.
HTTP/1.0
1996년에 나왔으며 POST와 HEAD 등의 메서드를 추가적으로 지원했고 MIME 타입도 지원하여 멀티미디어 콘텐츠를 전송할 수 있게 됐다.
HTTP/1.0+
1.0버전에서 몇 가지 기능들이 추가된 업데이트 버전으로, “keep alive” 커넥션, 가상 호스팅, 프록시 연결 등을 지원하여 하나의 서버를 여러 사이트에서 공유할 수 있게 되었다.
HTTP/1.1
1999년에 나온 1.1 버전은 기존의 HTTP가 가졌던 설계에서의 구조적 결함을 없애고 성능을 최적화하였다. 새롭게 추가된 기능으로는 chunked transfer encoding(큰 파일을 작은 덩어리로 나눠 보내는 것), 파이프라이닝(여러 요청을 각각의 응답을 기다리지 않고 보내는 것)이 있다. 현재 사용되는 HTTP 버전이다.
HTTP/2.0
2015년에 나왔으며 구글의 SPDY 프로토콜을 기반으로 설계되었다.
웹의 구성요소
다음은 웹의 대표적인 구성요소이다.
프록시(proxies)
- 클라이언트의 모든 HTTP 요청을 받아 서버로 전달한다.
- 클라이언트와 서버 사이에 위치해있다.
- 주로 보안을 강화하기 위해 사용한다.
캐시(caches)
- 자신을 거쳐가는 문서 중 자주 찾는 문서의 사본을 저장해둔다. 클라이언트의 요청을 멀리 떨어진 웹 서버까지 도달하지 않고 근처의 캐시에서 바로 처리해준다.
- 웹 캐시와 프록시 캐시가 있다.
- 웹 캐시 : 클라이언트 단에 존재하여 자주 접속하는 웹 페이지의 리소스를 저장한다.
- 프록시 캐시 : 서버 단에 존재하여 클라이언트로부터 요청받은 페이지를 서버까지 거치지 않고 제공한다.
게이트웨이(gateways)
- 다른 서버들의 중개자 역할을 하는 서버이다.
- 주된 용도는 HTTP 트래픽을 다른 프로토콜로 변환하는 것이다.
터널(tunnels)
- 두 네트워크의 종점 사이에 만들어진 가상의 경로로 안전하고 암호화된 통신 채널을 만들기 위해 사용된다.
- 주로 HTTP가 아닌 데이터를 HTTP 연결로 전송해주는데 사용된다.
에이전트(agents)
- 사용자를 대신해 HTTP 요청(request)을 해주는 프로그램
- 대표적으로 웹 브라우저가 있다.