-
02. HTTP, TCP, Web Socket03. Web/01. Concept 2023. 10. 25. 16:19
1. HTTP(HyperText Transfer Protocol)
- HTTP통신은 Question을 물어보면 반드시 Answer이 돌아오는 비연결지향적인 단방향 통신입니다. 언제든 요청을 하면 그에 해당하는 값으로 답을 줍니다. , 단방향 통신으로 현재는 연결되어 있지 않습니다.
- HTTP의 가장 큰 특징은 request/response 입니다
- HTTP - 7계층(Application layer)
2. TCP(Transmission Control Protocol)
- TCP통신은 Handshake라는 과정으로 서로가 통신을 할 수 있는 상태를 먼저 인증을 하고 나서 통신을 하는 연결지향적인 양방향 통신입니다. 이는 서로에게 언제든 실시간으로 상태를 보낼 수 있으며, 받을 수도 있습니다.
- TCP/IP TCP- 4계층(Transport layer) , IP - 3계층(network layer)
1. 연결지향적
여기서 연결지향적이란 소리는 클라이언트와 서버가 서로 연결된다는 뜻입니다.
2. 3 way handshaking 과 4 way handshaking 작업으로 인한 신뢰성 보장
tcp 통신을 할 때 서버가 통신할 준비가 되어 있는지, 서로 연결해서 데이터를 주고 받을 수 있는지 확인합니다. 여기서 준비가 된다면 통신을 하게되고 준비가 안된다면 서버가 준비가 안됐다는 메시지 혹은 에러등을 사용자에게 보여줄 수 있습니다.
3. 순서 보장
TCP를 통해 데이터를 보내게 되면 패킷의 순서가 보장됩니다. 즉 1 ~ 100번의 패킷이 보내진다면 1 ~ 100번까지 서버에 차례대로 도착하게 됩니다.
3. HTTP와 TCP 통신과정
위의 그림을 보면, 통신을 하기 위해서는 3-way handshake를 통해 데이터를 전송하기 전 연결하는 과정을 거치고, 데이터 전송이 끝나면 4-way handshake를 통해 연결을 끊는 과정을 거칩니다.
위에서 말한대로 TCP통신은 이 3-way handshake와 4-way handshake과정을 거치게 되는데, HTTP통신은 이 TCP통신 기반에서 데이터를 전송하는 부분만 맡아서 역할을 하게 됩니다.
즉, 쉽게말하자면 HTTP 통신을 하기위해서는 OSI 계층에서 TCP 기반인 4계층에서 3-way-handshake로 연결과정을 거치고 7계층에서 HTTP 기반으로 데이터 전송을 하고 다시 4계층에서 4-way-handshake로 연결을 끊는 과정을 거쳐야 한다는것입니다.(세부적으로 다른부분이 있지만 이렇게 이해하면 쉽습니다. 나중에 필요시 더 자세히 보도록 합시다.)
한번 더 쉽게말하자면, TCP통신 자체가 connect -> transmit -> disconnect 의 과정을 거치는데, HTTP통신에서는 connect와 disconnect를 TCP에서 맡고, transmit을 HTTP에서 맡아서 진행한다는 것입니다.
소켓통신 의문점
그렇다면, 여기서 의문이 듭니다. 위에서 소켓 통신은 양방향 통신이며 실시간 통신이 가능하다고 했는데 왜 http통신은 단 방향 통신이 되는 것일까요? TCP통신이나 HTTP통신이나 데이터를 전송할 때 소켓이 사용 되는 것은 동일한데 말입니다.
우선, HTTP통신이 소켓 기반인 이유는 애초에 HTTP는 TCP에 기반하여 만들어졌기 때문입니다. 그렇기에, HTTP통신은 3-way,4-way handshake를 거치고 데이터 전송에도 동일한 소켓이 사용되는데, 이때 데이터 전송에 사용되는 소켓의 통신 방식이 TCP통신의 데이터 전송에서 사용되는 소켓 통신과는 다른 방식으로 사용이 됩니다.(애초에 TCP통신에서 사용되는 소켓은 4계층에서 사용되는 것이고 HTTP통신의 데이터 전송에서 사용되는 소켓은 7계층에서 사용됩니다.) 그렇기에, HTTP통신이 소켓 기반의 통신은 맞지만, 단 방향으로 사용되고 있는 것입니다.
양방향 통신을 위해서 소켓을 사용하도록 하는 프로그래밍을 소켓 프로그래밍이라 했는데, 반대로 HTTP통신을 하기 위한 프로그래밍을 HTTP 프로그래밍이라고도 합니다. 하지만, HTTP 통신에서도 소켓을 사용한다고 했으니 꼭 소켓을 사용한다고 해서 소켓 프로그래밍이라고는 하지 않습니다. 즉, 해당 소켓이 어떠한 용도로 사용 되느냐에 따라 HTTP 프로그래밍이 될 수도 있고, 소켓 프로그래밍이 될 수도 있는 것입니다.
4. HTTP, HTTPS 통신에서 양방향 통신을 위한 웹소켓의 사용
기존의 HTTP통신은 connectionless로 기본적으로 연결이 유지되지 않으며 단방향이라는 특징을 갖고있습니다. 그렇기에 이를 극복하고 양방향이면서 실시간 통신이 필요한 기능들에 대해 여러가지 시도들이 있었습니다.
대표적으로, http polling, http streaming등이 시도되었습니다. 하지만, 비효율적이며 HTTP통신에서의 한계점 때문에 다른 대안이 제시되었습니다.
그리하여, web socket(웹 소켓)이라는 개념이 나오게 됐습니다. 웹 소켓은 일반 소켓(TCP 기반 소켓) 처럼 양방향에 실시간 통신이 가능하며, IP와 포트를 사용한 통신을 한다는 점에서 공통점을 갖고 있습니다. 하지만, 웹 소켓은 기본적으로 HTTP 기반 계층(7 layer)에서 작동 한다는 점에서 일반 소켓이 TCP 기반 계층(4 layer) 에서 작동하는 점과 비교해서 다릅니다.
그렇기에, 웹 소켓과 소켓은 엄연히 다른 것으로 보아야 합니다.
웹 소켓을 기반으로 하는 통신은 WebSocket 프로토콜이라는 새로운 규약에서 이루어집니다. 하지만, 웹 소켓 통신을 위한 별도의 포트는 없으며 포트 80, 443(http:80, https:443)을 사용하도록 설계되어져 있습니다. 그렇기에 HTTP 프로토콜, HTTPS 프로토콜과도 호환이 되도록 설계되어져 있다고 하는 것이다. (기존 HTTP도 포트80, HTTPS는 443에서 이루어지기 때문입니다.)
즉, 조금 더 풀어서 얘기하자면 최초 접속 시 HTTP 혹은 HTTPS 위에서 3-way handshake를 거치고, 그 이후에 웹 소켓을 이용 해야하는 경우에 HTTP Upgrade header라는 걸 사용하여 HTTP 프로토콜에서 혹은 HTTPS 프로토콜에서 WebSocket 프로토콜로 전환 시킵니다.
그렇기에, WebSocket 프로토콜이 HTTP 프로토콜을 대체하는 개념은 아니고 상호보완하는 개념으로 볼 수 있습니다. 더 자세한 내용들에 대해서는 실제로 웹 소켓을 사용할 때 알아보도록 합시다.
HTTPS는 HTTP의 보안이 강화된 버전으로 HTTP를 기반으로 하여 웹서버와 통신을 하되 암호화 통신을 위한 별도의 협의 과정을 거치는것을 의미합니다.
덧붙이자면, 모든 프로토콜에는 기본적으로 사용하는 포트들이 있습니다. SSH는 TCP기반의 22포트를 사용하고, HTTP는 TCP기반의 80포트, HTTPS는 TCP기반의 443포트를 사용합니다. 그렇기에 위에서 웹 소켓통신시에 80포트와 443포트를 사용한다고 했을때 HTTP와 WebSocket 프로토콜이 서로 호환된다고 얘기가 가능한것입니다. 각 프로토콜별 기본 포트
웹 소켓은 HTML5 이후에 나온 개념이기 때문에, html5이전 기술로 구현된 서비스의 경우에는 Socket.io, SocketJS를 사용하며, 이는 html5이전의 기술로 구현된 서비스에서 웹 소켓처럼 사용할 수 있도록 도와주는 기술입니다.
그 외에, 예전에는 웹 소켓은 지원하지 않는 브라우저가 있었으나 현재는 거의 모든 브라우저에서 지원해주고 있으며, 버전이 낮은 경우 위의 Socker.io나 SockerJS를 사용하여 크로스 브라우징을 해주면 됩니다.
reference
'03. Web > 01. Concept' 카테고리의 다른 글
03. JWT (0) 2023.10.25 01. URL 검색 시 동작 원리 (2) 2023.10.25 [WEB] 01. XSS(Cross Site Scripting) (0) 2023.08.02 모의해킹 및 취약점 진단 Road Map (0) 2023.07.30