💡HTTP란?
➡️ HyperText Transfer Protocol의 약자로 World Wide Web(WWW,웹) 상에서 데이터를 주고받기 위한
애플리케이션 계층의 프로토콜이다.
⬆️
우리가 흔히 사용하는 웹 동작 방식이다.
📢 이제 HTTP에 대하여 본격적으로 자세히 알아보도록 하자.
HTTP의 특징
- HTTP는 클라이언트와 서버간의 요청(Request)과 응답(Response)를 통해 작동한다.
- HTTP는 다양한 종류의 데이터(html,css,JavaScript,png,mp4등)을 전송하기 위해 설계된 프로토콜이다.
- 일반적으로 TCP/IP 통신 프로토콜을 기반으로 동작한다.
맨 처음에 HTTP는 애플리케이션 계층에서 사용되는 프로토콜이라고 설명하였는데 이 계층 부분에 대해서 조금만 알고가면 이해가 훨씬 더 쉬울것이다.
좌측의 보이는 7계층이 OSI 표준모델이며 우측의 4계층이 TCP/IP 모델이다. 애플리케이션 계층의 역할은 최상위 계층으로 사용자 또는 애플리케이션이 네트워크에 접속 할 수 있게 해주는 계층이다.
✅ 애플리케이션의 예시) 페이스북,인스타그램,당근마켓 등
쉽게 얘기하면 사용자가 웹,이메일, 파일 공유 등 실제로 사용하는 것들을 체감할 수 있는 서비스를 제공하는 계층인데, 이 계층에 속한 프로토콜들로 인해 통신할 수 있게 된다.
✅ 관련 프로토콜) HTTP,SMTP,FTP,SSH,DNS 등등
- HTTP는 OSI 7계층 중 애플리케이션 계층에 해당하는 프로토콜이다.
- 웹 브라우저와 웹 서버 간에 데이터를 주고받을 때 쓰인다. 예: GET, POST, PUT, DELETE
🤔 하지만 계층을 보다보니 이런 의문점이 생길 수 있다. OSI 모델에서 5,6,7계층에서는 HTTP를 사용하지 않나..?
❓ 그런데 왜 HTTP는 TCP/IP 기반이라고도 할까?
- OSI 7계층은 이론적인 모델이고,
- 실제 인터넷에서 사용되는 건 TCP/IP 모델이다.
💡 HTTP는 실제로는 TCP/IP 프로토콜 스택 위에서 동작한다. 보통 이렇게 동작한다
[HTTP] → [TCP] → [IP] → [물리 네트워크]
- HTTP (7계층, 애플리케이션 계층)
- TCP (4계층, 전송 계층): 신뢰성 있는 전송을 보장
- IP (3계층, 네트워크 계층): 패킷을 목적지로 라우팅
📢 요약
- HTTP는 OSI 7계층 중 애플리케이션 계층의 프로토콜이다.
- HTTP는 데이터를 전송할 때, 실제로는 TCP/IP 위에서 동작한다.
- 따라서 HTTP는 TCP/IP 기반으로 동작한다는 말은 물리적 전송 경로의 의미이고
HTTP는 애플리케이션 계층 프로토콜이다는 구조적인 관점을 말하는 것이다.
⌛ HTTP의 변화
- HTTP는 통신을 할 때 데이터를 평문(비암호화 정보)으로 전송하게 되는데 이 과정중에 도청이나 데이터 변조의 위험이 있다.
- 중간에서 패킷을 가로채서 중요한 정보를 탈취하거나 필요에 따라 수정이 가능하므로 보안에 취약하다.
- 이러한 단점들을 보완하기 위해 나온것이 HTTPS(HyperText Transfer Protocol Secure)이다.
❓ HTTPS란?
➡️ HTTP의 보안 버전으로, 웹 브라우저와 웹사이트 간의 통신을 암호화하여 데이터를 안전하게 전송하는 프로토콜이다.
이는 사용자가 은행 계좌, 이메일 서비스, 의료 보험 공급자에 로그인하는 등 중요한 데이터를 전송할 때 특히 중요하다.
- 데이터 암호화:
SSL/TLS 또는 TLS 프로토콜을 사용하여 데이터를 암호화하여 전송한다. - 서버 진위 확인:
서버의 신뢰성을 확인하여 가짜 웹사이트 접속을 방지해준다.
💡 크롬 등 최신 웹 브라우저에서는 HTTPS를 사용하지 않는 웹 사이트가 HTTPS를 사용하는 웹 사이트와 다르게 표시된다. URL 표시줄에서 웹 페이지가 안전함을 나타내는 녹색 자물쇠를 찾는것이 안전하다고 한다. 웹 브라우저는 HTTPS를 중시하여 Google Chrome 및 기타 브라우저에서는 HTTPS가 아닌 모든 웹 사이트는 안전하지 않은 것으로 표시된다.
이제 구체적인 HTTP의 동작과정을 알아보자.
💡 HTTP의 동작 방식, 실제로는 이렇게 흘러간다
웹에서 우리가 주소창에 어떤 URL을 입력했을 때, 단순히 페이지가 뜨는 것처럼 보이지만, 보이지 않는 곳에서 여러 통신 과정이 순차적으로 진행되고 있다.
HTTP는 이런 통신의 가장 윗단에서 동작하는 프로토콜로, 웹의 모든 데이터 주고받기에서 중심 역할을 한다.
아래는 HTTP 통신이 실제로 어떻게 동작하는지, 흐름에 따라 자세히 정리한 것이다.
1. HTTP 요청을 위한 첫 준비 – DNS 조회
사용자가 브라우저에 https://www.naver.com 같은 주소를 입력하면, 브라우저는 먼저 이 주소가 가리키는 웹 서버의 IP 주소가 무엇인지 알아야 한다.
이를 위해 DNS(Domain Name System)에 요청을 보내어 www.naver.com에 해당하는 IP 주소(예: 203.0.113.10)를 알아낸다.
👉 이 단계는 전화번호부에서 상대방 번호를 찾는 과정과 유사하다.
2. TCP 연결 – 3-Way Handshake
IP 주소를 얻었으면, 이제 본격적으로 서버와 연결을 맺기 위해 TCP 통신을 시작한다.
HTTP는 데이터를 전달하기 위해 TCP(Transmission Control Protocol) 위에서 동작한다.
TCP는 신뢰성을 보장하는 연결 지향형 프로토콜이며, 연결을 맺을 때는 3-way Handshake라는 과정을 거친다.
🔄 3-way Handshake 과정은 다음과 같다:
- 클라이언트 → 서버: SYN 패킷 전송 (연결 요청)
- 서버 → 클라이언트: SYN + ACK 응답 (요청 수락 + 서버도 요청)
- 클라이언트 → 서버: ACK 전송 (서버 요청 수락)
이 과정을 통해 양측은 서로 데이터를 안전하게 주고받을 준비가 완료되었음을 확인하게 된다.
3. HTTP 요청(Request) – 리소스를 달라는 메시지
TCP 연결이 성공하면, 이제 HTTP 프로토콜의 출발점인 요청(Request)을 보낸다.
예를 들어 사용자가 웹 브라우저에서 페이지를 열려고 할 때, 브라우저는 다음과 같은 요청을 보낸다:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Chrome/120
Accept: text/html
- GET: 리소스를 요청하는 방식
- /index.html: 요청 대상 경로
- Host: 어느 사이트인지 지정
- 기타 정보: 브라우저 종류, 허용하는 파일 형식 등
➡️ 이 코드들은 HTTP 요청 메시지의 시작줄 + 헤더들이다.
❓이 코드들이 무엇일까?
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Chrome/120
Accept: text/html
이건 HTTP 요청 메시지의 시작줄 + 헤더들이다.
🧬 HTTP 요청 메시지 전체 구조
HTTP 요청은 다음과 같은 구조로 되어 있다.
[1] 요청 시작줄 (Request Line)
[2] 요청 헤더들 (Request Headers)
[3] 요청 본문 (Request Body) ← POST 요청일 때 주로 사용됨
🔹 GET /index.html HTTP/1.1
→ 이건 요청 시작줄(Request Line)이다.
- GET: 요청 방식 (리소스를 가져온다)
- /index.html: 요청할 리소스 경로
- HTTP/1.1: 사용하는 HTTP 버전
이 주소에 있는 HTML 파일 좀 주세요 라는 의미다.
🔹 Host: www.example.com
- HTTP/1.1부터는 Host 헤더가 필수야.
- 어떤 도메인으로 요청하는지 명시한다.
- 하나의 서버(IP)에서 여러 사이트(도메인)를 운영할 수 있기 때문에, 이 헤더로 구분해줘야 해.
🔹 User-Agent: Chrome/120
- 클라이언트(브라우저)의 정보이다.
- 서버는 이걸 보고 이 브라우저는 크롬이네? 버전은 120이구나. 하고 판단할 수 있다.
- 어떤 기기나 브라우저인지에 따라 응답을 다르게 줄 수도 있다.
🔹 Accept: text/html
- 클라이언트가 어떤 형태의 데이터를 받아들일 수 있는지 알려줘라는 뜻이다.
- 여기선 나는 text/html 형식(HTML)을 받을 수 있어요 라는 뜻이다.
- 이미지라면 image/*, JSON이면 application/json 같은 것도 올 수 있다.
✅ 이건 요청 헤더다 (서버로 보내는 정보)
즉, 이 코드는 클라이언트가 서버로 리소스를 요청할 때 보낸 메시지의 헤더 부분이고,
서버는 이 요청을 보고 아 이걸 원하는구나 하고 응답을 보내주는 것이다.
🔁 이 요청 메시지 → 서버에서 확인 가능
Node.js, Java, Python 같은 서버 언어에서는 이 요청 헤더를 분석해서 처리하게 된다고 한다.
4. 서버의 처리 – 요청 분석 & 응답 생성
서버는 요청을 받으면,
- 요청한 리소스가 존재하는지 확인하고
- 클라이언트가 접근 가능한지 판단한 뒤
- 적절한 HTTP 응답(Response)을 만들어 보낸다.
예를 들어 요청이 정상적이라면 다음과 같은 응답이 온다:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 2048
<html>
<body>웹페이지 내용</body>
</html>
- 200 OK: 요청이 성공적으로 처리되었음을 의미
- Content-Type: 보내는 데이터가 HTML임을 의미
- 본문(Body): 실제 웹페이지 내용
반면, 리소스가 없으면 404 Not Found, 권한이 없으면 403 Forbidden과 같은 응답이 온다.
5. 브라우저가 응답 수신 & 렌더링
브라우저는 서버로부터 응답을 받으면,
- 먼저 HTTP 응답 헤더를 분석하고,
- 응답 본문에 포함된 HTML을 파싱한 뒤,
- 필요하다면 CSS, JS, 이미지 등을 추가로 HTTP 요청을 보내 받아온다.
그리고 최종적으로 이를 조합해 사용자의 화면에 웹페이지를 렌더링(rendering)한다.
👉 우리가 보는 웹페이지는 사실 여러 개의 HTTP 요청과 응답이 모여 완성된 결과물이다.
6. 연결 종료 – 혹은 유지
HTTP/1.0에서는 한 번 요청하고 응답이 끝나면 TCP 연결을 끊었다.
하지만 HTTP/1.1부터는 Connection: keep-alive를 기본으로 사용하여, 여러 요청을 하나의 TCP 연결로 처리할 수 있게 되었다.
이후 필요가 없다면 연결을 명시적으로 끊을 수도 있다.
📌 HTTPS의 경우는?
HTTPS는 HTTP의 동작 방식과 거의 동일하지만, 한 가지 중요한 차이점이 있다.
바로 데이터가 TLS(보안 계층)로 암호화되어 전송된다는 점이다.
HTTPS는 HTTP 전에 먼저 TLS 핸드셰이크를 통해 암호화 키를 교환한 후, 이후의 HTTP 요청과 응답을 암호화된 형태로 주고받는다. 이렇게 하면 중간에서 누가 가로채도 내용을 볼 수 없게 된다.
✅ 정리
- HTTP는 클라이언트-서버 간 통신을 위한 프로토콜로, TCP/IP 기반 위에서 동작한다.
- 통신은 DNS → TCP 3-way Handshake → HTTP 요청 → 응답 → 렌더링의 순서로 흐른다.
- HTTP는 기본적으로 **Stateless(비연결성)**이며, 필요한 리소스를 요청하고 응답받는 구조이다.
이런 흐름을 이해하면, 단순히 주소를 쳤더니 페이지가 떴다 이상의 것을 알 수 있게 된다.
그래서 브라우저의 개발자 도구(F12 → Network 탭)를 보면, 실제 이 통신 흐름을 직접 확인해볼 수도 있다.