1. 라이브러리
  2. HTTP와 웹
  3. HTTP 기본 원리

업데이트됨 1개월 전

웹은 대화입니다. 당신이 지금까지 본 모든 페이지는 브라우저가 질문을 던지고 서버가 그에 답하면서 시작되었습니다.

그 대화는 하나의 프로토콜을 따릅니다—웹 페이지, 이미지, 동영상, 데이터를 주고받기 위해 브라우저와 서버가 사용하는 언어, HTTP(HyperText Transfer Protocol)입니다. HTTP를 이해한다는 것은 웹이 실제로 어떻게 작동하는지를 이해한다는 뜻입니다. 마법이 아니라, 하루에 수십억 번 반복되는 놀랍도록 단순한 대화로요.

HTTP가 실제로 하는 일

HTTP는 무언가를 요청하는 방법과 응답하는 방법을 정의합니다. 그게 전부입니다. 클라이언트(브라우저)가 요청을 보냅니다: "/about 페이지를 주세요." 서버가 응답합니다: "여기 있습니다" 또는 "찾을 수 없습니다" 또는 "이 페이지를 볼 권한이 없습니다."

팀 버너스리는 1989년 월드 와이드 웹의 일부로 HTTP를 만들었습니다. 프로토콜은 여러 버전을 거치며 발전했지만, 핵심은 변하지 않았습니다: 요청, 응답, 완료.

HTTP는 TCP 위에서 실행됩니다. TCP는 인터넷을 통해 데이터를 실제로 전달하는 복잡한 작업을 처리합니다. TLS 암호화를 추가하면 HTTP는 HTTPS가 됩니다—도청자로부터 통신을 보호하는 보안 버전입니다. 하지만 대화 자체는 동일하게 유지됩니다.

요청의 구조

링크를 클릭하면, 브라우저는 세 부분으로 구성된 HTTP 요청을 만듭니다:

요청 줄은 원하는 것을 명시합니다: 메서드(무언가를 가져오는 GET, 무언가를 전송하는 POST), 경로(/products/shoes), HTTP 버전.

헤더는 맥락을 제공합니다: 브라우저가 이해하는 콘텐츠 유형, 선호하는 언어, 로그인 여부, 어떤 페이지에서 이 페이지로 왔는지.

본문은 무언가를 전송할 때 데이터를 담습니다—양식 제출, 파일 업로드, API 호출. GET 요청은 일반적으로 본문이 없고, POST 요청은 보통 있습니다.

실제 요청은 다음과 같이 생겼습니다:

GET /articles/http HTTP/1.1
Host: connected.app
Accept: text/html
Accept-Language: en-US

네 줄. 웹 페이지 하나를 요청하는 데 필요한 것이 전부입니다.

응답의 구조

서버의 응답은 이 구조를 반영합니다:

상태 줄은 결과를 알립니다: HTTP 버전, 세 자리 상태 코드, 사람이 읽을 수 있는 메시지. 이 코드들은 익숙하실 겁니다—200은 성공, 404는 찾을 수 없음, 500은 서버 오류를 의미합니다.

헤더는 전송될 내용을 설명합니다: 콘텐츠 유형, 크기, 캐싱 규칙, 마지막으로 수정된 시간.

본문에는 실제 콘텐츠가 담겨 있습니다—HTML, JSON, 이미지, 요청한 모든 것.

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 4523

<!DOCTYPE html>...

요청, 응답, 대화 완료.

금붕어 프로토콜

HTTP는 무상태(stateless)입니다—금붕어 같은 기억력을 가지고 있습니다. 모든 요청은 마치 처음 만나는 것처럼 도착합니다. 서버는 3초 전에 당신이 "장바구니에 추가"를 클릭했다는 것을 기억하지 못합니다.

설계 결함처럼 들릴 수 있습니다. 하지만 이건 사실 엄청난 강점입니다.

무상태성은 서버가 수백만 개의 진행 중인 대화를 추적할 필요가 없다는 것을 의미합니다. 어떤 서버든 어떤 요청이든 처리할 수 있습니다. 서버 하나가 다운되면 다른 서버가 자연스럽게 이어받습니다. 프로토콜은 단순하고, 빠르고, 확장 가능한 상태를 유지합니다.

하지만 웹은 기억이 필요합니다. 장바구니, 로그인, 환경 설정—이것들은 여러 요청에 걸쳐 당신이 누구인지 알아야 합니다. 그래서 우리는 금붕어 위에 기억을 구축했습니다:

쿠키는 서버가 브라우저에 기억해두고 이후 요청에 함께 보내달라고 요청하는 작은 데이터 조각입니다. "세션 ID를 드릴 테니, 다음 번에 포함해 주시면 당신임을 알 수 있습니다."

세션은 그 쿠키를 서버 측 저장소와 연결합니다. 쿠키는 "user-12345"라고 말하고, 서버는 user-12345의 장바구니에 무엇이 있는지 조회합니다.

토큰은 정보를 직접 인코딩하여, 서버가 아무것도 조회하지 않고도 신원을 확인할 수 있게 합니다.

HTTP는 무상태를 유지합니다. 그 위에 구축된 모든 것이 딱 필요한 만큼의 상태를 추가합니다.

메서드마다 역할이 있습니다

HTTP 메서드는 임의적이지 않습니다—각각이 명확한 의미를 담고 있습니다:

GET은 아무것도 변경하지 않고 가져옵니다. 반복해도 안전하고, 캐싱해도 안전하고, 미리 불러와도 안전합니다. 페이지를 불러올 때, 브라우저는 HTML, CSS, JavaScript, 이미지 등 표시에 필요한 모든 것에 대해 GET 요청을 보냅니다.

POST는 데이터를 제출하며 변경을 일으킬 수 있습니다. 계정 생성, 댓글 작성, 결제 처리. 무심코 반복하면 안 됩니다—POST를 새로고침하면 주문이 두 번 제출될 수 있습니다.

PUT은 리소스를 완전히 교체합니다. PATCH는 부분적으로 수정합니다. DELETE는 삭제합니다.

HEAD는 본문 없이 헤더만 요청합니다—다시 다운로드하지 않고 변경 여부를 확인하는 데 유용합니다.

OPTIONS는 허용된 메서드가 무엇인지 묻습니다—한 도메인의 JavaScript가 다른 도메인과 통신하려 할 때 중요합니다.

브라우저와 서버는 이 의미를 활용해 스마트한 결정을 내립니다. GET 응답은 적극적으로 캐시할 수 있습니다. POST 요청은 재시도 전에 확인이 필요합니다. 의미는 메서드 안에 있습니다.

기반 계층들

HTTP는 스스로 전달되지 않습니다. 메시지를 TCP에 넘기고, TCP는 이를 패킷으로 분할하여 인터넷을 통해 전송하고, 순서대로 재조립하며, 손실된 모든 것을 재전송합니다. HTTP는 쓰고 읽을 뿐이고, TCP가 여정을 처리합니다.

HTTPS의 경우, TLS가 HTTP와 TCP 사이에 위치합니다. HTTP 대화가 시작되기 전에, 클라이언트와 서버는 TLS 핸드셰이크를 수행합니다: 인증서를 통해 신원을 확인하고, 암호화 방식에 합의하고, 키를 교환합니다. 그런 다음 모든 HTTP 메시지는 TCP가 처리하기 전에 암호화되고 도착 시 복호화됩니다.

이 계층화는 우아합니다. HTTP는 대화 구조에 집중합니다. TLS는 보안을 제공합니다. TCP는 신뢰성을 보장합니다. 각 계층은 하나의 일을 잘 처리하며, 합쳐지면 어느 하나만으로는 불가능한 더 강력한 것이 됩니다.

페이지를 열면 어떤 일이 벌어질까

URL을 입력하고 Enter를 누릅니다. 다음과 같은 순서로 대화가 이루어집니다:

  1. 브라우저가 DNS에 서버의 IP 주소를 묻습니다
  2. TCP 연결을 엽니다 (HTTPS의 경우 TLS 핸드셰이크 포함)
  3. HTML 문서에 대한 GET 요청을 보냅니다
  4. 서버가 HTML로 응답합니다
  5. 브라우저가 HTML을 파싱하고 CSS, JavaScript, 이미지가 필요하다는 것을 발견합니다
  6. 각 리소스에 대해 병렬로 GET 요청을 보냅니다
  7. 응답이 도착하면 CSS를 적용하고, JavaScript를 실행하고, 이미지를 표시합니다
  8. JavaScript가 데이터를 위한 추가 요청을 트리거할 수 있습니다
  9. 페이지가 완전히 렌더링됩니다

"단순한" 웹 페이지 하나에도 50~100개의 HTTP 요청이 필요할 수 있습니다. 복잡한 웹 애플리케이션은 수백 개에 달합니다. 각각은 동일한 패턴을 따릅니다: 요청, 응답, 완료.

핵심 정리

HTTP는 대화 프로토콜입니다—클라이언트가 묻고, 서버가 답합니다. 무상태 설계는 확장성을 제공하고, 쿠키와 세션은 웹 애플리케이션에 필요한 기억을 추가합니다. 메서드는 캐싱, 보안, 최적화를 가능하게 하는 의미론적 의미를 담고 있습니다. TCP는 메시지를 안정적으로 전달하고, TLS는 안전하게 암호화합니다. 지금까지 불러온 모든 웹 페이지는 수십 개에서 수백 개의 이 단순한 교환들로 구성되었으며, 각각은 1989년부터 HTTP가 사용해온 동일한 요청-응답 패턴을 따릅니다.

이 프로토콜은 믿기 어려울 만큼 단순합니다. 바로 그 단순함이 현대 웹의 기반이 될 수 있었던 이유입니다.

HTTP에 관한 자주 묻는 질문

HTTP와 HTTPS의 차이는 무엇인가요?

HTTPS는 암호화가 추가된 HTTP입니다. 대화는 동일합니다—같은 요청, 같은 응답, 같은 메서드. 하지만 TLS가 네트워크를 통해 전송되기 전에 모든 것을 암호화하여, 도청자가 데이터를 읽거나 조작하는 것을 방지합니다. "S"는 Secure(보안)의 약자이며, 오늘날 모든 웹 트래픽의 기본값이 되어야 합니다.

왜 다른 HTTP 상태 코드를 보게 되나요?

상태 코드는 서버가 응답을 분류하는 방식입니다. 2xx 코드는 성공을 의미합니다(200 OK, 201 Created). 3xx 코드는 리다이렉션을 의미합니다(301 Moved Permanently, 304 Not Modified). 4xx 코드는 클라이언트 오류를 의미합니다—잘못된 것을 요청했습니다(400 Bad Request, 404 Not Found, 403 Forbidden). 5xx 코드는 서버 오류를 의미합니다—서버 측에서 문제가 발생했습니다(500 Internal Server Error, 503 Service Unavailable).

쿠키는 HTTP의 무상태 설계와 어떻게 작동하나요?

쿠키는 영리한 우회 방법입니다. 서버는 응답에 Set-Cookie 헤더를 보냅니다: "이 값을 기억해두세요." 브라우저는 이를 저장하고 이후 해당 서버에 대한 요청에 Cookie 헤더를 통해 포함시킵니다. HTTP는 무상태를 유지합니다—아무것도 기억하지 않습니다—하지만 쿠키는 서버가 각 요청과 함께 당신이 가져오는 ID로 당신을 인식할 수 있게 합니다.

GET과 POST의 차이는 무엇인가요?

GET은 아무것도 변경하지 않고 데이터를 가져옵니다. 요청 매개변수는 URL에 포함되고, 캐시하거나 북마크하거나 안전하게 반복할 수 있습니다. POST는 서버 상태를 변경할 수 있는 데이터를 제출합니다. 데이터는 요청 본문에 들어가며, 캐시해서는 안 되고, 반복하면 중복 작업이 발생할 수 있습니다. 읽기에는 GET, 쓰기에는 POST를 사용하세요.

이 페이지가 도움이 되었나요?

😔
🤨
😃