kimyu0218
  • [node] http 모듈 커스텀하기 1편
    2023년 12월 23일 22시 43분 16초에 업로드 된 글입니다.
    작성자: @kimyu0218
    예비 개발자의 http 모듈 뜯어보기

     
    웹의 3요소는 HTTP, HTML, URL이다. 웹 개발자가 되고 싶은 사람으로서 http 모듈은 뜯어봐야 되지 않겠냐라는 마인드로 http 모듈을 모방하기로 결심했다. 패키지는 npm에 배포된 상태이며, 소스코드는 깃허브 에서 확인할 수 있다. (아직 부족한 부분이 많기에 계속해서 수정할 예정이다.)
     
    이번 포스트에서는 HTTP가 무엇인지 알아볼 것이다.
     

    HTTP가 뭐야?

    HTTP : Hyper Text Transfer Protocol
    • 클라이언트 서버 구조
    • 무상태 프로토콜 (stateless)
    • 비연결성 (connectionless)

    HTTP는 HTML 문서와 같은 데이터들을 가져올 수 있도록 해주는 프로토콜로, 위와 같은 특징을 갖는다. 해당 특징들을 하나씩 자세히 살펴보자.

    클라이언트 서버 구조

    HTTP는 클라이언트 서버 구조를 갖는다. 클라이언트는 서버에 요청을 보내고 응답을 대기하고, 서버는 요청에 대한 결과를 만들어 응답을 전송한다.이때 클라이언트에 의해 전송되는 메시지를 request, 서버에서 전송되는 메시지를 response라고 한다.
     

    무상태 프로토콜 (stateless)

    무상태 프로토콜은 서버가 클라이언트 상태를 보존하지 않는다는 걸 의미한다. 좀 더 쉬운 이해를 위해 stateful과 비교하여 설명하겠다.
     
    결제 시스템이 stateful 위에서 돌아간다고 가정해보자. 서버에 사용자의 결제 상태가 저장되어 있는 경우, 해당 서버에 장애가 발생하면 사용자의 결제 정보가 손실될 수 있다.

    😡 : 아니 결제했는데 왜 결제 완료 안 해줘요?
    stateful 시스템의 단점
    • 장애 회복의 어려움 : 서버에 장애가 발생하면 해당 서버가 유지하던 상태 정보가 손실된다.
    • 동기화의 어려움 : 여러 서버가 있을 때 서버 간 상태 정보를 동기화하는 것이 복잡하다.
    • 유지보수의 어려움 : 서버에 유지보수 작업이 필요한 경우, 상태 정보를 고려하여 조심스럽게 진행해야 한다.
    • 확장성의 어려움 : 사용자 수가 증가하면 서버가 저장해야 하는 상태 정보가 늘어나기 때문에 추가적인 리소스가 필요하고 더 나아가 서버의 부하로 이어질 수 있다.

    반면, stateless는 상태를 보존하지 않으므로 서버에 장애가 발생해도 다른 서버에 요청을 보내 계속해서 통신할 수 있다.
     

    비연결성 (connectionless)

    HTTP는 연결을 유지하지 않음으로써 서버 자원의 낭비를 방지한다. 하지만 연결을 위해 3 way handshake를 반복하면 그만큼 시간이 낭비되므로 최근에는 keep alive를 통해 지속적인 연결을 지원한다.


    HTTP는 어떤 메시지를 전송할까?

    지금까지 HTTP 프로토콜에 대해 알아봤으니 이제 HTTP 메시지 구조에 대해 살펴보자.

    • request : 클라이언트가 서버에게 보내는 메시지
    • response : 서버가 클라이언트에게 보내는 메시지

    HTTP 메시지는 요청과 응답으로 나뉘지만, 동일한 뼈대를 갖는다. start-line만 요청인지 응답인지에 따라 request-line과 status-line으로 구분된다.

    rfc2616 - 4.1 Message Types

     

    start-line

    start-line은 HTTP 메시지의 첫 번째 줄이다.

    Request-Line = Method SP Request-URI SP HTTP-Version CRLF
    Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

    request-line에는 HTTP 메서드, 요청 대상, HTTP 버전이 들어있고, status-line에는 HTTP 버전, 상태코드, 이유 문구가 들어있다.

    header

    header는 start-line 이후에 위치하며, Content-Type 같은 HTTP 전송에 필요한 모든 부가 정보를 담고 있다. `field-name: field-value` 형태를 가지는데, field-name은 대소문자 구분 없이 사용하며 field-value는 띄어쓰기를 허용한다.

    rfc2616 - 4.2 Message Headers

     

    message-body

    message-body는 HTTP 메시지의 주요 내용을 담고 있는 부분이다. message-body의 형식은 header의 Content-Type에 의해 결정된다.


    지금까지 HTTP 프로토콜이 무엇인지, HTTP 메시지는 어떤 구조를 갖고 있는지 살펴봤다.

    아직까지는 어떻게 http 모듈을 모방해야 하는지 감이 안 올 것이다. 하지만 메시지 구조에 대해 공부하면서 버전, 메서드가 메시지에 사용된다는 걸 알게 되었다. 해당 내용을 바탕으로 다음 포스트에서 http 모듈에 필요한 상수들을 정의할 것이다.
     
    참고자료

    댓글