선택 · 소켓으로 HTTP 보내기
소켓에 HTTP 문자열을 보내고, 응답 본문에서 텍스트를 꺼냅니다.
소켓 채팅과 HTTP 요청 하나 추적하기 뒤에 고르는 심화 실험입니다. 먼저 다른 8080 서버를 종료하세요. 기본 흐름의 다음 단계는 가짜 로그인 관찰이며, 이 원시 HTTP 실험을 모두 끝내야 넘어갈 수 있는 것은 아닙니다.
에코 서버에서는 바이트를 보냈습니다. 이제 같은 소켓으로 브라우저가 알아보는 HTTP 응답 문자열을 보냅니다. 이번에도 ASCII로만 실습합니다.
고정된 응답 하나 보내기
터미널 A에서 실행합니다. 01-첫성공 등 다른 8080 서버가 켜져 있으면 먼저 종료합니다.
npm run http:serverChrome에서 http://127.0.0.1:8080/를 열고 02-http-server/server.mjs를 읽습니다.
import net from 'node:net';
const server = net.createServer((socket) => {
socket.once('data', (data) => {
console.log(data.toString());
socket.end(
'HTTP/1.0 200 OK\r\n' +
'Content-Type: text/html\r\n' +
'\r\n' +
'<h1>Hello, web!</h1><p>This page came from a TCP socket.</p>'
);
});
});
server.listen(8080, '0.0.0.0');Hello, web!를 바꾸고 저장 → 서버 Ctrl+C → 다시 실행 → 새로고침합니다. 친구가 내 IP로 접속해 바꾼 문장을 확인하면 성공입니다.
이 예제는 첫 데이터 조각을 받으면 준비한 응답을 보내는 실험입니다. 요청을 해석하지 않습니다. once('data')가 요청 전체를 기다린다는 뜻도 아닙니다. /about이나 /missing을 열어도 같은 200 응답을 보냅니다.
헤더와 본문 직접 읽기
다른 터미널에서 실행합니다.
npm run http:client| 부분 | 예시 | 역할 |
|---|---|---|
| 상태 줄 | HTTP/1.0 200 OK | 응답 상태 |
| HTTP 헤더 | Content-Type: text/html | 본문 형식 |
| 빈 줄 | \r\n\r\n의 경계 | 헤더와 본문 구분 |
| 본문 | Hello, web!가 포함된 HTML | 전달할 내용 |
HTTP/1.0의 이 예제는 Content-Length를 생략하고 연결 종료로 본문 끝을 알립니다. HTTP 헤더와 본문은 모두 TCP가 운반하는 데이터입니다. TCP 헤더는 이 문자열에 들어 있지 않습니다.
03-http-client/client.mjs의 request에서 GET·경로·Host·빈 줄을 찾습니다. 이어서 /test를 요청하고 서버 로그를 봅니다.
npm run http:client -- http://127.0.0.1:8080/test경로가 달라도 응답이 같은 이유를 설명하세요. 아직 경로를 해석하는 코드를 작성하지 않았기 때문입니다.
한 단계 추가 · 파일에서 HTML 읽기
기본 HTTP 서버를 종료하고 다음을 실행합니다.
npm run http:file-server02-http-server/file-server.mjs는 HTML을 읽어 body에 담는 단계를 추가했습니다. 02-http-server/pages/index.html을 수정하고 서버를 재시작하세요. 여전히 모든 경로에 같은 페이지를 보냅니다.
작은 텍스트 브라우저
서버를 실행한 상태에서 다음을 실행합니다.
npm run browser04-text-browser/browser.mjs의 흐름을 읽습니다.
- TCP로 HTTP 요청 문자열을 보냅니다.
data가 올 때마다 응답에 붙입니다.- 서버의 송신이 끝난
end에서 첫 빈 줄 다음의 본문을 꺼냅니다. - 태그를 간단히 제거한 텍스트를 출력하고 종료합니다.
작은 변경: 마지막의 console.log(text.trim())을 console.log(body)로 바꿉니다. HTML 태그가 출력에 보일지 예상하고 확인한 뒤 복원하세요.
이 프로그램은 ASCII HTML 본문을 한 번 읽는 작은 클라이언트입니다. 정규식 태그 제거는 일반 HTML 파서가 아니며 CSS·JavaScript·DOM·링크 이동·방문 기록을 구현하지 않습니다.
선택 실험:
npm run browser -- http://info.cern.ch/hypertext/WWW/TheProject.html평문 HTTP, 압축되지 않은 본문, 연결 종료로 응답이 끝나는 경우를 실습 기준으로 삼습니다. HTTPS·리다이렉트·chunked 처리는 없습니다. 외부 응답이 달라지거나 멈춰 있으면 Ctrl+C로 종료하고 로컬 서버로 계속합니다.
이해 확인
- 상태 줄·HTTP 헤더·빈 줄·본문을 구분한다.
- 응답 문자열과 요청 문자열을 코드에서 찾는다.
- 이 서버가 경로를 해석하지 않는다는 제한을 설명한다.
- 원문과 텍스트 출력의 차이를 비교한다.
다음: Wireshark로 내 요청 관찰하기.