웹의 통신 과정을 알기 전, 알아야 할 것이 있다. 바로 HTTP다.
HTTP란?
- 웹에서 데이터를 주고받기 위한 통신 규약(Protocol)
Protocol이란?
- 서로 다른 컴퓨터들끼리 어떻게 말할지를 정한 약속
인터넷상에서 어떻게 통신할까? 에 대한 규칙이라고 생각하면 편하다.
HTTP는 위의 그림과 같이 Header, Body로 나누어져 있다. Header는 메시지를 보내기 위한 정보, Body는 실제 보내지는 메시지를 의미한다. 규칙에 맞게 필요한 정보를 서술하고, 메시지를 담는 형식이다.
HTTP를 다루는 내용이 아니기에 method, version에 관한 정보는 알아서 찾아보자.
Web의 통신 과정
각 계층에 대해 설명할 것이다. 지금은 몰라도 된다.
1) Application Layer
Application Layer는 전송하려는 데이터를 만들어낸다. 주로 HTTP Header, Body를 만든다.
2) Transport Layer
Transport Layer는 데이터를 어떤 방식으로 보낼지 정한다.
이 계층에서는 TCP / UDP 와 같은 전송 프로토콜을 지정한다.
만약 TCP를 사용한다면 HTTP위에 출발지 포트 번호, 도착지 포트 번호, 데이터 전송 순서, 오류 검출 정보를 덧붙이는데 이를 port, 도착 port, 데이터 전송 순서를 씌운다. 이러한 과정을 TCP 세그먼트라고 한다.
3) Internet Layer
Internet Layer에서는 출발지 IP, 도착지 IP에 대한 IP 헤더를 덧씌운다.
4) Network Access Layer
Network Access Layer에서는 지금까지의 데이터를 프레임으로 감싸고, Mac주소를 사용해 주소를 지정한다. 이후 물리적 전송 매체를 통해 데이터를 전달한다.
글만 보면 이해가 잘 안 되니 그림으로 함께 흐름을 살펴보자.
통신 과정 순서
1) Application 계층에서 HTTP를 생성한다. 이때, Header, Body 값을 생성한다. (Application Software 담당)
2) Header에 적혀있는 HTTP 버전을 확인하고, 어떤 전송계층을 사용할 건지 결정한다. (Application Software 담당)
3) 애플리케이션이 Socket.send()로 전송 요청을 한다.
(이후 과정은 HTTP/1.1, 2를 사용한다고 가정)
4) OS의 Transport 계층(TCP)이 HTTP 데이터를 TCP 세그먼트로 감싼다. 이후에 Internet Layer로 내려간다. (OS에서 실행됨)
5) Internet Layer에서 IP를 생성한다. 이후 Network Access Layer로 내려간다. (OS에서 실행됨)
6) 위의 데이터들을 Ethernet 프레임으로 감싼 후 전송한다. (이 과정에서 Mac 주소 설정)
7) 데이터를 수신하는 컴퓨터가 Mac 주소를 확인 후, 맞으면 1~6 과정 거꾸로(씌우는 대신, 하나씩 깐다)
웹 개발자인 나는 뭘 해야할까?
웹 개발자는 Application Layer의 작업을 주로 담당한다. 해당 레이어에서, HTTP만 잘 만들어주면 된다.
현대 시대에서는 3가지의 HTTP version을 자주 사용한다.
HTTP/1.1, HTTP/2 HTTP/3
각각의 버전은 RFC 규약이 명시되어 있다.
- RFC란? 인터넷에서 사용되는 모든 프로토콜, 포맷, 구조를 정의한 공식 문서
https://www.rfc-editor.org/rfc/rfc2616
https://www.rfc-editor.org/rfc/rfc7540
Header에 HTTP version을 명시해야 하고, 이 버전들이 각각 RFC를 가지고 있기에 해당 규칙을 따라 통신하는 것이다.
RFC는 그냥 규칙을 서술해 놓은 문서인데... 누가 구현하는 거지?
-> RFC는 단순히 규칙을 서술해 놓은 공식 문서일 뿐이며, 이를 실제로 구현하는 건 Tomcat, Chrome 같은 서버나 브라우저 소프트웨어들이다. 이러한 소프트웨어들은 RFC 문서를 참고하여 각 프로토콜을 구현하고, 이를 통해 표준화된 방식으로 통신할 수 있게 된다.
SpringBoot의 경우 내장 서버로 Tomcat을 사용한다. Tomcat이 기본값으로 HTTP/1.1을 지원하기에 따로 설정을 하지 않는다면 HTTP/1.1을 사용한다. 만약 HTTP/2.0 버전을 사용하고 싶다면 application.properties or application.yml에 추가 설정을 해주면 된다.
server.http2.enabled=true
다만, HTTP/2는 https 연결만 지원해 추가로 SSL 인증서를 사용해야 한다.
'Web' 카테고리의 다른 글
Web Server / Web Application Server (feat. SSR, CSR) (0) | 2025.06.27 |
---|