본 내용은 부스트코스의 웹 프로그래밍(풀스택) 의 “웹의 동작(HTTP 프로토콜 이해)” 강좌를 기반으로, 이에 더해 다른 여러 문서를 참고하여 작성되었습니다.

HTTP 란?

Hyper Text Transfer Protocol. HTTP는 w3(www) 상에서 정보를 주고 받을 수 있는 프로토콜입니다. 주로 HTML 문서를 주고받는 데 사용됩니다.

이에 앞서 w3는 무엇인지, 프로토콜이란 무엇인지, 인터넷이란 무엇인지부터 간단히 살펴보겠습니다.


앞서 살펴보기

인터넷이란?

인터넷 != www

www란 인터넷을 통해 제공되는 서비스 중 하나입니다. 그리고 인터넷은 이러한 서비스 혹은 통신 방식들간의 통신 방식. 즉, 네트워크들의 네트워크라고 표현할 수 있습니다.

네트워크에는 www뿐 아니라 Email 통신을 위한 SMTP, 파일 교환의 FTP 등이 있습니다. 그리고 인터넷은 TCP/IP 기반으로 네트워크들이 하나의 연결된 네트워크처럼 동작할 수 있게 해줍니다.

서비스 이름 프로토콜 포트 기능
WWW HTTP 80 웹서비스
Email SMTP/POP3/IMAP 25/110/114 이메일 서비스
FTP FTP 21 파일 전송 서비스
DNS TCP/UDP 53 네임 서비스
NEWS NNTP 119 인터넷 뉴스 서비스

출처 : 부스트코스 웹 프로그래밍(풀스택) “웹의 동작(HTTP 프로토콜 이해)” 강좌

www, w3란?

www, 월드 와이드 웹은 인터넷에 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 전 세계적인 정보 공간, 즉 간단히 웹이라고 부르는 공간을 의미합니다.

www는 (다음 HTTP에서 살펴볼) 하이퍼텍스트 방식으로 정보를 전달할 수 있으며, 다양한 정보를 검색하는 정보검색 기능 또한 제공합니다.

프로토콜이란?

프로토콜 protocol을 번역하면 “규약” 이 됩니다. 하지만 우리는 네트워크를 살펴보고 있죠. 네트워크에서 프로토콜은 “통신 규약”을 의미하며, 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙 체계를 의미합니다.
(위키피디아)

TCP / IP

TCP/IP는 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 프로토콜 중 하나입니다.

인터넷에서 서로 정보를 주고 받는 통신 규약, 프로토콜에는 TCP나 IP만이 아니라 QUIC, UDP 등 다양한 종류가 있으며 이를 묶어 인터넷 프로토콜 스위트라고 합니다.

계층 프로토콜
응용 계층 HTTP, SMTP, SNMP, FTP, 텔넷, SSH & Scp, NFS, RTSP
표현 계층 XDR, ASN.1, SMB, AFP
세션 계층 TLS, SSL, ISO 8327 / CCITT X.225, RPC, 넷바이오스, 애플토크
전송 계층 TCP, UDP, RTP, SCTP, SPX, 애플토크
네트워크 계층 IP, ICMP, IGMP, X.25, CLNP, ARP, RARP, BGP, OSPF, RIP, IPX, DDP
데이터링크 계층 이더넷, 토큰링, PPP, HDLC, 프레임 릴레이, ISDN, ATM, 무선랜, FDDI
물리 계층 전선, 전파, 광섬유, 동축케이블, 도파관, PSTN, 리피터, DSU, CSU, 모뎀

OSI 7개 계층


HTTP

클라이언트와 서버가 인터넷상에서 데이터를 주고 받기 위한 프로토콜로, 어떠한 종류의 데이터도 주고받을 수 있도록 설계되어있습니다. 텍스트, 이미지, 동영상 등 어떠한 종류의 데이터도요.

2015년에 HTTP 2 버전이 나왔고, 현재 가장 많이 쓰이는 버전은 HTTP 1.1 입니다.

HTTP의 작동 방식

HTTP는 서버/클라이언트 모델을 따릅니다. 이 방식은 클라이언트가 서버에 요청을 보내고, 서버는 클라이언트에게 이에 대한 응답을 보내는 것을 뜻합니다.

클라이언트는 쉽게 말해 사용자 측, 서버는 서비스 제공자 측으로 보시면 됩니다.

무상태 Stateless 프로토콜

HTTP는 무상태 프로토콜입니다. 무상태 프로토콜은 “서버 측이 클라이언트 측의 상태를 보존하지 않는” 통신 방식입니다. 이에 무상태 프로토콜은 단편적인 요청과 응답으로 이루어지게 됩니다.

반대 개념의 Stateful 방식과 비교해보면 이해하기가 빠를 것입니다. Stateful 방식은 서버가 클라이언트의 상태를 보존합니다. 바꿔 말하면 서버가 해당 클라이언트와 행했던 이전 요청과 응답에 대한 내용들을 모두 (세션에)저장하며 통신을 이어간다는 말입니다. 예를 들면 로그인 상태 같은 느낌이죠.

하지만 Stateful 방식은 문제점이 있습니다. (1) 통신 내용을 모두 기억하고 있어야 하기 때문에 서버에 부담이 가며 (2) 클라이언트가 동일 서비스를 하는 다른 서버와 연결되면 이 새로운 서버는 이전의 서버에 저장된 내용을 알 수가 없다는 것 입니다. 2번의 경우 서버간 통신을 하거나 DB에 저장하면 해결되지만, 그러려면 굳이 서버에 부담을 줘가며 상태를 유지할 필요가 없어지죠.

Stateless는 반대로 서버는 클라이언트의 상태, 통신 내용을 저장하지 않는 방식입니다. 서버는 클라이언트의 요청이 들어올 때, 그에대한 응답을 단편적으로 해주기만 합니다. 이런 통신 방식은 서버에 부담이 훨씬 적기 때문에 Stateful 방식보다 훨씬 많은 클라이언트와 통신을 할 수 있습니다.

Stateless 방식에서는 서버가 클라이언트 상태를 저장하지 않는 대신 클라이언트가 요청을 보낼 때 통신에 필요한 모든 정보를 한 번에 담아 서버에 요청하게 됩니다. 그렇기에 Stateful보다 더 많은 데이터가 소모된다는 단점과, 이전 연결 상태를 서버가 모른다는 단점(ex.로그인이 풀려버리는)이 있습니다.

요약하자면, HTTP는 Stateless 프로토콜입니다. 그리고 Stateless는 단편적인 요청과 응답으로 이루어진 통신 방식입니다. HTTP는 Stateless 의 단점을 극복하기 위해 쿠키라는 것을 사용합니다.

유형 설명 장점 단점
Stateful 서버가 클라이언트의 상태(이전 통신 내용)을 기억하고 있는 방식 연결에 대한 유지 가능 (1)연결이 많아지면 서버에 부담
(2)연결서버가 바뀌면 이전 통신 내용 모름
Stateless 서버가 클라이언트의 상태를 기억하지 않는 방식.
불특정 다수와의 연결에 적합
서버에 부담이 적음 (1)통신에 더 많은 데이터 소모
(2)이전 통신 내용 모름

재밌는 예시와 함꼐 더 정확하고 자세한 설명이 되어있는 블로그 글이 있어 추가로 소개합니다.

아주 쉽게 이해하는 Stateful / Stateless 차이

URL

URL은 인터넷 상의 자원의 위치를 의미합니다. 좀 더 쉽게 말하면 “특정 웹 서버의 특정 파일에 접근하기 위한 경로 혹은 주소”라고 할 수 있습니다.

컴퓨터를 생각해봅시다. 윈도우 컴퓨터에서 cmd 실행파일은 C:\Windows\system32\cmd 에 위치하게 됩니다.

1
C:\Windows\system32\cmd

즉, cmd를 실행시키기 위해서는 C드라이브의 Windows 폴더 안의 system32 폴더로 이동한 뒤 cmd.exe 를 실행시켜야 하는 것이죠. (평소에는 환경변수에 추가되어있어 간단히 실행시킬 수 있습니다.)

URL도 비슷하다고 보면 됩니다. 다만 “내 기기”가 아닌 “다른 기기” 즉, 서버에 접근한다는 차이점이 있습니다. 아래 예시를 들겠습니다.

1
2
3
4
5
6
7
8

http://www.naver.com/index.html

(1) http : 하이퍼 텍스트 트랜스퍼 프로토콜로
(2) www : w3 네트워크의
(3) naver.com : 네이버 서버의
(4) index.html : index.html 리소스에 접근한다.

내 컴퓨터에서 cmd 실행파일에 접근하는 것과 비슷하게 생기지 않았나요?

추가적으로, naver.com과 같은 도메인주소가 아닌, 컴퓨터의 고유한 주소인 IP주소로도 동일한 자원 위치에 접근할 수 있습니다.

1
2
3
4
5
6
7
8

http://223.130.200.107:80/index.html

(1) http : 하이퍼 텍스트 트랜스퍼 프로토콜로
(2) 223.130.200.107 : 해당 IP(NAVER)의
(3) 80 : 80 포트를 통해
(4) index.html : index.html 리소스에 접근한다.

포트

서버에서 제공되는 서비스는 하나의 “포트”를 통해 제공됩니다. 즉, 하나의 서비스는 하나의 포트를 가지고 있어야만 외부에서 접속이 가능하죠.

HTTP 는 통상적으로 80번 포트를 통해 서비스됩니다.
그리고 HTTPS 는 통상적으로 443번 포트를 통해 서비스됩니다.

위에서 예시로 든 네이버의 IP를 보면 :80 과 같이 포트번호가 명시되어있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 잘 알려진 포트 (0~1023) : 국제 도메인 관리기구에 통제

포트번호    설명
22          SSH
25          SMTP
80          HTTP
110         POP3
143         IMAP
443         HTTPS

# 등록 포트 (1024 ~ 49151) : 국제 도메인 관리기구에 등록

포트번호    설명
3306        MySQL
3690        Subversion
5432        PostgreSQL

# 동적 포트 (49152 ~ 65535) : 임시 포트.



HTTP의 메세지

이런 HTTP 통신은 “HTTP 메세지” 를 통해 요청을 하고, 응답을 받는 식으로 진행이 됩니다.

이번에는 간단히 메세지가 어떻게 생겼는지만 알아보고, 더 자세한 설명은 다음 포스트 HTTP 메세지 에서 알아보도록 하겠습니다.

HTTP 메세지는 클라이언트에서 서버에 요청을 하는 “요청(request) 메세지”, 그리고 서버에서 요청에 대한 응답을 하는 “응답(response) 메세지” 두 가지 타입이 있습니다.

그리고 HTTP 메세지는 작성 방식 즉, ‘포맷’이 정해져 있습니다. 포맷은 시작줄(start line), 헤더(header), 빈줄(empty line), 본문(body) 네 부분으로 구성되어있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 요청 메세지

GET /servletquery?a=10&b=90 HTTP/1.1      => 시작 줄 start-line
HOST: www.sk.com                          ┐
User-Agent: Mozilla/4.0                   |
Accept-Language: kr                       |=> 헤더 header
...                                       |
(more data)                               ┘
                                          => 빈줄 empty-line
-12656974                                 ┐
...                                       |=> 본문 body
(more data)                               ┘

1
2
3
4
5
6
7
8
9
10
11
12
13
# 응답 메세지

HTTP/1.1 200 OK                           => 시작 줄 start-line
Date: Thu, 03 jul 2003 12:00:15 GMT       ┐
Server: Apache/1.3.0(Unix)                |
Last-Modified: Sun, 5, May ...            |=> 헤더 header
Content-Length: 6191                      |
Content-Type: text/html                   ┘
                                          => 빈줄 empty-line
<html>                                    ┐
...                                       |=> 본문 body
</html>                                   ┘

각 부분에 담긴 내용은 아래와 같습니다.

부분 요청 메세지 응답 메세지
시작 줄 요청 방식, HTTP 버전 HTTP 버전, 성공 여부
헤더 요청에 대한 설명(메타 정보) 응답에 대한 설명(메타 정보)
빈줄 모든 메타 정보가 전송되었음을 알리는 역할 모든 메타 정보가 전송되었음을 알리는 역할
본문 요청과 관련된 추가적인 정보 응답 문서(document)




Reference

부스트코스 웹 프로그래밍(풀스택) - 윤지수 등 : https://www.boostcourse.org/web316/joinLectures/12943
HTTP : https://ko.wikipedia.org/wiki/HTTP
www : https://ko.wikipedia.org/wiki/%EC%9B%94%EB%93%9C_%EC%99%80%EC%9D%B4%EB%93%9C_%EC%9B%B9
프로토콜 : https://ko.wikipedia.org/wiki/%ED%86%B5%EC%8B%A0%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C
인터넷 프로토콜 스위트 : https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7
%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C_%EC%8A%A4%EC%9C%84%ED%8A%B8
stateful과 stateless : https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Stateful-Stateless-%EC%A0%95%EB%A6%AC
HTTP 메시지 : https://developer.mozilla.org/ko/docs/Web/HTTP/Messages