티스토리 뷰

2.2 웹과 HTTP

2.2.1 HTTP 개요

HTTP: HyperText Transfer Protocol

  • 클라이언트 프로그램과 서버 프로그램 두가지 프로그램으로 구현된다.
  • 서로 다른 종단 시스템에서 수행되는 클라이언트 프로그램과 서버 프로그램은 서로 HTTP 메시지를 교환하여 통신한다.
  • HTTP는 메시지의 구조 및 클라이언트와 서버가 메시지를 어떻게 교환하는지에 대해 정의하고 있다.

 

웹 페이지의 구성

  • 대부분의 웹 페이지는 기본 HTML 파일과 여러 참조 객체로 구성된다.
  • 객체
    • 단순히 단일 URL로 지정할 수 있는 하나의 파일이다.
  • 기본 HTML 파일
    • 페이지 내부의 다른 객체를 그 객체의 URL로 참조한다. 각 URL은 2개의 요소, 즉 객체를 갖고 있는 서버의 호스트 네임과 객체의 경로 이름을 갖고 있다.
http://www.someSchool.edu/someDepartment/picture.gif
호스트 네임: www.someSchool.edu
경로 이름: /someDepartment/picture.gif

 

✅ 웹 브라우저는 HTTP의 클라이언트 측을 구현하기 때문에 웹의 관점에서 브라우저와 클라이언트라는 용어를 혼용하여 사용할 것이다.

 

  • 브라우저는 요구한 웹 페이지를 보여 주고 여러 가지 인터넷 항해와 구성 특성을 제공한다.
  • HTTP의 서버 측을 구현하는 웹 서버(Web server)는 URL로 각각을 지정할 수 있는 웹 객체를 갖고 있다.

 

HTTP는 TCP 전송 프로토콜을 사용한다.

1. HTTP 클라이언트는 먼저 서버에 TCP 연결을 시작한다.

2. 일단 연결이 이루어지면 브라우저와 서버 프로세스는 그들의 소켓 인터페이스를 통해 TCP로 접속한다.

3. 클라이언트는 HTTP 요청 메시지를 소켓 인터페이스로 보내고 소켓 인터페이스로부터 HTTP 응답 메시지를 받는다.

4. 마찬가지로 HTTP 서버는 소켓 인터페이스로부터 요청 메시지를 받고 응답 메시지를 소켓 인터페이스로 보낸다.

 

HTTP의 요청-응답 관계

 


2.2.2 비지속 연결과 지속 연결

1. 비지속 연결(non-persistent connection)

  • 각 요구/응답 쌍이 분리된 TCP 연결을 통해 보내진다.
  • 총 응답 시간은 2RTT
    • TCP 연결 설정에 1 RTT,
    • 객체를 요청하고 받는데 1 RTT와
    • HTML 파일을 서버가 전송하는 데 걸리는 시간을 더한 것이다.

단점

  • 각 요청 객체에 대한 새로운 연결이 설정되고 유지되어야 한다.
    • -> 수많은 다른 클라이언트의 요청을 동시에 서비스하는 웹 서버에게 심각한 부담을 줄 수 있다.
  • 각 객체는 2RTT를 필요로 한다.

 

HTML 파일을 요청하고 수신하는 데 걸리는 시간 계산

✖️ RTT(round-trip time)

  • 작은 패킷이 클라이언트로부터 서버까지 가고, 다시 클라이언트로 되돌아오는 데 걸리는 시간
  • 전체 시간 중 RTT가 차지하는 시간이 많음 -> 효율이 떨어짐.

 

2. 지속 연결(persistent connection)

  • 모든 요구에 해당하는 응답들이 같은 TCP 연결상으로 보내진다.
  • HTTP1.1 지속 연결에서 서버는 응답을 보낸 후에 TCP 연결을 그대로 유지한다.
  • 같은 클라이언트와 서버 간의 이후 요청과 응답은 같은 연결을 통해 보내진다.
  • 객체에 대한 요구는 진행 중인 요구에 대한 응답을 기다리지 않고 연속해서 만들어질 수 있다.
    • -> 파이프라이닝(pipelining)
  • HTTP2는 같은 연결에서 다중 요청과 응답이 가능하고 이 연결 내에서 HTTP 메시지 요청과 응답의 우선순위 기법이 가능하도록 HTTP1.1을 기반으로 제안되었다.

 


2.2.3  HTTP 메시지 포맷

HTTP 명세서는 HTTP 메시지 포맷을 정의한다.

HTTP 메시지에는 두 가지 "요청 메시지"와 "응답 메시지"가 있다.

 

1. HTTP 요청 메시지

이 예에서 브라우저는 /somedir/page.html 객체를 요청하고 있다.

GET/somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

 

요청 라인(request line)

  • GET/somedir/page.html HTTP/1.1
  • 방식(method) 필드
    • GET
    • 방식 필드는 GET, POST, HEAD, PUT 그리고 delete를 포함하는 여러 가지 다른 값을 가질 수 있다.
    • HTTP 메시지의 대부분은 GET 방식을 사용한다. GET 방식은 브라우저가 URL 필드로 식별되는 객체를 요청할 때 사용된다.
  • URL 필드
    • somedir/page.html
  • HTTP 버전 필드
    • HTTP/1.1
    • 브라우저는 HTTP/1.1 버전을 구현하고 있다.

 

헤더 라인(header line)

  • Host: www.someschool.edu
    • 객체가 존재하는 호스트를 명시
    • 웹 프록시 캐시에서 필요로 한다.
  • Connection: close
    • 브라우저는 서버에게 지속 연결 사용을 원하지 않는다는 것을 말하고 있다.
    • 브라우저는 서버가 요청 객체를 보낸 후에 연결을 닫기를 원한다.
  • User-agent: Mozilla/5.0
    • 사용자 에이전트
    • 서버에게 요청을 하는 브라우저 타입을 명시하고 있다.
    • 서버가 같은 객체에 대한 다른 버전을 다른 타입의 사용자 에이전트에게 보낼 수 있으므로 유용하다.
  • Accept-language: fr
    • 사용자가 객체의 프랑스어 버전을 원하고 있음을 나타낸다.

HTTP 요청 메시지의 일반 포맷

 

 

2. HTTP 응답 메시지

HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (Centos)
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(데이터 데이터 데이터 데이터 데이터 ...)

 

상태 라인

  • HTTP/1.1 200 OK
  • 서버가 HTTP/1.1을 사용하고 있고, 모든 것이 양호함(OK)을 나타낸다.
  • 버전 필드. 상태 코드. 해당 상태 메시지로 구성됨.

상태코드

  • 200 OK: 요청이 성공되었고, 정보가 응답으로 보내졌다.
  • 301 Moved Permanently: 요청 객체가 영원히 이동되었다.
    • 니도 나도 잘했지만 더해야 됨
    • 예) 아이디 요구 후 301 -> 패스워드 요구
  • 400 Bad Request: 서버가 요청을 이해할 수 없다는 일반 오류 코드이다.
    • 안됨
  • 404 Not Found: 요청 문서가 서버에 존재하지 않는다.
  • 505_HTTP Version Not Supported: 요청 HTTP 프로토콜 버전을 서버가 지원하지 않는다.
    • 무슨 말인지 모르겠다.

 

헤더 라인

  • Connection: close
    • 클라이언트에게 메시지를 보낸 후 TCP 연결을 닫는데 사용한다.
  • Date: Tue, 18 Aug 2015 15:44:04 GMT
    • HTTP 응답이 서버에 의해 생성되고 보낸 날짜와 시간을 나타낸다.
  • Server: Apache/2.2.3 (Centos)
    • 메시지가 아파치 웹 서버에 의해 만들어졌음을 나타낸다.
    • HTTP 요청 메시지의 User-agent: 헤더라인과 비슷하다.
  • Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
    • 객체가 생성되거나 마지막으로 수정된 시간과 날짜를 나타낸다.
  • Content-Length: 6821
    • 송신되는 객체의 바이트 수를 나타낸다.
  • Content-Type: text/html
    • 개체 몸체 내부의 객체가 HTML 텍스트인 것을 나타낸다. 객체 타입은 파일 확장자로 나타내는 것이 아니라 공식적으로 Content-Type: 헤더로 나타낸다.

개체 몸체(entity body)

  • (데이터 데이터 데이터 데이터 데이터 ...)

HTTP 응답 메시지의 일반 포맷

 

실제로 HTTP 응답 메시지를 보는 방법

  • 원하는 웹 서버에 텔넷으로 접속한다.
  • gaia.cs.umass.edu 호스트의 80번 포트로 TCP 연결을 설정하고 다음에 HTTP 요청 메시지를 보낸다.
telnet gaia.cs.umasse-/edu 80
GET /kurose_ross/interactive/index.php HTTP/1.1
Host: gaia.cs.umass.edu
엔터 두번

 

브라우저와 웹서버의 헤더 라인 결정 방법

브라우저

  • 브라우저 타입과 버전의 함수, 브라우저에 대한 사용자 설정, 그리고 브라우저가 현재 객체를 캐시하고 있는가에 따라 헤더 라인을 생성

웹서버

  • 응답 메시지에 포함되는 헤더 라인들에 영향을 주는 서로 다른 많은 제품, 버전, 그리고 설정들이 있다.

 


2.2.4 사용자와 서버 간의 상호작용: 쿠키

HTTP는 쿠키(cookie)를 사용하여 사이트가 사용자를 추적하도록 해 준다.

쿠키 기술은 아래 네가지 요소를 가진다.

 

  1. HTTP 응답 메시지 쿠키 헤더 라인
  2. HTTP 요청 메시지 쿠키 헤더 라인
  3. 사용자의 브라우저에 사용자 종단 시스템과 관리를 지속시키는 쿠키 파일
  4. 웹 사이트의 백엔드(back-end) 데이터 베이스

 

예시를 통해 살펴보자.수잔이 처음으로 아마존 닷컴을 접속했다고 가정하자. 과거에 이미 이베이 사이트를 방문한 적이 있다.

 

  1. 아마존 웹 서버에 요청이 들어올 때 그 서버는 유일한 식별번호를 만들고 이 식별번호로 인덱스되는 백엔드 데이터베이스 안에 엔트리를 만든다.
  2. 아마존 웹 서버는 브라우저에 응답한다. 이 HTTP 응답에 식별번호를 담고 있는 Set-cookie: 헤더가 포함된다.
    • Set-cookie: 1678
  3. 브라우저가 HTTP 응답 메시지를 받았을 때 그 Set-cookie: 헤더를 볼 수 있다.
  4. 브라우저는 관리하는 특정한 쿠키 파일에 그 라인을 덧붙이게 된다. 이 라인은 서버의 호스트 네임과 Set-cookie: 헤더와 식별번호를 포함한다.
  5. 수잔이 아마존 사이트를 살펴봄에 따라, 수잔이 웹 페이지를 요청할 때 수잔의 브라우저는 쿠키 파일을 참조하고 이 사이트에 대한 수잔의 식별번호를 발췌하고, HTTP 요청에 식별번호를 포함하는 쿠키 헤더 파일을 넣는다.
  6. 아마존 서버로의 각 HTTP 요청은 다음과 같은 헤더 라인을 포함한다.
    • Cookie: 1678

쿠키를 이용한 사용자 상태 유지

 

이러한 방식으로 아마존 서버는 수잔의 아마존 사이트에서의 활동을 추적할 수 있다.

  • 비록 아마존 웹 사이트는 수잔의 이름을 알 필요는 없지만 1678 사용자가 어느 페이지를, 어떤 순서로, 몇 시에 방문했는지 정확히 알 수 있다.

만약 수잔이 자신을 아마존에 등록한다면 아마존은 이 정보를 데이터베이스에 추가하고, 그것에 의해 그녀의 식별번호를 수잔의 이름과 연관시킨다.

  • 이것이 아마존과 다른 전자상거래 사이트가 "원 클릭 쇼핑"을 제공하는 방식이다.

 

쿠키는 사용자 식별에 사용할 수 있음을 알 수 있다.

쿠키는 비상태 HTTP 위에서 사용자 세션 계층을 생성하는 데 이용될 수 있다.

  • 예로 사용자가 웹 기반 전자메일 애플리케이션(핫메일과 같은)으로 로그인했을 때 브라우저는 서버에 쿠키 정보를 보내고 그 애플리케이션에서 사용자 세션 시간 동안 사용자를 식별하도록 한다.

 

하지만 쿠키는 사생활에 대한 침해로 보일 수 있음에 따라 커다란 논쟁거리다.

 


2.2.5 웹 캐싱

웹 캐시는 자체의 저장 디스크를 갖고 있어 최근 호출된 객체의 사본을 저장 및 보존한다.

 

일단 브라우저가 설정되면 객체에 대한 각각의 브라우저 요청은 웹 캐시에 가장 먼저 보내진다.

예를 들어, http://www.someschool.edu/campus.gif라는 는 객체를 요구한다고 생각해 보자.

 

  1. 브라우저는 웹 캐시와 TCP 연결을 설정하고 웹 캐시에 있는 객체에 대한 HTTP 요청을 보낸다.
  2. 웹 캐시는 객체의 사본이 자기에게 저장되어 있는지 확인한다. 만일 저장되어 있다면 웹 캐시는 클라이언트 브라우저로 HTTP 응답 메시지와 함께 객체를 전송한다.
  3. 만약 웹 캐시가 객체를 가지고 있지 않다면, 웹 캐시는 원출처의 서버인 www.someschool.edu로 TCP 연결을 설정한다. 그리고 나서 웹 캐시는 캐시와 서버 간의 TCP 연결로 객체에 대한 HTTP 요청을 보낸다. 이러한 요청을 받은 후에 기점 서버는 웹 캐시로 HTTP 응답 메시지와 함께 객체를 보낸다.
  4. 웹 캐시의 객체를 수신할 때, 객체를 지역 저장장치에 복사하고 클라이언트 브라우저에 HTTP 응답 메시지와 함께 객체의 사본을 (클라이언트 브라우저와 웹 캐시 사이에 이미 결정된 TCP 연결을 통해) 보낸다.

웹 캐시를 통한 클라이언트의 객체 요청

 

✅캐시는 서버이면서 클라이언트라는 점을 유의해야 한다.

 

웹 캐싱은 인터넷상에서 다음과 같은 이유로 즐겨 사용되어 왔다.

  1. 웹 캐시는 클라이언트의 요구에 대한 응답 시간을 줄일 수 있다.
  2. 웹 캐시는 한 기관에서 인터넷으로의 접속하는 링크상의 웹 트래픽을 대폭으로 줄일 수 있다.

😮dynamic webpage의 경우 예전에 가져온 것이 쓸모 없어질 가능성이 크므로 cache의 효과가 크지 않을 수 있다.

따라서 음악 파일과 같은 변하지 않는 것들이 cache를 사용하기에 좋다.

 

✖️콘텐츠 전송 네트워크(CDN, Content Distribution Network)의 사용을 통해, 웹 캐시는 인터넷에서 점진적으로 중요한 역할을 하고 있다. CDN 회사는 인터넷 전역을 통해 지역적으로 분산된 캐시를 설치하고 있으며, 이를 통해 많은 트래픽을 지역화하고 있다. 그 종류로는 공유 CDN과 전용 CDN가 있다.

 


2.2.6 조건부 GET

😮 웹 캐싱이 사용자가 느끼는 응답 시간을 줄일 수 있지만 새로운 문제를 야기한다.

즉, 캐시 내부에 있는 객체의 복사본이 새것이 아닐 수 있다는 것이다.

  • 다행히도, HTTP는 클라이언트가 브라우저로 전달되는 모든 객체들이 최신의 것임을 확인하면서 캐싱을 하도록 해주는 방식을 갖고 있다. 이러한 방식을 조건부 GET(conditonal GET)이라고 한다.

 

HTTP 요청 메시지가 다음 두가지를 포함하면 조건부 GET 메시지라고 한다.

  1. GET 방식을 사용하고, 
  2. If-Modified-Since: 헤더 라인

 

조건부 GET의 동작 과정

1. 첫째, 브라우저의 요청을 대신해 프록시 캐시는 요청 메시지를 웹 서버로 보낸다.

GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com

 

2. 둘째, 웹 서버는 캐시에게 객체를 가진 응답 메시지를 보낸다. 캐시는 요청하는 브라우저에게 객체를 보내주고 자신에게도 객체를 저장한다. 중요한 것은 캐시가 객체와 더불어 마지막으로 수정된 날짜를 함께 저장한다는 것이다.

HTTP/1.1 200 OK
Date: Sat, 8 Oct 2011 15:39:29
Server: Apache/1.3.0 (Unix)
Last-Modified: Wed, 7 Sep 2011 09:23:24
Content-Type: image/gif
(데이터 데이터 데이터 데이터 데이터 ...)

 

3. 셋째, 일주일 후에 다른 브라우저가 같은 객체를 캐시에게 요청하면 객체는 여전히 저장되어 있다. 이 객체는 지난 주에 웹 서버에서 수정되었으므로 브라우저는 조건부 GET으로 갱신 조사를 수행한다. 특히, 브라우저는 다음과 같은 내용을 보낸다.

GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com
If-modified-since: Wed, 7 Sep 2011 09:23:24

 

  • If-modified-since: 헤더 라인의 값이 일주일 전에 서버가 보낸 Last-Modified: 헤더 라인의 값과 정확히 일치하는 것에 유의하라. 이 조건부 GET은 서버에게 그 객체가 명시된 날짜 이후 수정된 경우에만 그 객체를 보낼 것을 말하고 있다.

 

그 객체가 7 Sep 2011 09:23:24 이후 변경되지 않았다고 가정하자.

 

4. 넷째, 그러면 웹 서버는 클라이언트에게 다음과 같은 응답 메시지를 보낸다.

HTTP/1.1 304 Not Modified
Date: Sat, 15 Oct 2011 15:39:29
Server: Apache/1.3.0 (Unix)
(빈 개체 몸체)

 

🔴304 Not Modified 상태 라인은 클라이언트에게 요청 객체의 캐시된 복사본을 사용하라는 것을 의미한다.