HTML&CSS/웹 개발 입문

웹사이트 동작 구조 이해 (브라우저, 서버, 클라이언트)

코딩하는 패션이과생 2025. 5. 11. 13:43
반응형

웹의 기본 구조: 클라이언트-서버 모델

인터넷에서 웹사이트가 작동하는 방식을 이해하기 위해서는 먼저 '클라이언트-서버 모델'이라는 기본 구조를 알아야 합니다. 이 모델은 모든 웹사이트와 웹 애플리케이션의 기반이 되는 아키텍처입니다.

클라이언트-서버 모델이란?

클라이언트-서버 모델은 두 개의 주요 구성 요소로 이루어져 있습니다:

  • 클라이언트: 서비스를 요청하는 쪽으로, 일반적으로 웹 브라우저(Chrome, Firefox, Safari 등)가 실행되는 사용자의 기기(컴퓨터, 스마트폰, 태블릿 등)입니다.
  • 서버: 서비스를 제공하는 쪽으로, 웹사이트 파일을 저장하고 클라이언트의 요청에 응답하는 컴퓨터입니다.

이 두 구성 요소는 인터넷을 통해 서로 통신하며, 이 통신은 HTTP(하이퍼텍스트 전송 프로토콜) 또는 HTTPS(보안 HTTP) 프로토콜을 사용하여 이루어집니다.

클라이언트-서버 모델 다이어그램

클라이언트-서버 통신의 비유

클라이언트-서버 모델은 레스토랑에 비유할 수 있습니다:

  • 고객(클라이언트): 음식을 주문하는 사람
  • 웨이터(HTTP/HTTPS): 주문을 주방에 전달하고 음식을 가져오는 매개체
  • 주방(서버): 주문을 받고 음식을 준비하는 곳

고객이 웨이터에게 메뉴를 주문하면, 웨이터는 그 주문을 주방에 전달합니다. 주방에서 음식이 준비되면 웨이터가 이를 고객에게 제공합니다. 웹에서의 데이터 요청과 응답도 이와 유사하게 작동합니다.

클라이언트(브라우저)의 역할

웹 브라우저는 클라이언트 측에서 가장 중요한 소프트웨어입니다. 브라우저의 주요 역할은 다음과 같습니다:

1. 사용자 인터페이스 제공

브라우저는 사용자가 웹을 탐색할 수 있는 인터페이스를 제공합니다. 주소 표시줄, 뒤로/앞으로 버튼, 북마크 등의 기능이 포함됩니다.

2. 데이터 요청 및 수신

사용자가 URL을 입력하거나 링크를 클릭하면, 브라우저는 해당 웹 서버에 데이터를 요청합니다. 서버로부터 받은 데이터(HTML, CSS, JavaScript 파일 등)를 처리합니다.

3. 웹 페이지 렌더링

브라우저는 서버로부터 받은 HTML, CSS, JavaScript 파일을 해석하고 실행하여 사용자에게 시각적인 웹 페이지를 표시합니다. 이 과정에서 브라우저의 렌더링 엔진이 중요한 역할을 합니다.

주요 브라우저 구성 요소

브라우저는 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  1. 사용자 인터페이스: 주소 표시줄, 버튼 등 사용자가 상호작용하는 부분
  2. 브라우저 엔진: UI와 렌더링 엔진 사이의 중개자 역할
  3. 렌더링 엔진: HTML과 CSS를 파싱하여 화면에 표시
  4. 네트워킹: HTTP 요청과 같은 네트워크 호출을 처리
  5. JavaScript 엔진: JavaScript 코드를 해석하고 실행(예: Chrome의 V8)
  6. UI 백엔드: 기본 위젯(버튼, 입력 필드 등)을 그리는 데 사용
  7. 데이터 저장소: 쿠키, 로컬 스토리지 등 데이터를 저장하는 계층

서버의 역할과 종류

서버는 클라이언트의 요청을 처리하고 적절한 응답을 제공하는 컴퓨터입니다. 다양한 종류의 서버가 있으며, 각각 특정 기능을 담당합니다.

웹 서버의 주요 역할

  1. 파일 제공: HTML, CSS, JavaScript, 이미지 등의 정적 파일을 클라이언트에게 전송
  2. 요청 처리: 클라이언트로부터 오는 HTTP 요청을 처리
  3. 보안 관리: 인증, 권한 부여, HTTPS 암호화 등 보안 기능 제공
  4. 로드 밸런싱: 많은 트래픽을 효율적으로 분산

주요 웹 서버 종류

  1. Apache HTTP Server: 가장 널리 사용되는 오픈 소스 웹 서버
  2. Nginx: 높은 성능과 낮은 메모리 사용량으로 유명한 웹 서버
  3. Microsoft IIS: Windows 서버용 웹 서버
  4. Node.js: JavaScript 기반의 서버 사이드 플랫폼

애플리케이션 서버

웹 서버가 주로 정적 콘텐츠를 처리한다면, 애플리케이션 서버는 동적 콘텐츠 생성과 비즈니스 로직 처리를 담당합니다:

  • Tomcat: Java 기반 애플리케이션 서버
  • Django: Python 웹 프레임워크
  • Ruby on Rails: Ruby 웹 프레임워크
  • Express.js: Node.js 웹 프레임워크

데이터베이스 서버

데이터 저장과 관리를 담당하는 서버입니다:

  • MySQL, PostgreSQL: 관계형 데이터베이스
  • MongoDB: NoSQL 데이터베이스
  • Redis: 인메모리 데이터 구조 저장소

웹사이트 로딩 과정 단계별 이해하기

웹사이트가 로딩되는 전체 과정을 단계별로 살펴보겠습니다. 이 과정은 사용자가 브라우저에 URL을 입력하는 순간부터 시작됩니다.

1. URL 입력 및 요청 시작

사용자가 브라우저의 주소 표시줄에 URL(예: www.example.com)을 입력하고 엔터 키를 누릅니다.

2. DNS 조회

브라우저는 먼저 도메인 이름(www.example.com)을 해당 웹 서버의 IP 주소로 변환해야 합니다. 이 과정을 "DNS 조회"라고 합니다:

  1. 브라우저는 먼저 자체 캐시를 확인합니다.
  2. 캐시에 없으면 운영 체제의 DNS 캐시를 확인합니다.
  3. 여전히 찾지 못하면 라우터의 DNS 캐시를 확인합니다.
  4. 마지막으로 ISP(인터넷 서비스 제공업체)의 DNS 서버에 쿼리를 보냅니다.

3. TCP 연결 설정

IP 주소를 찾은 후, 브라우저는 해당 서버와 TCP(전송 제어 프로토콜) 연결을 설정합니다. 이 과정은 "3-way 핸드셰이크"라고 불리는 절차를 통해 이루어집니다:

  1. 클라이언트가 서버에 연결 요청(SYN) 패킷을 보냅니다.
  2. 서버가 요청을 수락하고 클라이언트에게 승인(SYN-ACK) 패킷을 보냅니다.
  3. 클라이언트가 서버에 확인(ACK) 패킷을 보내 연결을 설정합니다.

4. HTTP 요청 전송

TCP 연결이 설정되면, 브라우저는 HTTP 요청을 서버에 보냅니다. 이 요청에는 다음 정보가 포함됩니다:

  • 요청 메서드(GET, POST 등)
  • 요청 경로(/index.html 등)
  • HTTP 버전(HTTP/1.1, HTTP/2 등)
  • 헤더 정보(User-Agent, Accept-Language 등)
  • 필요한 경우 본문 데이터(POST 요청 시)
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

5. 서버 처리 및 응답

서버는 요청을 받아 처리한 후 HTTP 응답을 클라이언트에게 보냅니다. 응답에는 다음 정보가 포함됩니다:

  • 상태 코드(200 OK, 404 Not Found 등)
  • 헤더 정보(Content-Type, Content-Length 등)
  • 요청한 리소스(HTML 문서 등)
HTTP/1.1 200 OK
Date: Mon, 10 May 2025 12:28:53 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 1234

<!DOCTYPE html>
<html>
...
</html>

6. 브라우저의 렌더링 과정

브라우저가 HTML 응답을 받으면 다음과 같은 렌더링 과정을 거칩니다:

  1. HTML 파싱: HTML 문서를 파싱하여 DOM(Document Object Model) 트리를 구성합니다.
  2. CSS 파싱: CSS 파일을 파싱하여 CSSOM(CSS Object Model) 트리를 구성합니다.
  3. 렌더 트리 구성: DOM과 CSSOM을 결합하여 렌더 트리를 만듭니다.
  4. 레이아웃(또는 리플로우): 각 요소의 크기와 위치를 계산합니다.
  5. 페인팅: 화면에 픽셀을 그립니다.
  6. 컴포지팅: 여러 레이어를 합성하여 최종 화면을 구성합니다.

7. 추가 리소스 로딩

HTML 문서 내에 다른 리소스(CSS, JavaScript, 이미지, 폰트 등)에 대한 링크가 있으면, 브라우저는 각 리소스에 대해 별도의 HTTP 요청을 보내 로드합니다.

8. JavaScript 실행

JavaScript 파일이 로드되면 브라우저의 JavaScript 엔진이 이를 실행합니다. JavaScript는 DOM을 조작하거나 추가 데이터를 가져오는 등의 작업을 수행할 수 있습니다.

HTTP와 HTTPS 프로토콜

HTTP(HyperText Transfer Protocol)와 HTTPS(HTTP Secure)는 웹 브라우저와 웹 서버 간의 통신을 위한 프로토콜입니다.

HTTP의 기본 특성

  • 무상태(Stateless): 각 요청은 독립적이며 이전 요청에 대한 정보를 유지하지 않습니다.
  • 클라이언트-서버 구조: 클라이언트가 요청을 시작하고 서버가 응답합니다.
  • 텍스트 기반: 메시지는 사람이 읽을 수 있는 텍스트 형식입니다.

HTTP 메서드

HTTP는 여러 메서드를 통해 서버에 다양한 작업을 요청할 수 있습니다:

  • GET: 리소스 조회
  • POST: 리소스 생성
  • PUT: 리소스 전체 수정
  • PATCH: 리소스 일부 수정
  • DELETE: 리소스 삭제
  • HEAD: 헤더 정보만 조회
  • OPTIONS: 지원되는 메서드 조회

HTTP 상태 코드

서버는 응답 시 상태 코드를 통해 요청 처리 결과를 알려줍니다:

  • 1xx: 정보 제공(100 Continue 등)
  • 2xx: 성공(200 OK, 201 Created 등)
  • 3xx: 리다이렉션(301 Moved Permanently, 302 Found 등)
  • 4xx: 클라이언트 오류(400 Bad Request, 404 Not Found 등)
  • 5xx: 서버 오류(500 Internal Server Error, 503 Service Unavailable 등)

HTTPS: 보안이 강화된 HTTP

HTTPS는 HTTP에 SSL/TLS 암호화 계층을 추가한 프로토콜입니다:

  • 데이터 암호화: 데이터가 암호화되어 제3자에 의한 도청을 방지합니다.
  • 데이터 무결성: 전송 중 데이터 변조를 감지할 수 있습니다.
  • 인증: SSL/TLS 인증서를 통해 서버의 신원을 확인할 수 있습니다.

HTTPS 연결은 다음과 같은 단계로 설정됩니다:

  1. 클라이언트가 서버에 연결 요청을 보냅니다.
  2. 서버가 SSL/TLS 인증서를 클라이언트에게 보냅니다.
  3. 클라이언트가 인증서를 확인하고 세션 키를 생성합니다.
  4. 클라이언트가 세션 키를 서버의 공개 키로 암호화하여 서버에 보냅니다.
  5. 서버가 세션 키를 복호화합니다.
  6. 서버와 클라이언트가 세션 키를 사용하여 암호화된 데이터를 주고받습니다.

DNS의 역할: 도메인 이름 해석

DNS(Domain Name System)는 인터넷의 '전화번호부'와 같은 역할을 합니다. 사람이 기억하기 쉬운 도메인 이름(예: www.example.com)을 컴퓨터가 이해할 수 있는 IP 주소(예: 93.184.216.34)로 변환합니다.

DNS 계층 구조

DNS는 계층적인 분산 데이터베이스 시스템으로 구성되어 있습니다:

  1. 루트 DNS 서버: 최상위 DNS 서버로, TLD 서버의 정보를 제공합니다.
  2. TLD(Top-Level Domain) 서버: .com, .org, .net 등의 최상위 도메인을 관리합니다.
  3. 권한 있는 DNS 서버: 특정 도메인(example.com 등)의 정보를 관리합니다.
  4. 리커시브 DNS 서버(ISP DNS): 클라이언트의 요청을 받아 다른 DNS 서버에 쿼리하여 결과를 클라이언트에게 반환합니다.

DNS 조회 과정

  1. 사용자가 브라우저에 www.example.com을 입력합니다.
  2. 브라우저는 리커시브 DNS 서버(일반적으로 ISP에서 제공)에 쿼리를 보냅니다.
  3. 리커시브 DNS 서버는 루트 DNS 서버에 쿼리합니다.
  4. 루트 DNS 서버는 .com TLD 서버 정보를 제공합니다.
  5. 리커시브 DNS 서버는 .com TLD 서버에 쿼리합니다.
  6. .com TLD 서버는 example.com 권한 있는 DNS 서버 정보를 제공합니다.
  7. 리커시브 DNS 서버는 example.com 권한 있는 DNS 서버에 쿼리합니다.
  8. 권한 있는 DNS 서버는 www.example.com의 IP 주소를 제공합니다.
  9. 리커시브 DNS 서버는 IP 주소를 브라우저에 반환합니다.

DNS 레코드 유형

DNS 서버는 다양한 유형의 레코드를 저장합니다:

  • A 레코드: 도메인 이름을 IPv4 주소에 매핑
  • AAAA 레코드: 도메인 이름을 IPv6 주소에 매핑
  • CNAME 레코드: 도메인 이름을 다른 도메인 이름에 매핑(별칭)
  • MX 레코드: 이메일 서버 지정
  • TXT 레코드: 텍스트 정보 저장(SPF, DKIM 등)
  • NS 레코드: 도메인의 권한 있는 이름 서버 지정

정적 웹사이트 vs 동적 웹사이트

웹사이트는 콘텐츠 생성 방식에 따라 정적 웹사이트와 동적 웹사이트로 나눌 수 있습니다.

정적 웹사이트

정적 웹사이트는 사전에 작성된 고정된 HTML 파일을 제공합니다:

  • 특징:
    • 모든 사용자에게 동일한 콘텐츠 제공
    • 서버에 저장된 파일을 그대로 전송
    • 빠른 로딩 속도
    • 낮은 서버 부하
    • 높은 보안성
  • 적합한 용도:
    • 회사 소개 페이지
    • 개인 포트폴리오
    • 제품 설명 페이지
    • 간단한 블로그
  • 개발 도구:
    • HTML, CSS, JavaScript
    • 정적 사이트 생성기(Jekyll, Hugo, Gatsby 등)

동적 웹사이트

동적 웹사이트는 사용자 요청 시 서버에서 콘텐츠를 생성합니다:

  • 특징:
    • 사용자별, 상황별 맞춤형 콘텐츠 제공
    • 데이터베이스와 연동하여 콘텐츠 관리
    • 사용자 상호작용과 입력 처리
    • 상대적으로 느린 로딩 속도
    • 높은 서버 부하
  • 적합한 용도:
    • 소셜 미디어 플랫폼
    • 전자상거래 사이트
    • 웹 애플리케이션
    • 사용자 계정이 필요한 서비스
  • 개발 도구:
    • 서버 사이드 언어(PHP, Python, Ruby, Java, Node.js 등)
    • 웹 프레임워크(Django, Rails, Express, Spring 등)
    • 데이터베이스(MySQL, PostgreSQL, MongoDB 등)

하이브리드 접근법

현대 웹 개발에서는 종종 정적 사이트와 동적 사이트의 장점을 결합한 하이브리드 접근법을 사용합니다:

  • JAMstack(JavaScript, APIs, Markup): 정적 사이트 생성기로 페이지를 미리 렌더링하고, 클라이언트 측 JavaScript와 API를 통해 동적 기능 추가
  • 서버 사이드 렌더링(SSR) + 클라이언트 사이드 렌더링(CSR) 조합

프론트엔드와 백엔드의 협업

웹 개발은 크게 프론트엔드와 백엔드 개발로 나뉘며, 이 두 영역이 효과적으로 협업해야 완전한 웹사이트가 만들어집니다.

프론트엔드(클라이언트 사이드)

프론트엔드는 사용자가 직접 보고 상호작용하는 웹사이트의 부분을 담당합니다:

  • 기술: HTML, CSS, JavaScript, 프론트엔드 프레임워크(React, Vue, Angular 등)
  • 역할:
    • 사용자 인터페이스(UI) 구현
    • 사용자 경험(UX) 최적화
    • 사용자 입력 처리
    • 백엔드 API와 통신
    • 데이터 표시 및 관리

백엔드(서버 사이드)

백엔드는 사용자에게 보이지 않는 서버 측 로직을 담당합니다:

  • 기술: 서버 사이드 언어, 데이터베이스, 서버 환경
  • 역할:
    • 비즈니스 로직 처리
    • 데이터베이스 관리
    • API 엔드포인트 제공
    • 인증 및 권한 부여
    • 서버 보안 관리

프론트엔드와 백엔드의 통신

프론트엔드와 백엔드는 주로 HTTP/HTTPS를 통해 통신하며, 데이터 교환 형식으로는 JSON이나 XML을 사용합니다:

// 프론트엔드에서 백엔드 API 호출 예시 (JavaScript)
fetch('https://api.example.com/users')
  .then(response => response.json())
  .then(data => {
    console.log('사용자 데이터:', data);
    displayUsers(data);
  })
  .catch(error => {
    console.error('API 호출 오류:', error);
  });

백엔드에서는 이러한 요청을 받아 처리하고 응답을 반환합니다:

# 백엔드 API 엔드포인트 예시 (Python Flask)
@app.route('/users', methods=['GET'])
def get_users():
    users = db.query("SELECT * FROM users")
    return jsonify(users)

API(Application Programming Interface)

API는 프론트엔드와 백엔드 간의 통신을 위한 인터페이스입니다:

  • REST API: 자원(URI)을 중심으로, HTTP 메서드를 사용하여 CRUD 작업을 수행
  • GraphQL: 클라이언트가 필요한 데이터만 정확히 요청하고 받을 수 있는 쿼리 언어
  • WebSocket: 양방향 실시간 통신을 위한 프로토콜

현대 웹 아키텍처의 이해

웹 개발 아키텍처는 시간이 지남에 따라 진화해왔습니다. 현대 웹 개발에서 흔히 볼 수 있는 아키텍처 패턴들을 살펴보겠습니다.

전통적인 서버 사이드 렌더링(SSR)

서버에서 HTML을 완전히 생성하여 클라이언트에 전송하는 방식:

  • 장점: 초기 로딩 속도가 빠름, SEO에 유리
  • 단점: 페이지 전환 시 전체 페이지를 다시 로드해야 함
  • 예시: PHP, Django, Ruby on Rails로 구축된 전통적인 웹사이트

단일 페이지 애플리케이션(SPA)

하나의 HTML 페이지를 로드한 후 JavaScript를 통해 콘텐츠를 동적으로 변경하는 방식:

  • 장점: 부드러운 사용자 경험, 네이티브 앱과 유사한 느낌
  • 단점: 초기 로딩 시간이 길 수 있음, SEO가 어려울 수 있음
  • 예시: React, Vue, Angular로 구축된 웹 애플리케이션

서버 사이드 렌더링 + 클라이언트 사이드 렌더링

두 접근 방식의 장점을 결합:

  • 장점: 초기 로딩 속도가 빠르면서도 동적 인터랙션 가능, SEO에 유리
  • 단점: 구현 복잡도 증가
  • 예시: Next.js(React), Nuxt.js(Vue)

JAMstack

JavaScript, API, Markup의 약자로, 정적 사이트 생성과 API 기반 기능을 조합:

  • 장점: 높은 성능, 보안, 확장성
  • 단점: 동적 콘텐츠에 제한이 있을 수 있음
  • 예시: Gatsby, Next.js, Netlify

마이크로프론트엔드

대규모 애플리케이션을 독립적으로 개발, 테스트, 배포할 수 있는 작은 프론트엔드 애플리케이션으로 분리:

  • 장점: 팀 간 독립적 개발, 점진적 업그레이드 가능
  • 단점: 설정과 통합이 복잡할 수 있음

프로그레시브 웹 앱(PWA)

웹사이트와 네이티브 앱의 장점을 결합한 형태:

  • 특징: 오프라인 작동, 푸시 알림, 홈 화면 설치 등
  • 기술: Service Worker, Web App Manifest, HTTPS

웹사이트 성능 최적화의 중요성

웹사이트의 성능은 사용자 경험과 비즈니스 성과에 직접적인 영향을 미칩니다. 웹사이트 로딩 시간이 3초를 넘어가면 40%의 사용자가 이탈한다는 연구 결과도 있습니다.

주요 성능 지표

  • FCP(First Contentful Paint): 첫 콘텐츠가 화면에 표시되는 시간
  • LCP(Largest Contentful Paint): 가장 큰 콘텐츠가 화면에 표시되는 시간
  • TTI(Time to Interactive): 사용자가 페이지와 상호작용할 수 있게 되는 시간
  • CLS(Cumulative Layout Shift): 페이지 로드 중 레이아웃 변경의 정도

웹사이트 최적화 기법

  1. 리소스 최적화:
    • 이미지 압축 및 최적화
    • CSS/JavaScript 파일 압축(Minification)
    • 텍스트 압축(Gzip, Brotli)
    • 불필요한 코드 제거(Tree Shaking)
  2. 로딩 전략:
    • 리소스 지연 로딩(Lazy Loading)
    • 중요한 CSS 인라인화
    • 코드 분할(Code Splitting)
  3. 캐싱 활용:
    • 브라우저 캐싱
    • CDN(Content Delivery Network) 활용
    • 서비스 워커 캐싱
  4. 렌더링 최적화:
    • 크리티컬 렌더링 패스 최적화
    • 불필요한 리플로우/리페인트 방지
    • 효율적인 애니메이션 사용

마치며

웹사이트 동작 구조를 이해하는 것은 효과적인 웹 개발을 위한 기초입니다. 클라이언트와 서버가 어떻게 상호작용하는지, 브라우저가 어떻게 웹 페이지를 렌더링하는지, 그리고 현대 웹 아키텍처가 어떻게 발전해왔는지 이해함으로써 더 효율적이고 사용자 친화적인 웹사이트를 구축할 수 있습니다.

웹 개발은 끊임없이 진화하는 분야이므로, 지속적인 학습과 업계 동향 파악이 중요합니다. 다음 글에서는 HTML의 기본 구조와 주요 태그에 대해 자세히 알아보겠습니다.

'HTML&CSS > 웹 개발 입문' 카테고리의 다른 글

HTML, CSS, JavaScript의 역할 - 웹 개발의 3대 핵심 기술  (1) 2025.05.11
웹 개발이란?  (0) 2025.05.11