HTTP에서 요청(Request) 과 응답(Response) 은
반드시
시작줄(start line)
헤더(header)
본문(body)
구조를 가지는데,
여기서 헤더는 항상 포함됩니다.
다만 “필수 헤더”는 생각보다 적고, 나머지는 선택적이에요.
1️⃣ HTTP 요청(Request) 헤더의 필수 항목
클라이언트 → 서버
요청 기본 구조
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html
필수/사실상 필수 헤더
- Host
- 요청하는 서버의 도메인 지정
- HTTP/1.1부터는 필수 (가상호스팅 환경에서 한 IP에 여러 도메인이 있을 수 있어서)
- 예: Host: www.example.com
- User-Agent (사실상 필수)
- 클라이언트 정보 (브라우저/OS 등)
- 서버가 응답을 맞춤 처리할 때 참고
"클라이언트"라는 단어는 상황에 따라 넓게도, 좁게도 쓰여서 헷갈리기 쉬워요. 정리해드릴게요.
1️⃣ 기본 정의
- 클라이언트(Client) = 서비스를 이용하는 쪽
- 서버(Server) = 서비스를 제공하는 쪽
즉, 서버에 요청을 보내고 응답을 받는 주체가 클라이언트예요.
2️⃣ 웹 환경에서 "클라이언트"
- 보통 웹 브라우저(Chrome, Safari, Edge 등)를 지칭
- 사용자가 버튼 클릭 → 브라우저가 서버에 HTTP 요청 → 서버 응답을 화면에 보여줌
하지만 브라우저만이 클라이언트는 아니에요.
3️⃣ 클라이언트 범위
- 사용자 환경 전체를 의미할 수도 있음
- 사용자 PC, 스마트폰 앱, IoT 기기 → 서버에 요청 보내면 전부 클라이언트
- 구현 주체로 보면:
- 브라우저 (웹 클라이언트)
- 모바일 앱 (네이티브 클라이언트)
- 자동화 봇, API 호출 프로그램 (머신 클라이언트)
4️⃣ 웹 통신에서 클라이언트의 역할
- 사용자의 입력(클릭, 키보드, 터치 등)을 감지
- 서버에 요청(HTTP Request) 전송
- 서버 응답(HTTP Response) 수신
- 받은 데이터를 UI로 렌더링
5️⃣ 정리
- 넓은 의미: 서비스를 이용하는 사용자 환경 전체 (사용자+브라우저/앱+디바이스)
- 좁은 의미: 네트워크 통신을 담당하는 소프트웨어(브라우저, 앱 등)
즉, 보통 우리가 "웹에서 클라이언트"라고 하면 브라우저 같은 요청자 소프트웨어를 말하는 경우가 많고,
더 넓게는 사용자 환경 전체를 포함한다고 볼 수 있어요.
"서버가 User-Agent를 참고해서 맞춤 처리한다"라고 말한 건,
서버가 클라이언트 환경(브라우저 종류, 기기 종류 등)에 따라 다른 응답을 줄 수 있다는 뜻이에요.
🔎 User-Agent란?
- 요청 헤더에 들어가는 문자열로, 클라이언트(브라우저/앱/OS)의 환경 정보를 담아요.
예시:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/118.0 Safari/537.36
- 여기엔 운영체제, 브라우저 종류/버전 같은 게 들어있어요.
🎯 맞춤 처리의 실제 사례
- 모바일/데스크톱 구분
- 서버가 User-Agent를 보고:
- 모바일 기기면 m.example.com 또는 모바일 최적화 페이지 전송
- PC라면 일반 데스크톱용 페이지 전송
- 서버가 User-Agent를 보고:
- 브라우저별 최적화
- 예: Internet Explorer(옛날)에서는 일부 기능이 안 되니까
서버가 User-Agent 확인 → IE 전용 페이지/스크립트를 내려줌
- 예: Internet Explorer(옛날)에서는 일부 기능이 안 되니까
- 앱 vs 브라우저
- 네이티브 앱에서 보내는 User-Agent를 보고, 앱 전용 API 응답 포맷(JSON)으로 주거나
일반 브라우저라면 HTML 페이지로 줌
- 네이티브 앱에서 보내는 User-Agent를 보고, 앱 전용 API 응답 포맷(JSON)으로 주거나
- 광고/추적
- User-Agent에 따라 "이 사용자가 iPhone 쓰네 → iOS 앱 설치 광고 보여주자" 같은 맞춤 광고 가능
✅ 정리
- 맞춤 처리 = 서버가 클라이언트 환경(User-Agent) 에 따라
보여주는 콘텐츠, 형식, 기능을 달리 제공하는 것
- Accept (사실상 필수)
- 클라이언트가 어떤 콘텐츠 타입을 원하는지
- 예: Accept: text/html,application/json
- Connection (사실상 필수)
- TCP 연결을 유지할지 여부
- 예: Connection: keep-alive
2️⃣ HTTP 응답(Response) 헤더의 필수 항목
서버 → 클라이언트
응답 기본 구조
HTTP/1.1 200 OK
Date: Tue, 08 Oct 2025 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Content-Type: text/html; charset=UTF-8
Content-Length: 3057
필수/사실상 필수 헤더
- Date
- 응답이 생성된 시간 (RFC에 따라 필수)
- Server (사실상 필수)
- 서버 소프트웨어 정보 (보안 이유로 일부는 가짜 값 넣기도 함)
- Content-Type
- 응답 본문의 데이터 타입
- 예: text/html, application/json, image/png
- Content-Length
- 응답 본문의 길이 (바이트 단위)
- 스트리밍/청크 전송 시는 Transfer-Encoding으로 대체 가능
3️⃣ 요청/응답 시 헤더는 무조건 포함?
- 예, 헤더는 반드시 존재합니다.
- 하지만 엄격히 보면, HTTP/1.0/1.1 사양에서 진짜 필수인 건 몇 개뿐:
- 요청: Host
- 응답: Date, Content-Type (본문이 있는 경우)
나머지(예: User-Agent, Server, Content-Length)는 “사실상 필수”라 불리는 관습적/실무적 필수 항목이에요.
4️⃣ 요약
| 구분 | 필수 헤더 | 사실상 필수 헤더 (관습적/실무적 필수) |
| 요청 | Host | User-Agent, Accept, Connection |
| 응답 | Date, Content-Type | Server, Content-Length |
- 헤더는 항상 존재 (비어 있어도 구조상 포함됨)
- 진짜 필수는 최소한이지만, 현실에서는 대부분 더 많은 헤더를 붙입니다
User-Agent 문자열은 클라이언트(브라우저/OS)가 자신을 설명하는 일종의 신분증 같은 텍스트인데,
관습적으로 정해진 포맷을 따라갑니다.
요청에 주신 예시를 쪼개서 설명드릴게요:
🔎 예시 User-Agent
🧩 구성 요소 설명
- Mozilla/5.0
- 아주 오래된 브라우저 호환성을 위한 문자열.
- Netscape 시절부터 내려온 “관습적 토큰”이에요.
- 실제로 파이어폭스만 Mozilla가 아니라, 대부분 브라우저가 이걸 넣음 → 호환성 문제 피하려고.
1️⃣ Mozilla = 원래는 파이어폭스가 아니었음
- Mozilla는 원래 Netscape Navigator 웹 브라우저에서 나온 오픈소스 프로젝트 이름이에요.
- 1998년, Netscape는 브라우저 소스 코드를 공개하면서 Mozilla 프로젝트를 시작함 → 브라우저 개발용 오픈소스 커뮤니티
2️⃣ 파이어폭스(Firefox)의 탄생
- Mozilla 프로젝트 안에서 Netscape 후속 브라우저를 개발하다가, 2004년에 Firefox 1.0 출시
- 즉, Mozilla 프로젝트 → Firefox 브라우저가 나온 것
- Firefox는 Mozilla 커뮤니티의 상징적 결과물 중 하나
3️⃣ User-Agent에서 Mozilla/5.0 의미
- User-Agent 문자열의 “Mozilla/5.0”은 Netscape 시절 호환성 때문에 지금까지 남아 있음
- 사실상 현대 브라우저(Chrome, Edge, Firefox, Safari 등) 거의 모두 Mozilla/5.0을 포함함
실제 Firefox 브라우저라는 의미는 아님, 그냥 역사적 호환성 표기
✅ 정리
- Mozilla ≠ Firefox (Mozilla = 오픈소스 프로젝트, Firefox = 브라우저)
- User-Agent의 Mozilla/5.0 = 역사적 관습, 호환성 표기
- Chrome, Edge, Safari 등도 User-Agent에 Mozilla/5.0 포함
- (Windows NT 10.0; Win64; x64)
- 괄호 안은 운영체제(OS)와 아키텍처 정보
- Windows NT 10.0 → Windows 10
- Win64 → 64비트 윈도우
- x64 → CPU 아키텍처가 x64 기반
- 괄호 안은 운영체제(OS)와 아키텍처 정보
🔎 NT의 의미
- NT = New Technology
- 원래는 마이크로소프트가 1993년에 내놓은 Windows NT라는 운영체제 라인업 이름이에요.
- 이 NT 계열은 기업용, 서버용으로 시작했는데 → 나중에는 모든 최신 Windows 운영체제(2000, XP, Vista, 7, 8, 10, 11)가 전부 NT 기반이 됨.
- 즉, 지금 우리가 쓰는 Windows 10, Windows 11도 사실 내부적으로는 Windows NT 커널 위에서 동작합니다.
📌 "Windows NT 10.0"이 User-Agent에 나타나는 이유
- User-Agent는 OS 버전을 커널 버전 기준으로 표시합니다.
- Windows 10 = NT 커널 버전 10.0
- Windows 7 = NT 6.1
- Windows 8.1 = NT 6.3
(마이크로소프트가 버전 명명 방식을 바꿔서, 실제 제품명과 NT 커널 버전은 다를 때가 많아요.)
✅ 정리
- NT = New Technology (Windows NT 계열을 뜻함)
- "Windows NT 10.0" = NT 커널 버전 10.0을 사용하는 Windows OS, 즉 Windows 10
- 따라서 User-Agent에 "NT"가 붙어 있는 건, 현재 윈도우가 NT 커널 기반임을 나타내는 표기예요.
"커널(kernel)"은 운영체제를 이해하는 데 핵심 개념입니다.
🔎 커널(Kernel)이란?
- 운영체제(OS)의 핵심 부분이자 심장/뇌 역할을 하는 소프트웨어
- 하드웨어(CPU, 메모리, 디스크, 네트워크 장치) ~ 응용 프로그램(앱, 브라우저, 게임) 사이에서 중간 다리 역할
즉, 프로그램이 직접 하드웨어를 건드리지 않고, 커널을 통해 안전하게 자원을 사용하게 해 줍니다.
⚙️ 커널의 주요 역할
- 프로세스 관리
- 프로그램(프로세스) 실행/중단, CPU 시간 분배(스케줄링)
- 메모리 관리
- RAM 공간 할당/해제, 메모리 보호 (한 프로그램이 다른 프로그램 메모리 침범 못 하게)
- 파일 시스템 관리
- HDD/SSD 읽기·쓰기 요청 처리
- 응용 프로그램은 "파일 열기/쓰기"만 요청하면 되고, 커널이 실제 하드웨어 동작을 제어
- 디바이스 I/O 관리
- 키보드, 마우스, 네트워크, 그래픽카드 같은 하드웨어 접근 제어
- 보안/권한 관리
- 사용자 권한, 시스템 자원 접근 제어
🖼️ 비유
- 하드웨어 = 공장 기계
- 응용 프로그램 = 기계를 쓰고 싶은 직원
- 커널 = 공장 관리자
- 직원이 직접 기계를 만지면 위험하니까,
- “나 이거 작업하고 싶어요”라고 요청 → 관리자가 대신 안전하게 기계 돌려줌
📌 Windows NT 커널
- Windows 2000 이후부터 현재 Windows 11까지 전부 NT 커널 기반
- 안정성과 보안성을 강화하기 위해 처음부터 설계된 "뉴 테크놀로지" 커널
✅ 정리
- 커널 = 운영체제의 핵심, 하드웨어와 소프트웨어를 이어주는 다리
- 프로그램이 안전하게 CPU, 메모리, 디스크, 네트워크를 쓰도록 관리
- Windows 10/11의 “Windows NT” = NT 커널 기반 운영체제라는 의미
64비트 윈도우"가 헷갈릴 만해요. 정리해보면, 이건 운영체제(OS)와 CPU 아키텍처가 연결되는 개념이에요.
1️⃣ CPU 아키텍처와 비트수
- CPU 아키텍처 = CPU가 이해하는 명령어 체계 (x86, x64, ARM 등)
- 비트수(32비트/64비트) = CPU가 한 번에 처리할 수 있는 데이터 폭과 레지스터 크기
- 32비트 CPU → 메모리 주소 공간 최대 약 4GB
- 64비트 CPU → 훨씬 큰 주소 공간 (이론상 16EB)
2️⃣ 운영체제(OS)의 비트수
- 운영체제도 CPU 아키텍처에 맞춰 빌드됩니다.
- 32비트 CPU → 32비트 OS만 실행 가능
- 64비트 CPU → 32비트 OS, 64비트 OS 둘 다 실행 가능 (호환 모드 지원)
- "윈도우 64비트" = 64비트 CPU 아키텍처(x64)에 맞춰 컴파일된 윈도우 운영체제
3️⃣ "64비트 윈도우"란?
- 정확히는 64비트 CPU(x64) 위에서 실행되는 64비트 버전의 Windows OS
- 즉,
단순히 하드웨어만가리키는 것도 아니고,단순히 OS만가리키는 것도 아니고:
→ CPU 아키텍처 + 거기에 맞는 OS 조합을 의미
4️⃣ 예시
- Windows 10 64비트
- CPU: x64 (64비트 아키텍처)
- OS: Windows 10, 64비트 에디션
- 특징: 32비트 프로그램도 실행 가능(호환 모드), 하지만 32비트 OS보다 훨씬 많은 메모리 사용 가능
✅ 정리
- CPU 아키텍처(하드웨어) → 32비트냐 64비트냐 결정
- 운영체제(OS) → CPU 아키텍처에 맞춰 설치되는 소프트웨어
- "64비트 윈도우" = 64비트 CPU 아키텍처에서 실행되는 64비트 버전의 윈도우 OS
- Chrome/118.0
- 실제 브라우저 이름과 버전
- 여기서는 Google Chrome 118.0 버전
- Safari/537.36
- WebKit 기반 브라우저와의 호환성을 표시하는 부분
- 크롬은 실제로는 Blink 엔진을 쓰지만, Safari(WebKit)와 호환되도록 Safari/xxx를 넣음
- 537.36은 WebKit 엔진 버전 번호에 해당
📌 왜 이렇게 복잡해?
- 역사적인 이유: 옛날 웹사이트들은 User-Agent 문자열을 보고 특정 브라우저 전용 코드를 실행했어요.
- 그래서 브라우저 개발자들은 “나도 Mozilla처럼 보여야 호환된다” → 전부 Mozilla/5.0 넣어버림.
- 결과적으로 지금 User-Agent는 실제 정보 + 호환성 가짜 정보가 섞여 있는 상태예요.
✅ 요약
- Mozilla/5.0 → 역사적 호환성 토큰 (사실상 의미 없음)
- Windows NT 10.0; Win64; x64 → OS와 CPU 아키텍처
- Chrome/118.0 → 브라우저 이름과 버전
- Safari/537.36 → 엔진(WebKit) 호환성 표기
1️⃣ CPU 아키텍처
- CPU 아키텍처(Instruction Set Architecture, ISA) = CPU가 이해할 수 있는 명령어 체계와 구조
- 예시:
- x86 (32비트) → 오래된 인텔/AMD CPU
- x64 (또는 x86-64, 64비트) → 현대적인 인텔/AMD CPU
- ARM → 스마트폰, 태블릿, 최근 애플 M1/M2/M3 칩에도 쓰임
- 브라우저(User-Agent)는 이 정보를 서버에 알려서, 서버가 CPU에 맞는 실행 파일이나 최적화된 코드를 내려줄 수 있도록 돕습니다.
2️⃣ WebKit 기반 브라우저
- WebKit = 웹 브라우저의 렌더링 엔진(HTML, CSS, JS를 해석해서 화면에 그려주는 핵심)
- 원래 Apple이 개발했고, 현재도 Safari는 WebKit 엔진을 사용합니다.
- WebKit 기반 브라우저 = WebKit을 엔진으로 쓰는 브라우저
- 예: Safari, 구(舊) 크롬(28버전까지), iOS 모든 브라우저(애플 정책 때문에 전부 WebKit 강제 사용)
3️⃣ 크롬의 기반 브라우저 엔진
- 구글 크롬은 초창기(2008~2013)는 WebKit을 기반으로 했지만, 이후 갈라져 나와서:
- 현재는 Blink라는 엔진을 사용 (WebKit에서 포크한 프로젝트)
- 그리고 자바스크립트 실행 엔진은 V8을 사용합니다.
- HTML/CSS → Blink
- JavaScript → V8
✅ 정리
- CPU 아키텍처 = CPU가 이해하는 명령어 집합 (x64, ARM 등)
- WebKit 기반 브라우저 = WebKit 엔진을 사용하는 브라우저 (Safari, iOS 브라우저)
- 크롬 = 현재는 Blink(렌더링 엔진) + V8(JS 엔진) 기반
렌더링 엔진(Rendering Engine) 과 자바스크립트 엔진(JavaScript Engine) 은 역할이 다르고,
WebKit·Blink 같은 렌더링 엔진도 사실상 내부적으로 JS 엔진을 "따로 붙여서" 사용합니다.
1️⃣ iOS 모든 브라우저 = 전부 WebKit 강제
애플 정책 때문에, iOS에서는 Safari 말고도 크롬, 파이어폭스, 오페라 같은 브라우저 앱이 겉모습만 다르고 실제 내부 엔진은 전부 WebKit을 씁니다.
- 예: iOS 크롬 앱 = UI는 구글이 만든 크롬처럼 보이지만, 내부 엔진은 WebKit (Safari와 동일)
- 그래서 iOS 크롬/파이어폭스도 사실상 Safari 엔진이에요.
2️⃣ 렌더링 엔진과 자바스크립트 엔진의 역할 분리
브라우저 내부 구조를 나눠보면:
- 렌더링 엔진(Rendering Engine)
- HTML, CSS 파싱 → DOM, CSSOM 생성
- 레이아웃 계산, 화면 그리기(렌더링)
- JS 실행이 필요한 경우, JS 엔진에 실행을 “위임”
- 자바스크립트 엔진(JavaScript Engine)
- JS 코드를 해석/실행
- 브라우저와 연결되어 DOM 조작, 이벤트 처리 가능
3️⃣ 엔진 조합 사례
- Chrome
- 렌더링 엔진: Blink
- JS 엔진: V8
- Safari (WebKit)
- 렌더링 엔진: WebKit
- JS 엔진: JavaScriptCore (또는 Nitro) ← WebKit 안에 포함되어 있지만 사실상 별도 모듈
- Firefox
- 렌더링 엔진: Gecko
- JS 엔진: SpiderMonkey
4️⃣ 정리
- WebKit도 HTML/CSS만 하는 게 아니라, 자바스크립트 엔진(JavaScriptCore) 를 별도로 가지고 있습니다.
- 크롬이 Blink + V8 조합인 것처럼, Safari는 WebKit + JavaScriptCore 조합이에요.
- 즉, “렌더링 엔진이 HTML/CSS/JS 3개를 모두 해석한다”는 건 관습적으로 뭉뚱그려 말하는 거고, 실제로는 JS 실행은 항상 별도 자바스크립트 엔진이 담당합니다.
1️⃣ HTTP 요청 시작줄(Start Line) 구조
HTTP 요청의 시작줄은 일반적으로 이렇게 생겼어요:
<메서드> <경로> <HTTP 버전>
예시:
GET /index.html HTTP/1.1
1) 메서드(Method)
- GET → 서버에서 리소스(파일, 페이지 등)를 가져오라는 요청
- 다른 예시:
- POST → 서버에 데이터 전송
- PUT → 서버 리소스 업데이트
- DELETE → 서버 리소스 삭제
2) 경로(Path)
- /index.html → 요청하고 싶은 리소스의 경로
- 전체 URL이 아니라 도메인 이후 경로만 나타냄
- 실제 전체 URL은 요청 헤더 Host와 결합해서 결정됨:
Host: www.example.com
GET /index.html HTTP/1.1
- 실제 요청 대상: http://www.example.com/index.html
3) HTTP 버전
- HTTP/1.1 → 이 요청이 HTTP 프로토콜 버전 1.1을 따른다는 의미
- 이유: 서버와 클라이언트가 서로 어떤 규칙을 따르는지 명시해야 함
HTTP 버전 특징
| 버전 | 특징 |
| HTTP/1.0 | 각 요청마다 TCP 연결 종료 / 상태 없음 |
| HTTP/1.1 | 연결 재사용 가능(Keep-Alive) / Host 헤더 필수, 상태 없는 기본 특성 유지 |
| HTTP/2 | 바이너리 프레이밍, 멀티플렉싱 지원, 헤더 압축 |
| HTTP/3 | QUIC 기반, UDP 위에서 빠른 전송 |
- 버전이 다르면 요청/응답 규칙이 달라지기 때문에 명시해야 함
✅ 정리
- GET → 요청 방식
- /index.html → 요청 경로 (Host와 결합해서 전체 URL 구성)
- HTTP/1.1 → 클라이언트가 따르는 HTTP 규칙 버전
- Host 헤더가 실제 서버 도메인 역할을 함
HTTP 버전이 여러 개인데, 왜 아직도 HTTP/1.1이 많이 보이는지 헷갈릴 수 있죠. 하나씩 설명할게요.
1️⃣ HTTP 버전별 특징
| 버전 | 특징 |
| HTTP/1.0 | - 요청마다 TCP 연결 종료 - Host 헤더 없으면 가상호스팅 불가 - 상태 없는 프로토콜 |
| HTTP/1.1 | - 연결 재사용 가능(Keep-Alive) - Host 헤더 필수 - 파이프라이닝 가능(한 연결로 여러 요청) |
| HTTP/2 | - 바이너리 프로토콜로 전환 - 멀티플렉싱 지원(한 연결로 동시 다중 요청) - 헤더 압축 가능 |
| HTTP/3 | - TCP 대신 QUIC/UDP 사용 - 지연(latency) 최소화 - 연결 재설정 시 빠른 재접속 가능 |
2️⃣ 왜 User-Agent나 예시에서 아직도 HTTP/1.1인가?
- 호환성
- HTTP/1.1은 거의 모든 클라이언트와 서버가 지원
- HTTP/2/3은 일부 환경에서만 지원, 아직 전 세계 모든 서버에서 기본은 아님
- 자동 협상(Negotiation)
- 클라이언트와 서버가 연결 시 ALPN(Application-Layer Protocol Negotiation)을 통해 최신 버전 사용 여부 결정
- 그래서 브라우저나 curl로 요청 보면 기본적으로 HTTP/1.1이라고 나올 수 있음
- 실제 사용 비율
- HTTP/2는 점점 보급 중, 특히 HTTPS 환경에서 활발
- HTTP/3는 최신 브라우저, 일부 서버에서만 활성화 (특히 CDN이나 대형 서비스)
3️⃣ 실제로는?
- 현대 브라우저 대부분:
- HTTPS 요청 시 → HTTP/2 우선 사용
- HTTP/2 미지원 서버 → HTTP/1.1 fallback
- HTTP/3는 QUIC 지원 서버/브라우저에서만
- 즉, HTTP/1.1은 기본 안전 장치이자 호환성용,
실제 네트워크 트래픽은 HTTPS에서 HTTP/2 혹은 HTTP/3이 많이 쓰임
✅ 정리
- HTTP/1.1 → 가장 널리 지원, 안정적
- HTTP/2 → 성능 개선, HTTPS와 함께 주로 사용
- HTTP/3 → 최신, QUIC 기반, 점점 보급 중
- User-Agent 예시에서 1.1이 뜨는 건 기본 요청 헤더에서 호환성을 위해 표기된 것
브라우저가 서버에 요청하는 방식은 꼭 HTTP만 있는 건 아니에요. 상황에 따라 달라집니다. 😄
1️⃣ 일반적인 웹사이트 접속
- 우리가 주소창에 https://www.example.com 입력 → 서버로 보내는 요청 대부분 HTTP/HTTPS 프로토콜
- 브라우저가 **HTTP 요청(Request)**을 만들어 서버에 전송
- 서버가 **HTTP 응답(Response)**을 내려주면, 브라우저가 렌더링
예시
GET /index.html HTTP/1.1
Host: www.example.com
2️⃣ 예외적인 경우
- WebSocket
- 브라우저가 HTTP(S)로 처음 핸드쉐이크 → 이후 TCP 기반 WebSocket 연결
- 실시간 채팅, 게임, 스트리밍 등에서 사용
- FTP, 파일 프로토콜
- 주소창에 ftp://example.com → FTP 요청
- file:// → 로컬 파일 접근
- 브라우저 확장/앱
- 브라우저 확장 프로그램이나 네이티브 앱 내 브라우저 컨트롤(WebView)은
HTTP 외에도 자체 프로토콜 사용 가능
- 브라우저 확장 프로그램이나 네이티브 앱 내 브라우저 컨트롤(WebView)은
3️⃣ 정리
- 대부분 웹사이트 접속 = HTTP/HTTPS 요청
- 단, 일부 실시간 통신(WebSocket), FTP, 로컬 파일 접근, 특수 앱 통신 등에서는 HTTP가 아닐 수도 있음
1️⃣ HTTP란?
- HyperText Transfer Protocol의 약자
- 웹 브라우저와 웹 서버 간 데이터를 주고받는 규칙(프로토콜)
- 텍스트 기반, 클라이언트-서버 구조
2️⃣ 특징
- 무상태(stateless)
- HTTP는 요청마다 독립적
- 서버가 이전 요청 정보를 기억하지 않음 → 로그인, 장바구니 등은 쿠키/세션/토큰 필요
- 클라이언트-서버 구조
- 클라이언트(브라우저) → 서버(웹 서버)에 요청(Request)
- 서버 → 클라이언트에 응답(Response)
- 확장성 있음
- 요청/응답 헤더를 통해 다양한 메타정보 전달 가능
3️⃣ HTTP 요청(Request)
- 구성: 시작줄(Start Line) + 헤더(Header) + 본문(Body)
- 시작줄 예시
GET /index.html HTTP/1.1
- GET → 메서드 (요청 방식)
- /index.html → 경로
- HTTP/1.1 → 프로토콜 버전
- 헤더
- Host, User-Agent, Cookie 등
- 본문
- POST, PUT 같은 요청에서 데이터 포함
4️⃣ HTTP 응답(Response)
- 구성: 상태줄(Status Line) + 헤더 + 본문
- 예시:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 3057
<html> ... </html>
- 200 OK → 상태 코드와 메시지
- 헤더 → 서버 정보, 본문 길이, 타입 등
- 본문 → HTML, JSON, 이미지 등 실제 데이터
5️⃣ HTTP 버전
| 버전 | 특징 |
| HTTP/1.0 | 요청마다 연결 종료 |
| HTTP/1.1 | 연결 재사용(Keep-Alive), Host 필수, 상태 없음 |
| HTTP/2 | 바이너리 프레이밍, 멀티플렉싱, 헤더 압축 |
| HTTP/3 | QUIC/UDP 기반, 낮은 지연, 빠른 재접속 |
6️⃣ HTTPS
- HTTP + SSL/TLS 암호화
- URL 앞에 https://
- 데이터 암호화 → 안전한 로그인, 결제 등 가능
7️⃣ 정리
- HTTP = 웹에서 클라이언트와 서버가 데이터를 주고받는 규칙
- 특징: 무상태, 텍스트 기반, 클라이언트-서버 구조
- 요청(Request)과 응답(Response)으로 이루어짐
- HTTPS = HTTP + 암호화
1️⃣ Server 헤더
- Server 헤더는 웹 서버 소프트웨어 정보를 알려주는 헤더
- 예시:
Server: Apache/2.4.41 (Ubuntu)
- Apache 웹 서버, 버전 2.4.41, 운영체제 Ubuntu 사용
- 용도:
- 서버 관리자가 문제 디버깅 시 참고
- 클라이언트(브라우저)가 최적화할 때 참고 가능
- 보안상 이유로 일부 사이트는 서버 정보를 숨기거나 변경하기도 함
2️⃣ HTTP 상태 코드와 상태 메시지
HTTP 응답 시작줄 예시:
HTTP/1.1 200 OK
- 200 → 상태 코드(Status Code)
- OK → 상태 메시지(Reason Phrase / Status Message)
상태 코드 종류
- 1xx (정보)
- 요청을 받았고 처리 중임을 알림
- 예: 100 Continue
- 2xx (성공)
- 요청 성공
- 예:
- 200 OK → 요청 성공, 정상 응답
- 201 Created → 리소스 생성 성공
- 3xx (리다이렉션)
- 클라이언트를 다른 URL로 안내
- 예:
- 301 Moved Permanently → 영구 이동
- 302 Found → 임시 이동
- 4xx (클라이언트 오류)
- 요청이 잘못됨
- 예:
- 400 Bad Request → 잘못된 요청
- 401 Unauthorized → 인증 필요
- 403 Forbidden → 접근 금지
- 404 Not Found → 리소스 없음
- 5xx (서버 오류)
- 서버가 처리 중 문제 발생
- 예:
- 500 Internal Server Error → 서버 내부에서 오류 발생 (요청 처리 실패)
- 502 Bad Gateway → 게이트웨이 또는 프록시 서버가 잘못된 응답을 받음
- 503 Service Unavailable → 서버가 일시적으로 사용 불가 (과부하, 유지보수 등)
- 504 Gateway Timeout → 게이트웨이 또는 프록시 서버가 시간 내에 응답 못 받음
3️⃣ 상태 메시지와 코드의 관계
- 상태 메시지는 상태 코드와 항상 세트
- HTTP 응답 시작줄에서 항상 같이 표시
- 예: 404 Not Found, 200 OK
- 메시지는 서버가 바꿀 수도 있음
- 표준 메시지를 쓰기도 하고, 커스텀 메시지 가능
- 클라이언트는 숫자 코드를 기준으로 처리하므로, 메시지는 참고용
✅ 정리
- Server 헤더 → 서버 소프트웨어 종류와 버전
- 상태 코드 + 상태 메시지 → 응답 상태 알림, 메시지는 코드와 함께 다님
- 상태 코드 종류: 1xx(정보), 2xx(성공), 3xx(리다이렉션), 4xx(클라이언트 오류), 5xx(서버 오류)
'네트워크2' 카테고리의 다른 글
| 클라이언트 오류 코드 :: 4xx (0) | 2025.10.07 |
|---|---|
| 요청 성공 상태 코드 2xx (0) | 2025.10.07 |
| XML vs HTML 차이점 비교 :: HyperText 란? Markup 이란? (0) | 2025.10.07 |
| 네트워크 탭에서 내가 보낸 요청 확인 방법 (0) | 2025.10.07 |
| 쿠키(Cookie) 와 세션(Sessoion) (0) | 2025.10.07 |
| CSRF 란? :: 쿠키 종류(세션 쿠키 vs 영속 쿠키) :: 쿠키 속성 Domain, Path, SameSite, HttpOnly, Expires/Max-Age (0) | 2025.10.07 |
| HTTP 요청/응답 (서버와 통신) :: XHR vs fetch vs Axios (0) | 2025.10.04 |
| 브라우저 업로드 진행률 표시 XHR / fetch :: 콜백 vs Promise, async/await (0) | 2025.10.04 |