- 클라이언트 서버 아키텍처, TCP/IP
"웹프로그래밍 스터디"라는 주제로 글을 작성하고자 한다. 그동안 공부하고 싶었던 주제를 정리했는데, 웹개발의 전반적인 내용이 포함될 예정이다. 아마 바쁘다는 핑계로 글 올라오는 속도가 매우 느릴 수 있다. 하루에 한시간씩이라도 시간을 내서 스터디 해야한다!! 라고 내 자신에게 다짐해본다. 아래와 같은 목차로 진행 예정이며, 목차는 변경 될 수는 있다.
목차
https://brunch.co.kr/@springboot/15
HTTP(HyperText Transfer Protocol)는 WWW(World Wide Web, 인터넷에 연결된 컴퓨터들을 통해 정보를 공유할 수 있는 전세계 정보 공간)상에서 정보를 주고 받을 수 있는 통신 프로토콜 이다. HTTP는 W3C 에서 표준화 작업을 진행하며 계속 발전 중인 기술이다.
https://ko.wikipedia.org/wiki/HTTP
웹프로그래밍 스터디 라는 주제로 글을 쓰기 시작하면서 가장 먼저 떠오른 것이 바로 HTTP 이다. 웹서비스에서 가장 중요하고, 웹을 지탱하는 기반기술이기 때문이다. 그렇게 때문에 첫번째 주제로 HTTP를 선택하게 된 것이다. 사실, 웹프로그래머로 살아가면서 많이 신경쓰지 못하고 있는 기술이기도 하다. HTTP 의 모든 내용을 작성하기에는 무리가 있겠지만 (HTTP를 상세하게 정리하면 책 한권으로도 부족하지만...)... 그동안 내가 놓치고 있었던 부분에 대해서 간략하게라도 정리를 하고자 한다. 이번 글은 아래의 목차로 글을 작성하겠다.
1.1 클라이언트-서버 아키텍처
1.2 TCP/IP 계층
1.3 HTTP 메시지
1.4 HTTP 응답 코드
1.5 HTTP 헤더
1.6. HTTPS 에 대해서
웹은 HTTP 라는 프로토콜을 사용하여 서버간 통신을 한다. HTTP 는 클라이언트와 서버의 역할이 명확하게 나누어져있다. 클라이언트 측에서 요청(Request)를 보내고, 서버 측에서 응답(Response)가 되돌아 오는 구조이다. 물론, 클라이언트와 서버는 서로 역할을 바꿀 수도 있다. 클라이언트는 한 번 응답을 보내면 자신이 보낸 응답에 대해서 기억하지 않는다. 보통 스테이트리스(Stateless) 라고도 부르는 HTTP의 중요한 특징이다. 물론, 상태를 유지하기 위해서 쿠키(Cookie) 등의 기술을 사용할 수는 있다.
HTTP 는 웹의 클라이언트 서버 통신을 위한 프로토콜
클라이언트와 서버는 요청, 응답을 수행
상태를 관리하지는 않지만, 쿠키등을 활용하여 기술을 보완
클라이언트와 서버에서 일어나는 일에 대해서 간략하게 정리를 해보면 아래와 같고, 아래 내용은 [웹을 지탱하는 기술 - 멘토르출판사 - 야마모토 요헤이 저 - 121page] 에서 참고하였다.
클라이언트에서 일어나는 일
1. 요청 메시지 구축
2. 요청 메시지 송신
3. (응답이 돌아올 때까지 대기)
4. 응답메시지 수신
5. 응답메시지 해석
6. 클라이언트의 목적을 달성하기 위한 처리 진행
서버에서 일어나는 일
1. (요청을 대기)
2. 요청 메시지 수신
3. 요청 메시지 해석
4. 적절한 애플리케이션 프로그램으로 처리를 위임
5. 애플리케이션 프로그램으로부터 결과를 취득
6. 응답 메시지 구축
7. 응답 메시지 송신
참고로 해당 내용은 [HTTP 완벽 가이드 - 인사이트 출판사 - 데이빗 고울리 외4명] 라는 책에서 완벽하게 다루고 있다. 웹프로그래머 라면 이 책은 책장에 두고 레퍼런스 서적으로 활용하는게 좋을 듯 하다. 어쨋든 HTTP의 클라이언트-서버 아키텍처에 대해서 아주 간략하게 정리를 해봤는데, 사실 HTTP 가 내부적으로 어떻게 동작하는지 알기 위해서는 TCP/IP 에 대해서도 알 필요가 있다. 물론, TCP/IP 를 완벽하게 이해할 필요는 없지만 그래도 알아두면 좋지 않을까? 라는 생각에 다음 1.2 에서는 TCP/IP 에 대해서 다룰 예정이다.
[추가의견] 클라이언트는 요청에 대한 서버에서 응답을 기다리는 동기 프로토콜이다. 비동기 프로토콜의 예로 RabbitMQ에서 사용하는 AMQP 프로토콜이 있다. 주제와는 살짝 벗어나지만 동기 프로토콜 과 비동기 프로토콜에 대한 좋은 글이 있어서 링크를 남겨본다. 마이크로 서비스 아키텍처에 대한 글이지만, 프로토콜에 대한 좋은 내용을 다루고 있다.
또한, HTTP의 클라이언트-서버 통신을 위한 아키텍처로 REST 아키텍처 스타일이 있다. Rest에 대해서는 반드시 이해할 필요가 있고, Rest API 로 설계/구현을 자주 해야 하기 때문에 이 RestAPI 에 대해서는 다음에 꼭 상세하게 다룰 예정이다.
인터넷은 전세계적으로 TCP/IP를 기반으로 하고 있다. TCP/IP 는 어떤 종류의 컴퓨터나 네트워크든 신뢰성 있는 통신을 할 수 있게 해주는 매우 중요한 기술이다. 아래 그림과 같이 클라이언트-서버 통신을 하게 되는데... 그림을 직접 그려봤는데 정말 못그렸지만 대략적인 흐름을 이해할 필요가 있다.
1. 클라이언트는 DNS 를 통해서 naver.com 의 IP 주소를 알 수 있다.
2. 클라이언트는 애플리케이션(HTTP) 계층에서 HTTP 메시지를 작성한다.
3. 클라이언트는 전송계층(TCP)에서 HTTP 를 패킷으로 분해한다.
4,5,6. 클라이언트는 IP 를 통해서 상대가 어디에 있는지 찾아 중계해 가면서 전송한다.
7. 서버는 전송계층(TCP) 에서 패킷을 수신하고 조립한다.
8. 서버는 클라이언트의 요청을 처리한다.
서버는 TCP/IP 통신 순서대로 클라이언트에 반환을 한다. 위에 과정을 똑같이 한번 더 수행하는 것이다. HTTP 통신은 TCP를 통해서 이루어지는데, 클라이언트와 서버는 TCP/IP 커넥션을 맺을 수 있다. 한번 커텍션이 맺어지면 메시지 손상 없이 안전하게 전달된다. 만약 네트워크가 끊기게 되면 서로간의 통신에 문제가 발생할 수 있다. TCP 커넥션 관리에 대해서는 [HTTP 완벽가이드 - 인사이트 - 85p] 에서 상세하게 공부할 수 있다. 추가로 4,5,6 과정을 이해하기 위해서는 OCI 7계층을 참고하면 된다. 네트워크 계층, 데이터 링크 계층, 물리 계층이 있는데... 사실 자세히 모르기 때문에 이부분은 대충 넘어가기로 한다. 너무 궁금하다면 아래의 링크를 통해서 참고하기 바란다.
https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95
TCP/IP 는 어떤 종류의 컴퓨터나 네트워크든 신뢰성 있는 통신을 할 수 있게 해주는 매우 중요한 기술
... 는 다음 글에서 작성
HTTP 관련해서는 정말 간략하게 한번의 포스팅으로 마무리하고 싶었는데, 쓰다보니깐 길어져서 나누어서 작성하기로 한다. 사실 글을 쓰다보니깐, 내 실력이 너무 많이 부족하다는 걸 느끼고... 정말 그동안 어떻게 웹프로그래머로 살아왔는지 회의감이 들 정도다. 열심히 공부를 해야겠다는 생각을 하면서, 다음 글에서는 [웹프로그래밍 스터디 - 1.HTTP 따라잡기(2)] 에서는 HTTP 메시지 및 응답코드, 헤더 등 HTTP 에 대한 나머지 내용을 정리할 예정이다!
https://brunch.co.kr/@springboot/19
아참 그리고, 글이 너무 수박겉핥기라서 부족하다고 생각된다면 아래의 책 3권을 꼭 읽어보길 바란다.
HTTP 완벽 가이드 - 인사이트 출판사
그림으로 배우는 Http & Newwork Basic - 영진닷컴
웹 개발자를 위한 웹을 지탱하는 기술 - 텐토르 출판사