본문 바로가기
Web

[Web] HTTP 기본 개념 정리 - 웹 통신의 구조와 흐름

by niahh 2025. 5. 11.

HTTP (HyperText Transfer Protocol)란?

HTTP는 웹에서 클라이언트(보통 브라우저)와 서버 간에 데이터를 주고받기 위한 통신 규약이다. 

간단하게, 웹에서 클라이언트가 '이 웹페이지 줘!' 라고 말하면 '여기 있어'라는 대화를 정해진 방식으로 하는 약속이다. 

 

이 공통된 약속 때문에 전 세계 웹 브라우저와 서버가 서로 정보를 주고 받을 수 있다.

기본 용어 

 

  • 클라이언트: 요청하는 쪽 (브라우저, 앱 등)
  • 서버: 응답해주는 쪽 (웹 서버, API 서버 등)
  • 요청(Request): 브라우저가 "이 데이터 줘!"라고 말하는 것
  • 응답(Response): 서버가 "여기 있어" 하고 돌려주는 것

 

요청 방식: 메서드(Method)의 의미

HTTP에서 메서드는 요청의 목적을 나타낸다. GET은 데이터를 조회하는 용도고, POST는 데이터를 새로 생성할 때 사용된다.

 

PUT은 기존 데이터를 통째로 수정할 때, PATCH는 일부만 변경할 때, DELETE는 데이터를 제거할 때 사용된다.

 

예를 들어, /users/1에 GET 요청을 보내면 사용자 정보를 조회하고, DELETE를 보내면 해당 사용자를 삭제하는 식이다.

 

URI는 명사로, 메서드는 행동으로 설계하는 것이 원칙이다.

서버의 응답: 상태 코드(Status Code)

서버는 요청을 처리한 후, 항상 상태 코드를 함께 응답으로 돌려준다.

 

200은 요청이 정상 처리되었음을 의미하고, 201은 POST 요청이 성공해서 리소스가 생성되었을 때 사용된다.

204는 응답 바디 없이 성공했음을 의미한다.

400은 클라이언트의 요청이 잘못됐을 때, 401은 인증이 필요하거나 실패했을 때, 403은 접근 권한이 없을 때, 404는 해당 리소스를 찾을 수 없을 때 사용한다.

500번대는 서버 내부 오류다. 

 

API를 개발할 땐 이 상태 코드를 의도에 맞게 설정해야 한다.

HTTP 요청 구조 

HTTP 요청은 크게 4가지로 구성된다.

  1. 요청 메서드 (GET, POST 등 → 무엇을 할 건지)
  2. URL (어떤 리소스를 요청할 건지)
  3. 헤더(Header) (요청에 대한 부가 정보: 토큰, 언어, 길이 등)
  4. 바디(Body) (POST나 PUT일 경우, 보낼 데이터)

fetch api 사용한 요청 예시 

// POST 요청 
fetch("https://example.com/users", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "hello",
    email: "hello@mail.com"
  })
})
.then(res => res.json())
.then(data => console.log(data));

 

Postman에서 요청 보내는 법 

  • Method: POST
  • URL: https://example.com/users
  • Headers: Content-Type: application/json
  • Body (raw): { "name": "hello", "email": "hello@mail.com" }

요청과 응답 구조: 무엇이 오고 가는가

HTTP 요청은 크게 메서드, URL, 헤더, 바디로 구성된다.

 

예를 들어, POST 요청이라면 바디에 JSON 데이터를 담아 서버로 보낸다.

 

헤더에는 데이터 형식이나 인증 정보 등이 들어간다. 서버는 요청을 받은 뒤, 상태 코드와 함께 응답 바디를 JSON이나 HTML 등으로 되돌려준다.

 

백엔드는 이 JSON 데이터를 자바 객체로 변환해 처리하고, 응답할 때 다시 객체를 JSON으로 직렬화 (객체를 텍스트 기반인 JSON 문자열로 변환하는 과정)해서 전달하게 된다. 이 과정에서 Jackson 같은 라이브러리가 사용되며, 객체 매핑이 정확히 이뤄지지 않으면 오류가 발생한다.

 

HTTP는 Stateless: 상태 유지의 필요성

HTTP는 기본적으로 stateless, 즉 상태를 저장하지 않는 구조다.

 

요청은 매번 독립적으로 처리되며, 이전 요청의 정보를 기억하지 않는다.

 

그렇기 때문에 로그인 상태를 유지하려면 추가적인 방식이 필요하다. 하나는 세션 기반 방식이고, 다른 하나는 토큰 기반 방식이다.

 

세션 방식은 서버가 상태를 기억하고 클라이언트는 세션 ID만 들고 다닌다.

토큰 방식은 클라이언트가 모든 정보를 포함한 토큰을 Authorization 헤더로 매 요청마다 전달하는 구조다.

HTTPS: 보안이 적용된 HTTP

HTTP는 기본적으로 암호화되지 않은 프로토콜이다.

 

그렇기 때문에 중간에서 패킷이 가로채지면 개인정보나 로그인 정보가 유출될 수 있다.

이를 막기 위해 HTTPS를 사용한다. HTTPS는 SSL 인증서를 통해 서버와 클라이언트 간의 통신을 암호화하며, 사용자가 신뢰할 수 있는 서버와만 통신하도록 보장해준다.

 

운영 환경에 인증서를 설치하고, HTTP 요청을 HTTPS로 리디렉션하는 설정을 구성해야 HTTPS를 쓸 수 있다.

 

CORS: 다른 출처 간 요청을 허용할 것인가

웹 브라우저는 보안상의 이유로, 도메인이 다른 서버에 데이터를 요청하는 걸 기본적으로 막는다.

이걸 Cross-Origin Resource Sharing, 줄여서 CORS라고 한다.

 

예를 들어 프론트엔드가 localhost:3000이고 백엔드가 localhost:8080일 경우, 도메인이 달라서 브라우저는 요청을 차단한다. 이때 백엔드는 CORS 설정을 통해 어떤 도메인에서 오는 요청을 허용할지 명시해야 한다.

 

개발 환경에서는 모든 요청을 허용하되, 운영 환경에서는 특정 출처만 열어주는 식으로 설정해야 한다.

 


도메인이란?

도메인이란, 인터넷에서 어떤 서버를 표현한 주소다. google.com, localhost:3000 같은 것들이다. 

인터넷에서 서버슷 숫자(ip주소)로 식별되는데, 216.58.200.14 같은 숫자를 외워 사용자가 접속하긴 어려우니, 사람이 알아보기 쉬운 이름으로 만든 것을 '도메인'이라고 한다. 

 

ip주소는 내부적으로 DNS(Domain Name System)을 통해 IP주소로 바뀌고, 그 IP주소로 HTTP 요청이 날아간다. 

Localhost란?

localhost는 내 컴퓨터 자신을 가리키는 특수한 도메인이다. 외부의 다른 서버가 아니라, 자기 자신에게 요청을 보낼때 쓰는 주소이다. 

Port 번호란? 

포트 번호란, 네트워크에서 한 컴퓨터(서버)ㅇ ㅏㄴ에서 여러 서비스(프로그램)을 구분하기 위한 고유한 숫자이다. 한 서버가 여러 프로그램을 동시에 실행하려면, 각각 어떤 요청을 받아야할지 구분할 기준이 필요한데, 그때 다양한 포트 번호가 쓰인다. 

 

같은 컴퓨터(서버)에서 여러 서버를 띄워야할 땐 다른 포트로 나눠준다. 프론트는 3000, 백엔드는 8080, DB는 3306이다.