Application Layer (2)

ByeongUk·2024년 10월 6일
0

네트워크

목록 보기
2/2
post-thumbnail

🤔 HTTP 개요

각기 다른 종단 시스템에서 수행되는 클라이언트 프로그램과 서버 프로그램은 서로 HTTP 메시지를 교환해서 통신한다. 웹 페이지는 객체들로 구성되는데, 객체(Object)는 단순히 단일 URL로 지정할 수 있는 하나의 파일, HTML 파일, JPEG 이미지, 자바스크립트 등이 있다.

URL은 2개의 요소, 즉 객체를 갖고 있는 서버의 호스트 이름과 객체의 경로 이름을 갖고 있다. HTTP의 서버 측을 구현하는 웹 서버는 URL로 각각을 지정할 수 있는 웹 객체를 갖고 있다.

 

HTTP는 웹 클라이언트가 웹 서버에게 웹 페이지를 어떻게 요청하는지와 서버가 클라이언트로 어떻게 웹 페이지를 전송하는지를 정의한다.

 

사용자가 웹 페이지를 요청할 때, 브라우저는 페이지 내부의 객체에 대한 HTTP 요청 메시지를 서버에게 보낸다. 서버를 요청을 수신하고 객체를 포함하는 HTTP 응답 메시지로 응답한다.

HTTP는 TCP를 전송 프로토콜로 사용한다. TCP의 주요 특징으로는 Connection-Reliable, 일명 차원의 문을 여는 것이었다. HTTP 클라이언트는 먼저 서버에 TCP 연결을 시작한다(차원의 문을 연다). 그리고 서버가 클라이언트로부터의 TCP 연결 요청을 승인하면서 연결이 완성된다. 브라우저(HTTP 클라이언트)와 웹 서버(HTTP 서버)간에 HTTP 메시지가 교환되고 TCP 연결은 닫힌다.

 

여기서 중요한 점은 서버가 클라이언트에게 요청 파일을 보낼 때, 서버는 클라이언트에 관한 어떠한 상태 정보도 저장하지 않는다(Stateless)는 것이다. 만약 특정 클라이언트가 몇 초 후에 같은 객체를 두 번 요청한다면, 서버는 이전에 한 일을 기억하지 않으므로 그 객체를 다시 보낸다는 것이다. HTTP 서버는 클라이언트에 대한 정보를 유지하지 않으므로, HTTP를 비상태 프로토콜(Stateless Protocol)이라고 한다.

 

✌️ HTTP 연결의 종류

Non-persistent HTTP(비지속 연결) : 클라이언트가 응답 메시지를 받으면 TCP 연결을 끊는 것으로 응답 메시지를 한 번씩 받을 때마다 끊기는 것이다. 또 받고 싶으면 차원의 문(TCP 연결)을 다시 새로 열어야 한다. 여러 개의 객체를 받고 싶으면 여러 번 연결이 필요하다.


비지속 연결 방식의 총 응답 시간은 클라이언트의 TCP 연결 시도한 시간(1 RTT), 연결이 완료된 후에 클라이언트가 다시 HTTP 요청 메시지를 보내고 서버가 HTML 파일을 TCP 연결로 보내는 시간(1 RTT + HTML 전송 시간)이므로 총 RTT * 2 + HTML 전송 시간으로 정의할 수 있다.

 

Persistent HTTP(지속 연결) : 서버는 응답을 보낸 후에 TCP 연결을 그대로 유지한다. 같은 클라이언트와 서버 간의 이후 요청과 응답은 같은 연결을 통해 보내진다. 객체에 대한 요구는 진행 중인 요구에 대한 응답을 기다리지 않고 연속해서 만들어질 수 있다(파이프라이닝). 일반적으로 HTTP 서버는 일정 시간(타임아웃 기간) 사용되지 않으면 연결을 닫는다.

 

📃 HTTP 메시지 포맷

HTTP 메시지에는 Request(요청), Response(응답) 두 가지 유형이 있다. 메시지는 일단 ASCII 텍스트로 쓰여 있어 사람들이 읽을 수 있다. 그리고 메시지는 다섯 줄로 되어 있고 각 줄은 CR과 LR로 구별된다.

 

  • HTTP 요청 메시지

HTTP 요청 메시지의 첫 줄은 요청 라인 이라 부르고, 이후의 줄들은 헤더 라인 이라고 부른다. 요청 라인은 3개의 필드, 즉 방식 필드, URL 필드 HTTP 버전 필드 를 갖는다. 방식 필드는 GET, POST, HEAD, PUT, DELETE를 포함하는 여러 가지 값을 가질 수 있다.

 

  • HTTP 응답 메시지

 

Status Code의 의미

  • 200 OK : 요청이 성공했고, 정보가 응답으로 보내졌다.

  • 301 Moved Permanently : 요청 객체가 영원히 이동되었다. 새로운 URL은 응답 메시지의 Location: 헤더에 나와 있다. 클라이언트 소프트웨어는 자동으로 이 새로운 URL을 추출한다.

  • 400 Bad Request : 서버가 요청을 이해할 수 없다는 일반 오류 코드다.

  • 505 HTTP Version Not Supported : 요청 HTTP 프로토콜 버전을 서버가 지원하지 않는다.

 

🍪 사용자와 서버 간의 상호작용 : 쿠키(Cookie)

HTTP 서버는 상태를 유지하지 않는다고 했는데, 서버가 사용자 접속을 제한하거나 사용자에 따라 콘텐츠를 제공하기 원하므로 웹사이트가 사용자를 확인하는 것이 바람직할 때가 있다. 이 목적으로 HTTP는 쿠키를 사용한다. 쿠키는 사용자를 추적하게 해준다. 아래 예시를 보자.

  1. 과거 클라이언트는 이베이 사이트를 방문한 적이 있다. 아마존 웹 서버에 요청이 들어올 때 그 서버는 유일한 식별번호를 만들고 이 식별번호로 인덱싱되는 백엔드 데이터베이스 안에 엔트리를 만든다.

  2. 그 후, 아마존 웹 서버는 클라이언트의 브라우저에 응답하는데, 이 HTTP 응답에 식별번호를 담고 있는 Set-Cookie: 1678 헤더가 포함된다.

  3. 클라이언트는 응답 메시지를 받았을 때 쿠키 헤더를 볼 수 있고, 관리하는 특정한 쿠키 파일에 그 라인을 덧붙이게 된다. 이 라인은 서버의 호스트 이름과 Set-Cookie: 헤더와 식별번호를 포함한다.

  4. 클라이언트가 계속해서 아마존 사이트를 살펴봄에 따라, 클라이언트가 웹 페이지를 요청할 때 브라우저는 쿠키 파일을 참조하고 해당 사이트에 대한 클라이언트의 식별번호를 발췌하고, HTTP 요청에 식별번호를 포함하는 쿠키 헤더 파일을 넣는다. 특히 아마존 서버로의 각 HTTP 요청은 Cookie : 1678 헤더 라인을 포함한다.

 

이러한 방식으로 아마존 서버는 클라이언트의 아마존 사이트에서의 활동을 추적할 수 있다. 사용자가 어느 페이지를, 어떤 순서로, 몇 시에 방문했는지 정확히 알 수 있다. 만약 클라이언트가 다시 아마존 사이트를 방문하면 브라우저는 Cookie: 1678을 헤더 라인에 넣어 요청 메시지를 보낼 것이고 아마존은 클라이언트가 과거에 아마존에서 방문한 웹 페이지에 기초하여 제품을 추천하는 것이다.

0개의 댓글

관련 채용 정보