HTTP는 웹페이지 URL을 입력할 때 사용해서 익숙할 것이다. 그렇다면 HTTP는 무엇일까?
HTTP는 웹 클라이언트인 브라우저가 웹 서버에게 웹 페이지를 어떻게 요청하는지, 서버가 클라이언트로 어떻게 웹 페이지를 전송하는지를 정의한 것이다. 즉, 클라이언트-서버로 구현된 웹의 애플리케이션 계층 프로토콜이다.
웹은 종단 시스템(=호스트)인 클라이언트와 서버가 서로 HTTP 메시지를 교환하며 통신하다.
브라우저는 페이지 내부의 객체에 대한 HTTP 요청 메시지를 서버에게 보내면 서버는 요청을 수신하고 객체를 포함한 HTTP 응답 메시지를 전송한다. 이때 HTTP는 TCP를 전송 프로토콜로 사용한다. 클라이언트와 서버가 요청이 이루어지면, 브라우저와 서버 프로세스는 소켓 인터페이스를 통해 TCP로 접속한다.
HTTP의 서버에서 구현하는 웹 서버(Web Server)인 아파치와 IIS는 URL로 지정할 수 있는 웹 객체를 갖고 있다.
1. HTTP 프로토콜은
1. 온-디맨드 서비스의 특성을 가지고 있다.
▶ 모든 서비스의 정보들이 서버에 존재하는 것이다. 다시 말해, 사용자가 원할 때 원하는 것을 수신할 수 있다.
2. 비상태 프로콜(Stateless)이다.
▶ HTTP 서버는 클라이언트에 대한 정보를 유지, 저장하지 않는다. 그래서, 클라이언트가 몇 초 후에 같은 객체(단일 URL)를 요청해도, 서버는 전에 한 일을 기억하지 않으므로 다시 그 객체를 보낸다.
예) 로그인이 필요 없는 웹 서비스
3. 요청과 응답 애플리케이션 데이터의 헤더 구조이다.
4. 비지속 연결과 지속 연결 모두 사용할 수 있다.
▶ 비지속 연결은 요청과 응답이 분리된 TCP 연결을 통해 보내진다.
- HTTP 클라이언트가 포트 번호를 통해 호스트 서버로 TCP 연결을 시도한다. TCP 연결은 소켓 인터페이스를 통해서 한다. (소켓 인터페이스는 클라이언트와 TCP, 서버와 TCP 연결 사이에서의 출입구 역할을 한다.)
- 설정된 TCP 연결 소켓을 통해 서버로 HTTP 요청 메시지와 경로 이름을 포함해서 보낸다.
- HTTP 서버는 설정된 연결 소켓을 통해 요청 메시지를 받아 저장장치에서 (경로 이름) 객체를 추출하고 응답 메시지에 그 객체를 캡슐화하여 소켓을 통해 클라이언트에게 보낸다.
- HTTP 서버는 TCP 연결을 끊으라고 명령한다.
- HTTP 클라이언트가 응답을 받으면 TCP 연결을 중단한다.
객체가 더 있다면 위와 같은 방식을 반복한다. 예를 들어 설명한 이 방법은 각 TCP 연결은 하나의 요청 메시지와 하나의 응답 메시지만 전송한다.
[단점]
1. 요청이 다르면 각 요청 객체에 대한 새로운 연결이 설정되고 유지되어야 한다.
이는 TCP 버퍼가 할당되어야 하고 TCP 변수들이 클라이언트와 서버 양쪽에 유지되어야 한다. 수많은 클라이언트가 요청을 동시에 서비스하는 웹 서버라면 엄청난 부담을 줄 수 있다.
2. 각 객체는 2 RTT(패킷이 클라이언트에서 서버로 , 서버에서 클라이언트로 돌아오는 시간) 필요하다.
TCP 연결 설정에 1 RTT, 객체를 요청하고 받는 데 1 RTT가 필요하다는 것이다.
▶ 지속 연결은 요청과 응답이 같은 TCP 연결상에서 보내진다.
1. 서버는 응답을 보낸 후에 TCP 연결을 그대로 유지한다.
비지속 연결은 요청마다 TCP를 연결해야 했다면 지속 연결은 같은 클라이언트와 서버 간의 이후 연결과 응답은 같은 연결을 통해 보내진다. 이는 전체 웹 페이지를 하나의 지속 TCP을 통해 보낼 수 있고, 같은 서버에 있는 여러 웹 페이지들을 하나의 지속 TCP 연결을 통해 보낼 수 있다.
→ 파이프라이닝(객체에 대한 요구는 진행 중인 요구에 대한 응답을 기다리지 않고 연속해서 만들 수 있다.)
→ 한 번의 연결로 여러 데이터를 요청/응답하여 처리 효율을 높인다.
2. HTTP 통신 과정과 쿠키
와이어샤크를 보면서 실제 연결 과정을 보면,
먼저, 위에 그림처럼 TCP 연결 핸드 셰이킹하며 연결을 한다는 걸 알 수 있다.
또 HTTP은 GET 방식을 사용하여 주어진 URL에서 객체를 요청한다는 것을 알 수 있고,
HTTP/1.1을 통해 지속 연결과 200 OK을 통해 요청에 성공한 상태라는 걸 알 수 있다.
HTTP 서버는 사용자에 대한 정보를 저장하지 않는 비상태 프로토콜인데, 그렇다면 서버가 사용자 접속을 제한하고 사용자에 따라 콘텐츠를 제공하기를 원한다면 어떻게 해야 할까?
▶ 이럴 경우, 쿠키를 사용하면 된다. 쿠키는 사이트가 사용자를 추적하도록 해준다.
- HTTP 응답 메시지 쿠키 헤더 라인
- HTTP 요청 메시지 쿠키 헤더 라인
- 사용자의 브라우저에 사용자 종단 시스템과 관리를 지속하는 쿠키 파일
- 웹 사이트의 백엔드 데이터베이스
사이트에 처음 방문한 사용자는 사용자 확인(ID)을 제공한 후, 세션 동안에 브라우저는 서버에 쿠키 헤더를 전달하여 서버에게 사용자를 확인한다. → 쿠키는 비상태 HTTP 위에서 사용자 세션 계층을 생성하는데 이용될 수 있다.(로그인 후, 사용자 세션 시간 동안 사용자를 식별 가능하다.)
3. HTTP 주요 특성
위에서 설명한 내용들을 정리하면,
- 데이터 전송 후 세션 유지 시간은 웹 서버 설정에 의해 결정한다.
- 처음 요청하여 받은 응답 객체는 브라우저의 메모리에 캐시 저장하고, 같은 요청은 서버에 요청하지 않고 캐시로부터 가져온다.
'Study > Network' 카테고리의 다른 글
소켓 _ 네트워크 애플리케이션 (0) | 2023.07.05 |
---|---|
P2P(Peer-to-Peer)의 파일 분배, 비트토렌트 (0) | 2023.02.02 |
웹 캐시(Web Cache)란? (0) | 2023.01.16 |