HTTP
웹 서버로부터 대량의 정보를 빠르고, 간편하고, 정확하게 웹 브라우저로 옮길 수 있게 해주는 프로토콜
신뢰성 있는 데이터 전송 프로토콜을 사용해 전송 중 손상되거나 꼬이지 않음을 보장하기 때문에
사용자는 정보를 얻는 것에 있어서 걱정할 필요가 없고
개발자는 전송 중 발생할 결함이나 약점에 대한 걱정 없이 개발에만 집중할 수 있다.
웹 클라이언트와 서버
웹 서버는 웹 콘텐츠가 존재하는 곳으로 클라이언트와 HTTP 프로토콜로 의사소통한다.
클라이언트가 서버에게 HTTP 요청을 보내면
서버는 요청된 데이터를 HTTP 응답으로 돌려준다.
https://www.naver.com/index.html
우리가 크롬이나 엣지 같은 브라우저(클라이언트)를 통해 위의 주소로 요청을 보내는 경우
https://www.naver.com
위의 서버에 index.html를 찾아달라는 HTTP 요청을 보낸 것이고
서버는 클라이언트가 요청한 데이터와 타입, 길이 등의 정보를 담아 HTTP 응답을 돌려준다.
리소스
리소스는 웹 서버가 관리하고 제공하는 웹 콘텐츠의 원천이다.
대표적으로 텍스트, HTML, 이미지, 동영상 등의 웹 서버 파일 시스템의 정적 파일이 있고
요청에 따라 콘텐츠를 생산하는 프로그램 같은 동적 콘텐츠 리소스 등이 있다.
또한, 웹 게이트웨이, 검색엔진, 데이터베이스 검색 등 모두 리소스가 될 수 있다.
즉, 종류에 상관 없이 모두 리소스가 될 수 있다.
미디어 타입
MIME(Multipurpose Internet Mail Extensions, 다목적 인터넷 메일 확장)
HTTP는 웹에서 전송되는 수천 가지 데이터 타입을 다루기 위해
전송되는 객체 각각에 MIME 타입이라는 데이터 포맷 라벨을 붙인다.
웹 서버는 모든 HTTP 객체 데이터에 MIME 타입을 붙여 클라이언트에게 객체를 전달하고
클라이언트는 MIME 타입을 보고 다룰 수 있는 객체인지 확인할 수 있다.
Content-type : image/jpeg
text/html
image/gif
MIME 타입은 위와 같이 주 타입/부 타입 형태로 이루어진 라벨이다.
URI (Uniform Resource Identifier, 통합 자원 식별자)
리소스를 고유하게 식별하고 위치를 지정할 수 있는 식별자로
이를 통해 클라이언트는 관심 있는 리소스를 지목할 수 있다.
http://www.shop.com/items/book.jpg
위의 URI를 해석하면
HTTP 프로토콜을 사용해 www.shop.com으로 이동해
items/book.jpg라는 리소스를 가져오라는 것이다.
URI는 URL과 URN 두 가지가 있다.
URL (Uniform resource locator, 통합 자원 지시자)
http://www.shop.com/items/book.jpg
http://www.shop.com/index.html
http://www.shop.com/get?item=1234
가장 흔한 형태의 리소스 식별자로 특정 서버의 한 리소스에 대한 구체적 위치를 서술한다.
대부분 scheme, 서버의 주소, 웹 서버의 리소스 세 부분으로 이루어진 표준 포맷을 따른다.
scheme : 리소스에 접근하기 위해 사용되는 프로토콜로 HTTP, FTP 등이 있다.
URN (Uniform resource Name)
리소스에 대한 위치에 영향받지 않는 고유한 이름으로
리소스의 위치가 옮겨지더라도 URN이 변하지 않는 한 접근할 수 있다.
트랜잭션
HTTP 트랜잭션은 클라이언트가 서버로 보내는 요청 명령과 서버가 클라이언트에 돌려주는 응답 결과로 구성되어 있다.
HTTP 요청 메시지는 다음과 같이 명령과 URI를 포함하고
GET /items/book.jpg HTTP/1.0
Host: www.shop.com
HTTP 응답 메시지는 다음과 같이 트랜잭션의 결과를 포함하며
HTTP/1.0 200 OK
Content-type: image/jpeg
Content-length: 4321
이러한 두 메시지를 하나의 HTTP 트랜잭션이라고 한다.
메서드
서버에게 특정 동작을 취하게 할 수 있게 지원하는 여러 가지 종류의 요청 명령이다.
GET |
지정한 리소스를 보내라 |
PUT |
클라이언트가 보낸 데이터를 지정한 이름의 리소스로 저장하라 (리소스의 대체) |
PATCH |
지정한 리소스의 일부분을 변경하라 |
DELETE |
지정한 리소스를 삭제하라 |
POST |
클라이언트의 데이터를 서버 게이트웨이 애플리케이션으로 보내라 (리소스의 추가) |
HEAD |
지정한 리소스에 대한 응답에서 HTTP 헤더 부분만 보내라 |
상태 코드
서버가 클라이언트에게 요청이 성공했는지 실패했는지 혹은 추가 조치가 필요한지 알려주는 세 자리 숫자
메시지
단순한 일반 텍스트로 이루어진 줄 단위의 문자열로 요청 메시지와 응답 메시지를 말한다.
시작줄 GET /items/book.jpg HTTP/1.0
헤더 Accept: text/*
시작줄 HTTP/1.0 200 OK
헤더 Content-type: image/jpeg
헤더 Content-length: 4321
본문 This is Content!
위와 같이 시작줄, 헤더, 본문으로 이루어져 있다.
시작줄 : 무엇을 해야 하는지 혹은 무슨 일이 일어났는지 나타낸다.
헤더 : 0개 이상 존재할 수 있으며 각 헤더 필드는 쌍점(:)으로 구분되어 하나의 이름과 값으로 구성된다.
본문 : 어떤 종류의 데이터든 들어갈 수 있는 메시지 본문으로 웹 서버로 데이터를 보내거나 클라이언트에 데이터를 반환할 때 사용한다.
TCP 커넥션
TCP/IP
TCP와 IP가 층을 이루는 패킷 교환 네트워크 프로토콜로
HTTP는 애플리케이션 계층의 프로토콜로 네트워크 통신의 세부사항에는 신경을 쓰지 않기 때문에
대중적이고 신뢰성 있는 인터넷 전송 프로토콜인 TCP/IP를 사용한다.
TCP는 다음과 같은 기능을 제공한다.
- 오류 없는 데이터 전송
- 데이터를 언제나 보낸 순서대로 도착하게 보장
- 언제든 어떤 크기로든 보낼 수 있는 조각나지 않는 데이터 스트림
TCP/IP는 각 네트워크와 하드웨어의 특성을 숨기고,
어떤 종류의 컴퓨터와 네트워크라도 서로 신뢰성 있는 의사소통을 하게 해 준다.
HTTP (애플리케이션 계층) |
TCP (전송 계층) |
IP (네트워크 계층) |
네트워크를 위한 링크 인터페이스 (데이터 링크 계층) |
물리적인 네트워크 하드웨어 (물리 계층) |
개념상 위와 같이 HTTP 프로토콜은 TCP 위의 계층이고
HTTP는 자신의 메시지 데이터를 전송하기 위해 TCP를 사용하는 것이다.
접속 / IP 주소 / 포트 번호
HTTP가 서버에 메시지를 전송하기 위해서는 IP 주소와 포트 번호를 사용해
클라이언트와 서버 사이에 TCP/IP 커넥션을 맺어야 한다.
IP 주소가 친구네 집 전화번호라면
친구의 집(IP 주소)에 전화해 친구(포트 번호)를 바꿔 달라는 것과 비슷하다.
즉, 서버의 컴퓨터에 접근해 웹 서버가 사용 중인 포트까지 접근해야 실제 웹 서버와 통신이 가능한 것이다.
- 브라우저는 서버의 URL에서 호스트 명을 추출
- 서버의 호스트 명을 IP로 변환
- URL에 포트번호가 있다면 추출, 없으면 80이 기본값
- 웹 서버와 TCP 커넥션 생성
- 서버에 HTTP 요청
- 서버가 브라우저에 HTTP 응답 반환
- 커넥션이 닫히면 브라우저가 문서를 보여준다.
위와 같은 과정을 통해 우리가 브라우저의 주소창에 URI를 입력하면 페이지가 보이게 된다.
웹의 구성요소
프록시
보안, 애플리케이션 통합, 성능 최적화 등을 위한 중요한 구성요소 중 하나다.
클라이언트와 서버 사이에 위치해
클라이언트의 모든 HTTP 요청을 받아 대부분 요청을 수정해 서버에 전달하는
사용자를 대신해 서버에 접근하는 역할을 수행한다.
모든 웹 트래픽의 흐름 속에서 신뢰할 만한 중개자 역할을 하기 때문에
주로 보안을 위해 사용하거나 요청과 응답 필터링 등에 사용된다.
캐시
자신을 거쳐 가는 문서들 중 자주 찾는 문서의 사본을 저장하는 곳으로
클라이언트의 다음 요청에 같은 문서를 요청하면 캐시가 갖고 있는 사본을 받을 수 있어
멀리 떨어진 웹 서버보다 가까운 캐시에서 빠르게 문서를 받을 수 있다.
게이트웨이
다른 서버들의 중개자로 동작하는 서버로, 주로 HTTP 트래픽을 다른 프로토콜로 변환할 때 사용한다.
항상 자신이 실제 리소스를 갖고 있는 진짜 서버인 것처럼 요청을 다루기 때문에
클라이언트는 자신이 실제 서버와 통신하는 것이 아니라 게이트웨이와 통신하는 것을 알 수 없다.
예를 들면, 클라이언트가 HTTP 요청을 HTTP/FTP 게이트웨이에 보내면
해당 요청을 FTP 프로토콜로 처리해 다시 클라이언트에 HTTP 응답을 반환한다.
터널
두 커넥션 사이에 데이터를 열어보지 않고 그대로 전달해주는 HTTP 애플리케이션으로
주로 HTTP 데이터가 아닌 것을 HTTP 연결을 통해 전달하고자 할 때 사용된다.
에이전트
사용자를 위해 HTTP 요청을 만들어주는 클라이언트 프로그램으로
사람의 통제대로 동작하거나 혹은 통제 없이 동작하는 자동화된 에이전트도 있다.
예를 들어, 스파이더라는 에이전트는 스스로 웹을 돌아다니며
검색엔진의 DB 같은 유용한 웹 콘텐츠 보관소를 만든다.