sungyup's.

network_for_everyone / 네트워크 구조 이해하기 / 2.5 응용 계층

2.5응용 계층

애플리케이션에 접속하는 단계

TL;DR

추억의 쪽지 시험

30. 응용 계층의 역할

사람들은 컴퓨터로 수많은 애플리케이션을 사용한다. 문서 작업의 워드프로세서나 엑셀, 인터넷 검색을 하기 위한 웹 브라우저는 모두 애플리케이션이다. 애플리케이션에서 서비스를 요청하는 측을 클라이언트(Client), 서비스를 제공하는 측을 서버(Server)라고 부른다.

응용 계층은 사용자가 사용하는 애플리케이션이 네트워크를 통해 통신할 수 있게 해주는 계층이다. 즉, 웹 브라우저, 메일 클라이언트 등은 이 응용 계층의 프로토콜(HTTP, SMTP 등)을 사용해 서버와 데이터를 주고 받는다.

31. HTTP 프로토콜

사용자가 웹 브라우저에 www.google.com 을 입력해 페이지를 조회하는 경우를 생각해보자.

사용자가 URL을 입력하는 행위는 요청(Request)이라고 하고, 서버는 사용자의 요청에 응답(Response)한다. 우리의 사례에서 요청은 "www.google.com 페이지를 보여줘"이고, 응답은 해당 페이지를 보여주는 것이다.

요청과 응답은 HTTP 프로토콜을 통해 이루어진다. HTTP(HyperText Transfer Protocol)클라이언트와 서버가 어떻게 데이터를 교환할지 정해놓은 규칙으로, 기본적으론 80번 포트를 사용한다. 암호화된 HTTPS의 경우는 443번 포트를 사용한다. HTTP는 문자 형태로 데이터가 전송되기 때문에, 필요한 부분은 파싱된다.

HTTP의 구조는 시작 라인(start line), 헤더(header), 공백 1줄, 바디(body)로 이루어진다.

31-1. 시작 라인

시작 라인은 요청/응답이 어떤 메시지인지를 알려준다. 따라서 요청과 응답에서 사용되는 정보가 다르다.

요청시 시작 라인

bash
GET /index.html HTTP/1.1

클라이언트가 요청할 때의 시작 라인은 HTTP 메서드, 경로, HTTP 버전으로 이루어져 있다.

우선, HTTP 메서드는 데이터를 수신하는 서버에서 어떤 작업을 해야하는지 알려준다.

  • GET: 서버로부터 데이터를 획득한다.
  • POST: 서버에 데이터를 추가, 생성한다.
  • PUT: 서버의 데이터를 갱신한다.
  • PATCH: PUT이 데이터 전체를 갱신한다면 PATCH는 일부만 갱신한다.
  • DELETE: 서버의 데이터를 삭제한다.

다음으로, 경로는 웹 페이지를 보여주기 위한 파일이나 이미지 등이 위치한 장소다. 경로는 경로/파일명.확장자 형식으로 사용되는데, http://google.com/ 처럼 경로/파일명이 없다면 보통은 index.html이라는 파일명이 숨겨진 형태다.

마지막으로, HTTP 버전은 1.0, 1.1, 2.0 순서로 진화했다. 원래 HTTP 프로토콜에는 자체적으로 정의한 헤더가 있어 버전 정보, 상태 정보 등 여러 정보를 서버로 보낼 수 있었다. 하지만 HTTP 1.0에서는 기본적으로 요청마다 TCP 연결을 새로 만들고 바로 끊었기 때문에, 같은 서버에 여러번 요청하면 그만큼 연결 설정 비용이 들었다.

이러한 문제를 극복하고자 1.1 버전부터는 기본적으로 지속 연결(Keep-Alive)을 제공해, 연결이 한번 수립되면 데이터 교환을 마칠 때까지 연결을 유지하고 데이터 교환이 끝나면 연결을 끊어 성능이 좋아졌다.

HTTP 2.0은 응용 게층에 바이너리 프레임(Binary Frame)을 추가해 기존의 일반 텍스트 데이터를 바이너리(이진수)로 변환한 후 데이터를 분할하여 보내, 전송 속도를 빠르게 하고 오류 발생 가능성도 낮췄다. 또, 여러 요청을 동시에 섞어서 보내는 멀티플렉싱도 지원해 속도가 보다 크게 개선되어 오늘날 가장 많이 쓰이고 있다.

web almanac http
이미지 출처 : #
책에선 HTTP 1.1이 가장 많이 쓰인다고 했지만, 2025년 12월 현재 기준 옛말이다. 2024년 Web Almanac 기준, 70%가 넘는 비율이 HTTP/2이다.

응답시 시작 라인

bash
HTTP/1.1 200 OK

서버가 응답할 때의 시작 라인은 HTTP 버전과 응답 메시지로 구성되어 있다.

응답 메시지의 상태코드는 아래와 같은 의미를 가진다.

상태 코드의미설명
1xx정보요청을 받았으며 처리가 되고 있음
2xx성공요청 성공
3xx리다이렉션클라이언트가 요청한 정보가 다른 곳에 있음
4xx클라이언트 오류클라이언트 측에서 기인한 오류로 요청 실패
5xx서버 오류서버 측에서 기인한 오류로 요청 실패

헤더와 바디

헤더(Header)에는 클라이언트와 서버가 통신하기 위한 부가적인 정보들이 포함된다.

  • Host: 서버의 도메인 이름(브라우저에 입력하는 주소)과 포트 번호
  • Connection: 현재의 작업이 끝난 후에도 네트워크를 연결 상태로 둘지 여부(예: keep-alive, close)
  • Accept-Language: 서버가 응답에 사용할 언어(예: ko-KR, en-US)

바디(Body)에는 데이터가 포함된다.

32. DNS 서버

네트워크에선 IP 주소와 MAC 주소로 통신을 하는데, 우리는 웹 브라우저에 142.250.206.228이 아니라 www.google.com 을 입력한다. 즉, IP 주소가 아니라 인간에게 보다 친숙한 이름을 입력하고 있는데, 이를 도메인 이름이라고 한다. 그리고 도메인 주소룰 IP 주소로 변경해주는 것이 DNS(Domain Name System) 서버이다.

DNS 서버는 아래와 같은 방식으로 작동한다.

  1. 사용자는 www.google.com 을 웹 브라우저에 입력한다.
  2. 사용자의 요청은 DNS로 전달된다. DNS 서버는 www.google.com에 해당하는 IP 주소인 142.250.206.228을 전달한다.
  3. 사용자는 해당 IP 주소를 이용해 웹 사이트에 접속한다.
  4. 웹 서버는 사용자의 요청에 응답한다.

물론, DNS 서버가 www.google.com의 IP 주소를 모를 수도 있는데, 이럴 땐 또 다른 DNS 서버에 질의해서 IP 주소를 전달받는다.

DNS 서버는 계층적으로 구성되어 있다. 즉, 단계별로 질의를 하는데 루트부터 시작해 .com에 대한 2단계 질의가 이루어지고 마지막으로 최종 www.google.com에 대한 IP 주소를 얻게 되는 3단계 질의를 한다.

33. DHCP 서버

인터넷을 사용하거나 WAN 환경에서 다른 컴퓨터와 통신하기 위해선 IP 주소가 필요하다. 그런데 IP 주소를 관리자가 일일이 개별 컴퓨터들에 할당하고 관리하는 것은 몹시 번거로운 일이다.

그래서 IP 주소를 자동으로 관리하기 위해 등장한 것이 DHCP 서버이다. DHCP(Dynamic Host Configuration Protocol) 서버는 사용자들에게 IP 주소를 할당하거나 회수하는 것을 자동으로 해준다.

DHCP 서버는 다음과 같은 방식으로 작동하는데, 보통 DORA(Discover, Offer, Request, Acknowledge)라는 흐름으로 설명한다.

  1. 클라이언트가 브로드캐스트로 "IP 주소 줄 사람?"이라는 Discover 메시지를 보낸다.
  2. DHCP 서버는 "이 IP 쓰면 쓸래?"라는 Offer 메시지를 보낸다.
  3. 클라이언트는 "그 IP 줘"라는 Request를 보낸다.
  4. DHCP 서버가 Acknowledge로 "그래, 이거 써"라고 응답한다.

34. SMTP와 POP3 프로토콜

이메일을 주고받을 때도 프로토콜이 필요하다. 이메일의 송신자는 SMTP를, 수신자는 POP3 또는 IMAP 프로토콜을 사용한다.

  • SMTP: Simple Mail Transfer Protocol의 약자로, 메일 송신 프로토콜이다. 주로 25번(서버 간), 587/465번 포트(클라이언트에서 서버로 전송)를 쓴다.
  • POP3: Post Office Protocol version 3의 약자로, 메일을 내려받는 프로토콜이다. 기본 포트는 110번이다.
  • IMAP: Internet Message Access Protocol의 약로, 서버에 메일을 둔 채 동기화하는 프로토콜이다. 기본 포트는 143번이다.

34-1. 송신자와 메일 서버 간의 통신

사용자가 메일 서버에 이메일을 보내는 과정은 아래와 같다.

  1. 사용자가 쓰는 컴퓨터 A는 메일 서버의 25번 포트(SMTP)로 통신을 하겠다고 알린다. 메일 서버는 OK 신호와 함께 자신의 이름을 알려준다.
  2. 통신을 위한 준비가 되었으니, 이번엔 컴퓨터 A라는 자신의 이름을 알린다. 메일 서버는 OK로 응답한다.
  3. 내 이메일 주소를 메일 서버에 알려주면, 메일 서버는 OK로 응답한다.
  4. 이번엔 상대방에 대한 이메일 주소를 알려주고 OK를 응답 받는다.
  5. 메일 서버에 이메일 본문을 전달하면, 메일 서버는 OK로 응답한다.
  6. 연결을 종료하겠다고 하면 메일 서버는 연결을 종료한다.

34-2. 메일 서버 간의 통신

메일 서버 간에도 SMTP를 쓰는데, 과정이 약간 다르다.

  1. 송신자 측 메일 서버는 메일을 수신자 측 메일 서버로 전달한다. 이 때도 25번 포트를 사용하는 SMTP를 쓴다.
  2. 수신자 측 메일 서버는 이 이메일을 사용자 B의 편지함에 저장한다.

34-3. 수신자와 메일 서버 간의 통신

수신자는 POP3 또는 IMAP 프로토콜로 메일을 확인한다.

  1. 사용자 B는 110번 포트(POP3 프로토콜)로 메일 서버에 연결을 시도한다.
  2. 연결이 수립되면 사용자가 누구인지 밝힌다.
  3. 내 편지함에서 이메일을 확인하기 위한 패스워드를 알려준다.(인증)
  4. 인증에 통과하면, 사용자 B는 메일 서버에 이메일이 있다는 것을 확인할 수 있다.
  5. 이메일을 컴퓨터 B로 내려받는다.
  6. 이메일을 내려받았으면 메일 서버와의 연결을 종료한다.

POP3은 편지함에서 이메일을 가져오면 서버에서 이메일이 삭제되는게 기본 동작이다. 이와는 달리, IMAP(Internet Access Message Protocol)에서는 메일을 삭제하지 않는다. 다만, POP3도 요즘은 서버에 복사본을 남기는 옵션을 주로 사용한다.

35. 응용 계층에서 사용하는 로드 밸런서

응용 계층(L7)의 로드 밸런서는 전송 계층(L4)의 로드 밸런서 기능까지 포함하고 있다. 따라서, IP 주소나 포트는 물론 URI(Uniform Resource Identifier, 인터넷에 있는 자원을 나타내는 주소), HTTP 헤더, 쿠키 등의 내용을 기준으로 부하를 분산시켜준다.

전송 계층의 로드 밸런서가 IP 주소와 포트 번호를 기준으로 부하를 분산시켰다면, 응용 계층의 로드 밸런서는 서비스별로 부하를 분산시키는 것도 가능하다. 예를 들어, 특정 서비스에 가입한 사용자가 아주 많을때, 로그인만 전담하는 서버, 결제만 전담하는 서버 등을 각각 분리해서 구성하고, 각각의 서버에 맞는 사용자 접속을 분산 처리할 수 있다.

sungyup's