AI 웹 개발 교실

선택 · 소켓으로 HTTP 보내기

소켓에 HTTP 문자열을 보내고, 응답 본문에서 텍스트를 꺼냅니다.

이 단원의 실습 파일 52 KB ZIP 다운로드

소켓 채팅과 HTTP 요청 하나 추적하기 뒤에 고르는 심화 실험입니다. 먼저 다른 8080 서버를 종료하세요. 기본 흐름의 다음 단계는 가짜 로그인 관찰이며, 이 원시 HTTP 실험을 모두 끝내야 넘어갈 수 있는 것은 아닙니다.

에코 서버에서는 바이트를 보냈습니다. 이제 같은 소켓으로 브라우저가 알아보는 HTTP 응답 문자열을 보냅니다. 이번에도 ASCII로만 실습합니다.

고정된 응답 하나 보내기

터미널 A에서 실행합니다. 01-첫성공 등 다른 8080 서버가 켜져 있으면 먼저 종료합니다.

npm run http:server

Chrome에서 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-server

02-http-server/file-server.mjs는 HTML을 읽어 body에 담는 단계를 추가했습니다. 02-http-server/pages/index.html을 수정하고 서버를 재시작하세요. 여전히 모든 경로에 같은 페이지를 보냅니다.

작은 텍스트 브라우저

서버를 실행한 상태에서 다음을 실행합니다.

npm run browser

04-text-browser/browser.mjs의 흐름을 읽습니다.

  1. TCP로 HTTP 요청 문자열을 보냅니다.
  2. data가 올 때마다 응답에 붙입니다.
  3. 서버의 송신이 끝난 end에서 첫 빈 줄 다음의 본문을 꺼냅니다.
  4. 태그를 간단히 제거한 텍스트를 출력하고 종료합니다.

작은 변경: 마지막의 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로 내 요청 관찰하기.

이 페이지에서