본문 바로가기
cs/컴퓨터 네트워크

HTTP란?, HTTP 메시지

by 장인이 2023. 1. 12.

0. 개요

 이 게시물에서는 HTTP에 대해 간단한 개념과 내용을 정리할 것이다. 사실 더 깊게 살펴봐야할 내용들이지만, 추후에 더 깊은 공부를 하여 작성할 예정이다.

 

 

1. HTTP란?

 HTTP는 HyperText Transfer Protocol의 약자로서, 인터넷에서 데이터를 주고 받을 수 있는 프로토콜을 말한다. 여기서 프로토콜은 규칙이라고 생각하면 된다. 즉, http 규칙을 지키므로서 모든 프로그램이 서로간에 정보를 교환할 수 있게 된다.

 

 HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, ... 등 거의 모든 형태의 데이터를 전송 가능하며, 서버간에 데이터를 주고 받을 때도 대부분 HTTP를 사용한다. 그만큼 중요한 개념이라고 할 수 있다.

 

 

2. 기반 프로토콜

 HTTP/1.1, HTTP/2 버전은 TCP를 기반으로 하며, HTTP/3 버전은 UDP를 기반으로 한다. HTTP/1.1을 주로 사용했지만, 시간이 지날수록 HTTP/2, HTTP/3도 점점 증가하고 있다. 해당 게시물에서는 HTTP/1.1을 중심으로 적어볼 예정이다.

 (TCP, UDP란?)

 

 

3. HTTP의 특징

HTTP의 특징들에 대해서 알아보자.

 

1) 클라이언트 서버 구조

  클라이언트는 서버에 요청을 보내고, 응답을 대기한다. 그러면 서버가 요청에 대한 결과를 만들어서 응답한다. 어떻게 보면 당연한 거라고 생각할 수 있지만, 역할의 분리가 중요하다.

 클라이언트는 UI, 사용자의 사용성에 집중하고, 서버는 비즈니스 로직과 데이터에 집중한다. 이로서 클라이언트와 서버가 각자 독립적으로 진화할 수 있다.

 

2) 무상태 프로토콜(Stateless)

 서버가 클라이언트의 상태를 보존하지 않는 것을 말한다. 이게 무슨 말일까? 우선 반대 개념인 Stateful에 대해 알아보자.

 

- 상태 유지(Stateful)

사용자: 이 핸드폰을 구매하겠습니다.

직원A: 100만원 입니다.

 

사용자: 2개 구매하겠습니다.

직원A: 200만원입니다.

 

(직원이 바뀔 경우)

사용자: 2개 구매하겠습니다.

직원B: (뭘 2개 산다는거지..?)

 

 사용자가 클라이언트, 그리고 직원A, B가 각자 다른 서버라고 생각해보자. Stateful한 경우 서버가 이전 정보를 기억하고 있기 때문에, 서버가 절대 바뀌면 안된다.(의미를 알수 없게 됨)

 

- 무상태(Stateless)

사용자: 이 핸드폰을 구매하겠습니다.

직원A: 100만원 입니다.

 

사용자: 핸드폰 2개 구매하겠습니다.

직원A: 200만원입니다.

 

(직원이 바뀔 경우)

사용자: 핸드폰 2개 구매하겠습니다.

직원B: 200만원입니다.

 

 이번에는 서버가 아닌 클라이언트가 이전 정보를 저장하고 있다. 이렇게 Stateless한 경우 서버가 바뀌어도, 문제없이 잘 작동한다. 따라서 Stateless한 설계를 하게 되면 무한한 서버 증설이 가능하며, 순간적으로 많은 트래픽이 왔을때 대처 가능해진다.

 

- Stateless의 한계

 하지만 실제 웹 서비스를 상상해보면, 무상태로 설계할 수 없는 경우도 있다..

- 로그인이 필요없는 서비스 소개 화면

  -> 이런 화면은 충분히 Stateless하게 설계할 수 있지만,

- 로그인한 유저를 위한 화면

  -> 이 경우 로그인 했다는 상태를 서버에 유지해야 한다.

 

 따라서, 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지하며, 어쩔수 없는 경우에만 Stateful하게 설계하는 것을 추천한다.

 또한, 클라이언트가 더 많은 정보를 서버에 전달해야 한다는 단점 또한 존재한다.

 

 

3) 비 연결성(connectionless)

 말 그대로 연결을 유지하지 않는 모델을 뜻한다. 보통 1초보다 작은 단위의 빠른 속도로 응답하며, 사용자수 대비 실제 서버에서 동시에 처리하는 요청은 매우 작다.(우리가 웹브라우저에서 연속해서 검색버튼을 누르지는 않는다!)

  -> 따라서 서버 자원을 매우 효율적으로 사용할 수 있다.

 

- 한계점과 극복

 하지만 연결을 유지하지 않는다는 뜻은, 새로운 연결을 하고 끊을 때마다 3/4 way handshake를 통한 TCP/IP 연결을 새로 맺어야 한다는 뜻이다.

(TCP/IP 3 way handshake란?)

 

 실제로 요청시 HTML 뿐만 아니라 자바스크립트, css, 이미지 등 많은 자원이 다운로드 되는데, 그러면 매우 비효율적인 방법으로 통신할 것이다.

 

연결 -> HTML 응답 -> 종료 -> 연결 -> 자바스크립트 응답 -> 종료 -> 연결 -> 이미지 응답 -> 종료

 

 이를 극복하기 위해 HTTP지속 연결(Persistent Connections)을 사용한다. 이를 도입하면 문제를 해결 할 수 있다. 참고로 HTTP/2, HTTP/3에서 더 많은 최적화가 이루어진다.

 

연결 -> HTML 응답 -> 자바 스크립트 응답 -> 이미지 응답 -> 종료

 

 

4. HTTP 메시지

 위에서 HTTP가 얼마나 사용되는지, 그리고 HTTP의 특징들에 대해서 알아보았다. 그럼 HTTP는 어떤 규칙으로 이루어져 있을까?

 HTTP 메시지시작 라인, 헤더, 공백, 메시지 바디 순으로 구성되어 있다. 여기서 공백 라인은 무조건 있어야 한다. HTTP 요청 메시지와 HTTP 응답 메시지를 간단하게 살펴보자.

 

1) HTTP 요청 메시지

 메시지 바디에 요청할 사항이 없으면 공백으로, 있으면 추가해서 요청하면 된다.

 

 

(1) 시작라인(start-line)

 시작라인의 구조를 적어보면 다음과 같다.

- method SP(공백) request-target SP(공백) HTTP-version CRLF(엔터)

- Get /search?q=hello&hl=ko HTTP/1.1

 

 먼저 HTTP method가 오며(예시에서는 GET:조회) 공백 후 요청 대상(/search?q=hello&hl=ko), 마지막으로 HTTP Version(HTTP/1.1)이 오게 된다.

 

(2) HTTP 헤더(header)

 헤더의 구조를 적어보면 다음과 같다. HTTP 헤더는 필요에 의해 여러개를 입력할 수 있다.

- field-name ":" OWS field-value OWS

(OWS: 띄어쓰기를 허용한다는 뜻)

Host : www.google.com  

 

참고로 field-name은 대소문자 구문이 없다.

 

(3) HTTP 메시지 바디

 HTML Form, JSON 등으로 필요한 경우 데이터를 전송한다.

 

2) HTTP 응답 메시지

(1) 시작 라인(start-line)

 시작라인의 구조를 적어보면 다음과 같다.

- HTTP-version SP(공백) status-code SP(공백) reason-phrase CRLF(엔터)

- HTTP/1.1 200 OK

 

 HTTP 상태 코드(status-code)를 통해 요청 성공, 실패를 나타낸다.

- 200: 성공

- 400: 클라이언트 요청 오류

- 500: 서버 내부 오류

 

 이유 문구(reason-phrase): 사람이 보고 이해할 수 있는 짧은 상태 코드

 

(2) HTTP 헤더

- field-name ":" OWS field-value OWS

(OWS: 띄어쓰기를 허용한다는 뜻)

- Content-Lenght: 3423

 

 HTTP 전송에 필요한 모든 부가정보로, 수많은 표준 헤더들이 있다.

(메시지 바디의 내용, 크기, 압축, 인증, 요청 클라이언트 정보, 등등...)

 

(3) HTTP 메시지 바디

 HTML Form, JSON 등으로 필요한 경우 데이터를 전송한다.

 

 

5. 더 자세한 설명은?

HTTP 메세지는 매우 중요한 개념이며, 각각 항목마다 내용을 살펴볼 것이다. 자세한 내용은 아래 게시물에서 확인 부탁한다.

 

1) 시작라인(start-line)

- HTTP 메서드(GET, POST, PUT, PATCH, DELETE)

 

- HTTP 상태코드

 

- HTTP API 설계하는 법

 

2) HTTP 헤더(header)

- HTTP 헤더 정보

 

- HTTP 쿠키

 

- HTTP 캐시, 프록시 캐시, 조건부 요청

 

 


위 내용은 김영한 님의 인프런 강의 "모든 개발자를 위한 HTTP 웹 기본 지식"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

'cs > 컴퓨터 네트워크' 카테고리의 다른 글

HTTP 상태코드  (0) 2023.01.12
HTTP API 설계하는 법  (0) 2023.01.12
HTTP 메서드(GET, POST, PUT, PATCH, DELETE)  (0) 2023.01.12
URI, URL, URN란?  (0) 2023.01.11
IP, TCP, UDP, 포트, DNS 정리  (0) 2023.01.11

댓글