본문 바로가기
Web

인터넷에서 데이터를 주고 받기 위한 규칙 HTTP

by LeeJ1Hyun 2022. 12. 13.

HTTP는 Hyper Text Transfer Protocol의 두문자어로, 데이터를 주고받기 위한 일정한 규칙이다. 규칙에는 조항이 따르기 마련이다.

 

 

HTTP 조항

요청(request)

클라이언트 측에서 서버 측으로 보내는 요청, 혹은 메시지

 

 

1. Start Line: 요청의 첫 번째 줄에 해당

  • HTTP Method: 해당 요청이 의도한 액션을 정의하는 부분 (GET, POST, DELETE, PATCH, PUT)
  • Request target: 해당 request가 전송되는 목표 url
  • HTTP Version: 주로 1.1 버전이 널리 쓰임
POST /signup HTTP/1.1
# 해석: POST 메소드로 signup 이라는 요청 타겟에 HTTP 1.1 버전으로 요청을 보낸다.

 

2. Headers: 해당 요청에 대한 추가 정보(meta data)를 담는 장소

  • Key - Value 형태
  • Host: 요청을 보내는 목표(타겟)의 주소 (ex. www.naver.com)
  • User-Agent: 요청을 보내는 클라이언트의 대한 정보 (ex. chrome)
  • Content-Type: 해당 요청이 보내는 메시지 body의 타입 (ex. application/json)
  • Content-Length: body 내용의 길이
  • Authorization: 회원의 인증/인가를 처리하기 위해 로그인 토큰을 담는 장소
Host:  
User-Agent: 
Content-Type: 
Content-Length: 
Authorization:

 

3. Body: 해당 요청의 실제 내용

  • Headers와 Body 사이에는 empty line이 한 줄 있다.
"id":"louis1004" "password": "justdoit!"

 

응답(response)

요청에 대한 처리상태를 클라이언트에게 알려주는 응답

 

 

1. Status Line: 응답의 상태 줄

  • HTTP Version: 요청의 HTTP버전과 동일
  • Status Code: 응답 메시지의 상태 코드
  • Status Text: 응답 메시지의 상태를 간략하게 설명해 주는 텍스트
HTTP/1.1 200 SUCCESS
# 해석: HTTP 1.1 버전으로 응답하고 있는데, 프론트엔드에서 보낸 요청에 대해서 성공했기 때문에 200 상태 메세지를 보낸다.

 

2. Headers: 요청의 헤더와 동일

  • 요청하는 브라우저의 정보가 담긴 User-Agent 대신, Server 헤더가 사용됨
Host:  
Server: 
Content-Type: 
Content-Length: 
Authorization:

 

3. Body: 요청의 Body와 일반적으로 동일

  • Headers와 Body 사이에는 empty line이 한 줄 있다.
"message": "SUCCESS"
"token": "eyfbjfbfJBVFjdbbfdkdlshdbadnafkfjv" (암호화된 유저의 정보)

 

Stateless

  • 서버가 클라이언트 상태를 저장하지 않는 특징
  • 서버가 상태를 기억하지 않아도 되기 때문에 어떤 서버를 이용하여 응답해도 됨, 고로 스케일 아웃에 용이

 

Connectionless

  • 각 요청과 응답이 독립적으로 처리되는 특징

고로 클라이언트와 서버 간의 상태를 유지해야 한다면, 쿠키와 세션 같은 도구를 사용하면 된다.

 

HTTP 통신 코드로 시험해보기

요청과 응답을 보낼 때 Status line, Headers, Body를 어떻게 구분할까. 먼저, Status line와 Headers를 구분하는 요소는 개행 문자 (CRLF 또는 "\r\n")이다. Status line 뒤에 개행 문자가 등장하면 이제부터 Headers의 시작이라는 말이다. Headers의 요소는 여러 가지이기 때문에 각 요소를 개행 문자로 구분한다. Headers와 Body 사이에도 개행 문자가 오고 empty line이 따라붙는다. 이 한 줄의 공백이 등장하면 Body의 시작이다. 그냥 개행 문자만 오면 이게 Headers의 요소 중 하나인지 Body의 시작인지 구분할 수 없기 때문이다. 정말 그런지 코드로 살펴보자.

 

서버 코드

const http = require("http");

http
  .createServer((req, res) => {
    req.on("error", (err) => {
      console.error(err);
      res.statusCode = 400;
      res.end();
    });

    res.on("error", (err) => {
      console.error(err);
    });

    if (
      "POST" === req.method &&
      "1.1" === req.httpVersion &&
      "/signUp" === req.url
    ) {
      let requestBody = "";

      req.on("data", (chunk) => {
        requestBody += chunk;
      });

      req.on("end", () => {
        res.statusCode = 201;
        const payload = JSON.parse(requestBody);
        const comment = JSON.stringify({
          res: `${payload.id}님의 가입이 완료되었습니다.`,
        });
        res.setHeader("Content-Length", comment.length);
        res.write(comment);
        res.end();
      });
    } else {
      res.statusCode = 404;
      res.end();
    }
  })
  .listen(3003);

 

Node.js의 http 모듈을 사용하여 HTTP 서버를 생성했다. http.createServer() 함수를 통해 서버를 생성하고 3003번 포트로 열었다. 이 함수의 인자로 전달된 콜백 함수는 요청(req)과 응답(res) 객체를 매개변수로 받는다. 요청 객체인 req에 "error" 이벤트 핸들러를 등록하고 요청 처리 중에 에러가 발생했을 때, res는 응답 처리 중에 에러가 발생했을 때 실행된다.

 

POST 메소드, HTTP 버전 1.1, 요청 타겟이 /signUp이라면 데이터를 받아오고, 이를 이용해 원하는 형태로 가공한다. 요청 객체의 "end" 이벤트 핸들러를 통해 응답을 보낸다.

 

클라이언트 코드

const net = require("net");

const port = 3003;
const host = "localhost";

const requestBody = JSON.stringify({ id: "louis", pwd: "fndltm1@!" });
const contentLength = Buffer.byteLength(requestBody);

const rawHttpRequest = `POST /signUp HTTP/1.1\r\nHost: localhost\r\nContent-Type: application/json\r\nContent-Length: ${contentLength}\r\n\r\n${requestBody}`;

const socket = new net.Socket();
socket.connect(port, host);

socket.on("connect", () => {
  socket.write(rawHttpRequest);
});

socket.on("data", (data) => {
  console.log(data.toString());
  socket.destroy();
});

 

Node.js의 net 모듈을 사용하여 로컬 서버에 TCP 소켓 연결을 설정하고, HTTP POST 요청을 보내는 코드이다. rawHttpRequest라는 변수에 문자열 형태로 요청을 작성했다. 위의 설명처럼 Status Line에 HTTP 메소드, Request target, HTTP 버전을 적고 개행 문자를 붙여 라인이 끝났음을 알린다. 그다음 줄에 Host, Content-Type, Content-Length에 대한 정보를 작성하고 각각 요소들 사이에 개행 문자로 구분한다. 최종적으로 개행 문자를 두 번 사용하여 전달하고 싶은 Body의 내용을 작성한다.

 

 

서버의 응답은 위와 같다. Status Line이 담고 있는 정보는 HTTP 1.1 버전을 사용했고 Status Code는 201라는 것이다. 그 다음 줄 Headers에는 응답의 Body의 길이인 Content-Length, 응답이 생성된 날짜와 시간인 Date, 서버와의 연결을 유지하고 있음을 나타내는 Connection, 서버와의 연결이 유휴 상태로 유지되는 시간이 5초임을 알리는 Keep-Alive 정보가 포함되어 있다. 한 줄을 띄고 클라이언트 측에 보내기 위해 가공한 Body가 붙어있다. HTTP 메소드마다 요청과 응답의 형태가 조금씩 다르지만 전체적인 틀은 같다.

 

정말 설명한 방식대로 HTTP 통신이 이루어지고 있다는 사실이 증명되었다.

 

HTTP 통신 과정 7단계

네트워크 통신을 7단계로 나눈 것으로 문제가 발생했을 때 해당하는 부분만 고쳐 정상으로 빠르게 복구할 수 있다.

 

1. 물리계층(Physical Layer) - 1 계층

최하위 계층으로 네트워크 데이터가 전송되는 물리적인 매체이다. 전기적인 특성을 이용해 데이터를 전송하게 된다. 데이터는 0과 1의 비트열의 전기 신호 상태로 이루어져 있다. 데이터 에러에 전혀 관여하지 않고 오로지 전달만을 진행한다. 전압, 허브를 비롯해 사용된 모든 하드웨어의 물리적 및 전기적 특성을 정의한다.

2. 데이터링크 계층(DataLink Layer) - 2 계층

물리적인 네트워크를 통해 데이터를 전송하는 수단이다. 1 hop 통신을 담당하며 라우터에서 그다음 라우터까지의 경로를 말한다. 주목적은 장치를 식별하는 데 사용할 수 있는 주소 지정 체계를 제공하는 것이다. 데이터 링크 계층은 포인트 투 포인트(Point to Point) 간의 신뢰성 있는 전송을 보장하기 위한 계층이다. 주소 값은 물리적으로 할당받으며 브리지, 이더넷등이 대표적이다.

3. 네트워크 계층(Network Layer) - 3 계층

2 hop 이상의 통신을 담당하며 실제 네트워크 간의 데이터 라우팅을 담당한다. 라우팅이란 어떤 네트워크 안에서 통신 데이터를 짜인 알고리즘에 의해 최대한 빠르게 보낼 최적의 경로를 선택하는 과정이다. 네트워크 계층은 네트워크 호스트의 논리 주소 지정(ip)을 확인한다. 경로를 선택하고 주소를 정하고 그에 따라 패킷을 전달해 주는 것이 핵심 역할이다. 또한, 데이터 스트림을 더 작은 단위로 분할하고 경우에 따라 오류를 감지해 처리한다. 대표적인 장비는 라우터이다.

4. 전송 계층(Transport Layer) - 4 계층

주목적은 하위 계층에 신뢰할 수 있는 데이터 전송 서비스를 제공하는 것이다. 시퀀스 넘버 기반의 오류 제어 방식을 사용한다. 연결형 프로토콜과 비 연결형 프로토콜을 모두 사용한다. 특정 연결의 유효성을 제어하고, 일부 프로토콜은 상태 개념이 있고(stateful), 연결 기반(connection oriented)이다. 예시로는 프록시 서버, TCP가 있다.

5. 세션 계층(Session Layer) - 5 계층

두 컴퓨터 간의 대화나 세션을 관리하며, 포트 연결이라고도 할 수 있다. 모든 통신 장치 간의 연결을 관리 및 종료하고 정상적으로 호스트를 연결하는 데 책임이 있다.

6. 표현 계층(Presentation Layer) - 6 계층

응용 계층으로부터 전송받거나 전달해야 할 데이터의 인코딩과 디코딩이 이 계층에서 이루어진다. 데이터를 안전하게 사용하기 위해서 암호화와 복호화를 하는데 이 작업도 표현 계층에서 이루어진다. 예를 들어 유니코드(UTF-8)로 인코딩 되어있는 문서를 ASCII로 인코딩 된 문서로 변환하는 작업등이 있다.

7. 응용 계층(Application Layer) - 7 계층

사용자가 볼 수 있는 유일한 계층으로 모든 네트워크 활동의 기반이 되는 인터페이스를 제공한다. 터미널창, 크롬, 이메일(전자우편), 데이터 베이스 관리 등이 응용 계층에 속한다.

 

HTTP와 HTTPS의 차이점

HTTPS는 SSL(Secure Socket Layer) 인증서를 사용하는 HTTP이다. 유일한 차이점은 HTTPS를 사용한 웹 페이지를 통해 전송되는 모든 데이터는 추가적인 보안 계층이 있다. 이를 TLS(전송 계층 보안) 프로토콜이라고 한다. 모든 유형의 데이터는 변경되거나 손상될 수 없는 HTTPS 사이트를 통해 전달되며 제 3자로부터 보호된다. 게다가 HTTP보다 300% 이상 더 빠르게 로딩되기 때문에 SEO적으로 유리하다.

 

 

 

 

 

* 아래의 자료들을 참고하였습니다.

 

네트워크 7 계층 (OSI 7 계층)이란? OSI7 개념에 대해 쉽고 간단하게 알아보자!!

OSI 7계층이란? OSI 7계층은 네트워크 프로토콜이 통신하는 구조를 7개의 계층으로 분리하여 각 계층간 상호 작동하는 방식을 정해 놓은 것이다. 이는 ISO(국제 표준화기구)에서 개발한 모델이다.

akdl911215.tistory.com

 

HTTP HTTPS 차이: 당신의 웹 사이트는 안전한가요?

HTTP HTTPS 차이: 당신의 웹 사이트는 안전한가요? 에 관한 어센트 코리아 의 블로그 글입니다. HTTP와 HTTPS의 차이점과 각각의 정의 및 Google 랭킹 팩터 여부에 대한 자세한 내용을 확인해보세요.

www.ascentkorea.com

댓글