
웹 브라우저에서 주소를 입력하면 페이지가 뜬다. 이 과정에서 브라우저와 서버가 주고받는 약속이 있다. 그게 바로 HTTP다.
HTTP(HyperText Transfer Protocol)는 클라이언트와 서버가 데이터를 주고받기 위한 통신 규약(Protocol) 이다. 웹에서 HTML, 이미지, JSON 등 거의 모든 데이터가 HTTP를 통해 전달된다.

핵심은 요청(Request)과 응답(Response) 구조다. 클라이언트가 먼저 요청을 보내고, 서버가 그에 맞는 응답을 돌려준다. 서버가 먼저 데이터를 보내는 일은 없다.
소켓은 연결을 유지하면서 자유롭게 데이터를 주고받는다. 반면 HTTP는 기본적으로 요청 하나에 응답 하나로 끝나는 단순한 구조다.
| 구분 | Socket | HTTP |
|---|---|---|
| 연결 방식 | 지속 연결 | 요청-응답 후 종료 |
| 형식 | 자유 형식 | 정해진 헤더/바디 구조 |
| 용도 | 채팅, 게임 등 실시간 | 웹 요청, API 호출 |
소켓이 전화 통화라면, HTTP는 편지다. 편지를 보내면 답장이 오고 끝난다.
HTTP 요청은 세 부분으로 이루어진다.
GET /search?q=java HTTP/1.1
Host: www.example.com
Accept: text/html
(본문 없음 - GET은 보통 본문이 없다)
메서드(Method): 무엇을 할지 지정한다.
URL: 어디에 요청할지 지정한다.
헤더(Header): 부가 정보(인증, 콘텐츠 타입 등).
바디(Body): 전송할 데이터 (POST, PUT 등에서 사용).

| 메서드 | 의미 | 주요 용도 |
|---|---|---|
| GET | 조회 | 데이터 읽기 |
| POST | 생성 | 데이터 등록 |
| PUT | 수정 | 데이터 전체 교체 |
| PATCH | 수정 | 데이터 일부 수정 |
| DELETE | 삭제 | 데이터 삭제 |
GET은 URL에 데이터를 담아 보내고, POST는 바디에 담아 보낸다. 그래서 GET은 주소창에서 내용이 보이고, POST는 보이지 않는다.
HTTP/1.1 200 OK
Content-Type: application/json
{"name": "김민수", "age": 25}
응답도 세 부분이다. 상태 라인, 헤더, 바디.
서버는 요청 결과를 숫자로 알려준다.
| 범위 | 의미 | 예시 |
|---|---|---|
| 2xx | 성공 | 200 OK, 201 Created |
| 3xx | 리다이렉트 | 301 Moved Permanently |
| 4xx | 클라이언트 오류 | 400 Bad Request, 404 Not Found |
| 5xx | 서버 오류 | 500 Internal Server Error |
404는 요청한 페이지가 없다는 뜻이고, 500은 서버 쪽에서 문제가 생겼다는 뜻이다. 2xx가 나오면 정상적으로 처리됐다고 보면 된다.
Java 11부터는 HttpClient가 표준으로 포함됐다. 별도 라이브러리 없이 HTTP 요청을 보낼 수 있다.
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
HttpClient client = HttpClient.newHttpClient();
// GET 요청
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200
System.out.println(response.body()); // JSON 응답 본문
POST 요청도 비슷하다. 바디에 데이터를 담아 보낸다.
String json = "{\"title\": \"테스트\", \"body\": \"내용\", \"userId\": 1}";
HttpRequest postRequest = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> postResponse = client.send(postRequest, HttpResponse.BodyHandlers.ofString());
System.out.println(postResponse.statusCode()); // 201
HTTP 앞에 S가 붙은 HTTPS(HTTP Secure)는 데이터를 암호화해서 주고받는다. 주소창에 자물쇠 아이콘이 붙어 있으면 HTTPS다. 요즘 웹사이트는 대부분 HTTPS를 쓴다. Java의 HttpClient는 HTTPS도 별도 설정 없이 그대로 지원한다.
HTTP는 웹의 기본 언어다. 요청과 응답, 메서드, 상태 코드 이 세 가지만 이해해도 웹이 돌아가는 방식을 읽을 수 있다. 나중에 REST API나 Spring을 다루게 되면 여기서 배운 개념이 계속 등장한다.