이번에 웹 서비스의 클라이언트와 서버가 통신하는 과정을 내가 하고 있는 프로젝트를 기반으로 정리해보려고 한다
매번 머리만 끄덕이면서 넘어갔더니 나이 몇살이라고 자꾸 잊어버려서 기록 겸 공부 겸 블로그에 남기기로 했다.
이 스터디를 마지막으로 이제 절대 까먹지 않겠어!!!
웹 서비스의 개요 및 소개
1. 웹 서비스의 구조
- Client
먼저 사용자가 웹브라우저나 앱을 통해 API 요청하게 된다.이에 웹 브라우저는 DNS를 통해 해당 도메인주소의 IP주소를 알아내고 그 주소로 http 또는 https 요청을 웹 서버로 전달하게 된다.
* HTTP/HTTPS 통신
HTTP/HTTPS는 클라이어트와 서버간의 통신을 위한 통신 프로토콜이다. HTTP는 웹 서버와 통신을 수신하기 위해 80번 포트를 이이용하고 HTTPS의 경우 443번 포트를 사용한다. HTTP는 데이터를 전송할때 데이터가 암호화되지 않기 때문에 제 3자가 네트워크 상에서 데이터를 엿볼수 있기에 보안상 취약하다는 단점을 가지고 있다. 이러한 HTTP의 단점을 보완하고자 HTTPS는 SSL/TLS 프로토콜을 사용하여 데이터를 암호화하여 전송한다. 데이터를 암호화할때는 대칭키를 사용하는데 이에 대한 설명은 다음 글에서 따로 더 자세히 알아보도록 하겠다! - Web Server
클라이어트로부터 받은 요청이 정적인 컨텐츠(html, css, js)일 경우 웹 서버에서 바로 응답을 제공해준다. 동적인 컨텐츠의 경우 백엔드 서버로 요청을 전달해준다. 웹 서버는 콘텐츠를 클라이언트로 전달하는 기능 외에도 다양한 역할을 제공하기도 한다.(이는 웹서버의 공통된 기능은 아니지만 대부분의 웹서버가 지원하는 기능이다.)
[웹 서버 기능]
- SSL/TLS 인증 처리 : (다음 글에서 더 자세히 다루겠움!)
- 로드 밸런싱 : 여러 백엔드 서버가 있을 경우, 웹 서버는 요청을 여러 서버에 균등하게 분배하여 서버의 과부하를 방지하고, 가용성과 응답 속도를 향상시킨다.
- 리버스 프록시 기능 : 웹 서버가 클라이언트로부터의 요청을 받아 내부 서버(백엔드 서버)에 전달하고, 그 응답을 클라이언트에게 다시 전달한다.
- 압축 기능 : 데이터를 압축하여 전송함으로써 대역폭 사용을 줄이고, 페이지 로드 시간을 단축시킨다.
- URL rewriting : 웹 서버는 요청받은 URL을 내부적으로 다른 URL로 매핑하거나 변형하는 기능을 제공한다. - Application Server(Backend)
웹 서버로부터 요청을 전달받은 백엔드 서버는 해당 요청을 적절한 컨트롤러(Controller)에 매핑한다. 컨트롤러는 필요한 데이터를 가져오기 위해 서비스(Service)를 호출한다. 비즈니스 로직을 처리하고 데이터를 생성하거나 수정한 후, JSON이나 HTML로 응답을 생성한다. 생성된 응답은 다시 웹 서버에게 전달해준다. - Database
백엔드 서버의 요청을 받아 데이터를 조회하거나 수정하고 처리된 데이터를 다시 백에드 서버에게 전달한다.
2. 웹 서비스 동작 과정
예시로 한번 웹 서비스이 동작 과정을 정리해보도록 하겠다!
사용자가 "https://example.com/login"라는 url를 입력했다고 해보자.
1. 웹 브라우저가 해당 URL로 HTTPS/HTTP 요청을 보낸다.
2. Nginx(웹 서버)가 /login 요청을 받고 정적 파일이 아닌 동적페이지이므로, 이를 백엔드 서버로 프록시한다.
3. 백엔드 서버가 /login 요청을 받게 되면 해당 요청에 필요한 user 정보를 database에 요청한다.
4. Database로 부터 필요한 데이터를 얻은 후 user의 정볼르 확인하고 응답을 HTML, JSON형식으로 생성하여 nginx에게 반환한다.
5. nginx는 이를 웹 브라우저에 다시 https 프로토콜로 전달한다.
6. 웹 브라우저는 로그인 페이지를 렌더링 한다.
다음 글에서는 HTTPS 통신이 어떻게 데이터를 암호화 하는지에 대해서 자세히 공부해보도록 하겠당@