
호스트는 IP 주소로 식별되지만,
예:
www.example.com
developers.naver.com
이 도메인은 DNS 서버에 저장되어 IP 주소와 1:1 매핑된다.
도메인 명은 점(.)을 기준으로 계층적이다.
예: www.example.com.
.comexamplewww이 구조를 관리하는 DNS 서버도 계층형 구조다.
클라이언트 → 로컬 DNS 서버에게 질의
로컬 DNS가 모르면
→ 루트 DNS → TLD DNS → 하위 DNS 순으로 재귀적으로 탐색
최종 IP 주소를 찾아 클라이언트에게 전달
결과는 DNS 캐시에 저장해 재사용
도메인에 다양한 정보가 매핑되는데 이를 DNS 레코드라고 한다.
| 타입 | 설명 |
|---|---|
| A | 도메인 → IPv4 |
| AAAA | 도메인 → IPv6 |
| CNAME | 다른 도메인을 가리키는 별칭 |
| NS | 해당 도메인을 관리하는 DNS 서버 |
| MX | 메일 서버 정보 |
예:
example.com A 1.2.3.4
www.example.com CNAME example.com
URI (Uniform Resource Identifier)
→ 웹 상의 자원을 식별하기 위한 통일된 규칙
URI 종류
대부분은 URL 방식 사용.

| 구성 요소 | 설명 |
|---|---|
| scheme | 사용하는 프로토콜 (http, https 등) |
| authority | host + port |
| path | 자원 경로 |
| query | 추가 파라미터 (?key=value&key2=value2) |
| fragment | 자원의 특정 위치 (HTML 내부 점프 등) |
클라이언트가 요청하면 서버가 응답하는 구조.
HTML, JSON, PDF, 이미지, 영상 등 어떤 형식이든 전달 가능.
→ 형식은 MIME 타입(=미디어 타입)으로 표현.
예:
text/html, application/json, image/png
서버는 클라이언트의 상태를 기억하지 않음.
→ 서버 확장성·견고성 증가
→ 필요한 경우 쿠키/세션/토큰 등을 사용해 상태를 유지.

HTTP/1.1 이후 기본적으로 하나의 TCP 연결로 여러 요청을 처리.
→ 성능 향상.
HTTP 메시지는 다음 3개로 구성된다.
시작 라인
헤더 라인들
(빈 줄)
메시지 본문(Body)
GET /home HTTP/1.1 ← 요청 라인
Host: example.com ← 헤더
User-Agent: Chrome ← 헤더
{body}
요청 라인의 구성:
HTTP/1.1 200 OK ← 상태 라인
Content-Type: text/html ← 헤더
<html>...</html>
상태 라인 구성:
| 메서드 | 설명 |
|---|---|
| GET | 조회 |
| HEAD | GET과 동일하지만 Body 없음 |
| POST | 자원 생성 / 작업 처리 |
| PUT | 전체 수정(덮어쓰기) |
| PATCH | 부분 수정 |
| DELETE | 자원 삭제 |
| OPTIONS | 지원 메서드 확인 |
| CONNECT/TRACE | 특수 목적 |
기존 데이터:
{id:1, title:"A", contents:"B"}
PATCH
{title:"수정"} → title만 변경
PUT
{title:"수정"} → 전체 덮어쓰므로 contents 사라짐
| 코드 | 의미 |
|---|---|
| 200 OK | 정상 처리 완료 |
| 201 Created | 새 리소스 생성 |
| 202 Accepted | 요청은 받았지만 처리 중 |
| 204 No Content | 처리 성공, 본문 없음 |
| 코드 | 설명 |
|---|---|
| 301 Moved Permanently | 영구 이동(GET로 바뀔 수 있음) |
| 308 Permanent Redirect | 영구 이동(메서드 유지) |
| 302 Found | 임시 이동(메서드 변경 가능) |
| 303 See Other | 반드시 GET으로 재요청 |
| 307 Temporary Redirect | 메서드 유지 |
영구적 리다이렉션( permanent recdirection)
자원이 완전히 새로운 곳으로 이동하여 경로가 영구적으로 재지정되는 것
자원의 위치가 영구적으로 변경되었음을 시사하므로, 기존 URL에 요청 메시지를 보내면 항상 새로운 URL로 리다이렉트 된다.
만약 어떤 URL에 요청을 보낸 결과로 영구적인 리다이렉션 관련 상태 코드를 응답받았다면 요청을 보낸 기존의 URL은 기억할 필요가 없다
일시적 리다이렉션 (emporary redirection)
자원의 위치가 임시로 변경되었거나 임시로 사용할 URL이 필요한 경우에 주로 사용
만약 어떤 URL에 대해 일시적인 리다이렉션 관련 상태 코드를 응답 받았다면 영구적인 리다이렉션과는 달리 여전히 요청을 보낸 기존의 URL을 기억해야 한다.
301 (Moved Permanently)과 308 (Permanent Redirect), 그리고 302 (Found)와 303 (See Other), 307 (Temporary Redirect)은 재요청 메서드가 어떻게 변경되는지에 따라 구분할 수 있다.
앞선 예시로 확인했듯이 클라이언트가 리다이렉션 상태 코드를 수신할 경우 Location 헤더에 명시된 URL로 즉시 재요청을 보내어 새로운 URL에 대한 응답을 받게 된다.
이때 처음으로 요청을 보낸 메서드가 POST 등 GET이 아닌 메서드일 경우, 301의 재요청 메서드는 GET으로 변경될 가능성이 있지만, 308의 재요청 메서드는 첫 번째 요청 메서드에서 변경되지 않는다.
즉, 301의 애매모호함을 보완하기 위해 만들어진 상태 코드가 308이라고 할 수 있다.
| 코드 | 설명 |
|---|---|
| 400 Bad Request | 잘못된 요청 |
| 401 Unauthorized | 인증 필요 (Identity 문제) |
| 403 Forbidden | 권한 부족 (Permission 문제) |
| 404 Not Found | 리소스 없음 |
| 405 Method Not Allowed | 지원하지 않는 메서드 |
| 코드 | 설명 |
|---|---|
| 500 Internal Server Error | 서버 내부 오류(대표) |
| 502 Bad Gateway | 중간 서버의 응답 오류 |
| 헤더 | 설명 |
|---|---|
| Host | 요청 대상 도메인/IP |
| User-Agent | 클라이언트 장치/브라우저 정보 |
| Referer | 이전 페이지(유입 경로) |
| 헤더 | 설명 |
|---|---|
| Server | 서버 소프트웨어 정보 |
| Location | 리다이렉트·새 자원 위치 |
| Allow | 해당 URL이 지원하는 메서드 목록(405 때 자주 사용) |
| 헤더 | 설명 |
|---|---|
| Date | 메시지 생성 시각 |
| Content-Type | 본문 미디어 타입 (json, html 등) |
| Content-Length | 본문 크기(Byte) |
| Content-Language | 본문에 사용된 자연어 (ko-KR 등) |
| Content-Encoding | 본문 압축 방식 (gzip, br 등) |
| Connection | keep-alive 또는 close |
HTTP는 기본적으로 “상태를 기억하지 않기” 때문에,
이를 해결하는 대표적인 기술이 바로 쿠키(Cookie)이다.
서버 → 클라이언트
쿠키 전달
Set-Cookie: name=minchul; Max-Age=3600
클라이언트 → 서버
쿠키 자동 포함
Cookie: name=minchul
| 속성 | 설명 |
|---|---|
| Domain | 이 쿠키를 전송할 도메인 지정 |
| Path | 특정 URL 경로일 때만 쿠키 전송 |
| Expires | 특정 날짜로 만료 시점 지정 |
| Max-Age | 초 단위 만료 기간 지정 |
| Secure | HTTPS일 때만 쿠키 전송 |
| HttpOnly | JS(document.cookie)로 접근 불가 → XSS 방어 |
서버가 쿠키 내려보냄
Set-Cookie: sessionId=abc123; Max-Age=86400; Secure; HttpOnly
브라우저 요청 시 자동 포함
Cookie: sessionId=abc123
쿠키는 HTTP의 stateless 한계를 보완하기 위해 클라이언트에 상태 정보를 저장하고 자동 전송하는 기술이다.
웹 캐시는 응답 자원(HTML, 이미지 등)을 임시 저장해 반복 요청 시 재사용함으로써
을 실현하는 기술이다.
캐시 유효기간을 지정하는 헤더들
| 헤더 | 설명 |
|---|---|
| Expires | 특정 날짜까지 유효 |
| Cache-Control: max-age=초 | 응답을 몇 초 동안 캐싱할지 |
예)
Cache-Control: max-age=1200
→ 20분 동안 캐시 사용 가능
캐시된 데이터는 원본 데이터가 변경될 수 있기 때문에 유효기간이 존재한다.
유효기간이 지나면 클라이언트는 서버에게 원본이 변경되었는지 확인한다.
방법은 2가지:
날짜 기반 검증 — If-Modified-Since
요청
If-Modified-Since: Fri, 23 Aug 2024 09:00:00 GMT
서버의 3가지 응답
| 상황 | 응답 |
|---|---|
| 변경됨 | 200 OK + 새 데이터 |
| 변경 안됨 | 304 Not Modified (본문 없음) |
| 삭제됨 | 404 Not Found |
ETag(Entity Tag)는 자원의 버전을 나타내는 식별자이다.
요청
If-None-Match: "abc123"
서버 응답
200 OK + 새 데이터304 Not Modified404 Not Found304 Not Modified는 "캐시 써도 됨"을 의미하는 매우 중요한 상태 코드이다.
같은 URL이라도 표현 방식(언어, 타입, 인코딩)이 다를 수 있다.
예시)
이때 클라이언트가 원하는 표현(송수신 가능한 자원의 형태)을 서버에게 전달하는 기술이 콘텐츠 협상이다.
| 헤더 | 역할 |
|---|---|
| Accept | 선호하는 미디어 타입 |
| Accept-Language | 선호하는 언어 |
| Accept-Encoding | gzip, br 등 압축 방식 |
q값은 선호도를 나타냄
1에 가까울수록 선호도가 높다.
예시:
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Accept: text/html,application/xml;q=0.9,text/plain;q=0.6
의미:
HTTP는 평문(plain text) 통신이기 때문에
위험이 있다.
이를 해결하기 위해 나온 것이 HTTPS이며,
내부적으로 TLS 프로토콜을 이용해 암호화한다.
① TCP 3-way Handshake
기본 연결 설정
② TLS Handshake
가장 중요한 단계
③ 암호화된 HTTP 메시지 송수신
HTTPS가 본격적으로 동작

클라이언트 → 서버 : ClientHello
서버 → 클라이언트 : ServerHello
Server → Client : Certificate
서로 Finished 메시지 교환
핸드셰이크 완료
→ 이제 모든 HTTP 메시지는 TLS로 암호화됨
SSL/TLS 인증서는
“내가 진짜 example.com 맞습니다”
라는 사실을 증명하기 위한 파일.
인증서는 CA(인증 기관)가 발급하며,
브라우저는 OS와 함께 내장된 CA 목록을 기준으로 서명(chain) 을 검증한다.
인증서 검증이 실패하면 주의 요함 / 보안 경고 페이지가 뜨는 이유.
일반적인 네트워크 설명은
클라이언트 ↔ 단일 서버
구도로 단순화해서 보여주지만,
실제 현실은 그보다 훨씬 복잡하다.

실제 구성
즉 최종적으로 클라이언트의 요청을 처리하고 응답을 생성하는 진짜 서버는
오리진 서버(Origin Server) 이다.
그리고 클라이언트 ↔ 오리진 사이에는 여러 종류의 중간 서버가 있다.
클라이언트 편에 위치하는 대리인 서버

특징
서버 편에 위치하는 문지기·게이트키퍼 역할

특징
가용성 정의
시스템이 “정상적으로 기능할 수 있는 시간의 비율”
가용성 = 업타임 / (업타임 + 다운타임)
예시(연간 기준):
| 가용성 | 연간 다운타임 |
|---|---|
| 99% | 3.65일 |
| 99.9% | 8.7시간 |
| 99.99% | 52.5분 |
| 99.999%(파이브 나인) | 5.26분 |
대규모 서비스(은행, 쇼핑몰, SaaS)는 주로
99.99% ~ 99.999% 를 목표로 한다.
따라서 문제가 안 생기도록 하는 것보다
문제가 생겨도 버티도록 만드는 것(결함 감내, Fault Tolerance)
이 더 중요하다.
서버를 여러 대 두면, 한 서버가 죽어도 나머지가 요청을 처리할 수 있다.
핵심 개념
서버가 여러 대라면
트래픽을 균등하게 분배해야 한다.
그 역할을 하는 것이 로드밸런서(load balancer).

라운드 로빈 (Round Robin)
서버를 순서대로 번갈아가며 배정
최소 연결 (Least Connection)
현재 “연결 수”가 가장 적은 서버로 보냄
→ WebSocket, 장기 연결 서비스에 유용
IP 해시 (IP Hash)
같은 클라이언트 → 같은 서버로
→ 세션 유지 필요한 서비스에 사용
가중치 기반 (Weighted)
성능이 좋은 서버에 더 많은 트래픽 배정
server A weight=2
server B weight=1
→ A에 B의 2배 요청 배정
랜덤(Random)
무작위 선택

서버 한 대의 성능을 올리는 방식
예)
장점
단점
서버 자체를 여러 대 늘리는 방식
장점
단점
오늘날 대부분의 서비스는
스케일 아웃 기반 + 로드밸런싱 구조
트래픽이 갑자기 증가하는 상황(티켓팅, 세일 기간 등)에 대비해
자동으로 서버를 늘리고,
트래픽이 줄면 자동으로 축소하는 기능.
AWS, GCP, Azure 모두 기본 제공.
Nginx는 웹 서버이자 리버스 프록시, 로드밸런서 역할도 수행 가능하다.
upstream backend {
least_conn; # 최소 연결 알고리즘
server 10.10.10.2 weight=1;
server 10.10.10.3 weight=2;
server 10.10.10.4 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend;
}
}
/로 들어오는 요청은 backend 그룹으로 전달| 개념 | 의미 | 예 |
|---|---|---|
| 업스트림 | 클라이언트 → 서버 | 요청(Upload) |
| 다운스트림 | 서버 → 클라이언트 | 응답(Download) |
| 인바운드 | 외부 → 내부 네트워크 진입 | 외부 이용자가 내 서버 접속 |
| 아웃바운드 | 내부 → 외부 네트워크 | 내부 직원이 외부 사이트 접속 |