HTML (내용) + HTTP (전송)
서버에서 저장된 페이지를 전송하는 것.
정적: 저장된 파일을 보냄
동적: 클라이언트에서의 입력을 실행한 결과를 보냄 (ex. DB 유저정보)
→ SSR(Server-Side-Rendering): 서버가 페이지를 만들어서 브라우저(클라이언트)에게 전달한다.
클라이언트에서는 전송받은 파일을 해석해서 결과를 표시한다.
→ HTML이 주, JS는 보조역할
→ 동기식: 하나 바뀔때마다 계속 업데이트
AJAX/Web 2.0
JSON(내용) + HTTP(전송)
웹서버에서 HTML 대신 JSON으로 된 문서를 보내고, 클라이언트를 전송받은 JSON을 해석해서 결과를 표시한다.
→ JS가 주, HTML이 보조
JSON/XML을 DOM 형태로 받아서 처리한다.
DOM(Document Object Model)을 사용해서 처리한다.
→ 비동기: 부분 업데이트 허용
→ DOM업데이트 오버헤드가 커서 Virtual-DOM 개념 등장
MVC 패턴의 등장
JSON(내용) + HTTP(전송)
양방향 통신 (웹소켓)
실시간 API (Node.js 활용) (ex. 동시편집)
→ 동적 컨텐츠의 부하 → 캐싱기능 도입
HTML5 = HTML5+CSS3+ECMAscript+SVG+WebGL
Static
저장된 페이지를 그대로 전달한다.
apache, nginx (localhost:80/hello.html)
Dynamic
클라이언트 요청에 따라 다른 내용을 전달한다.
주로 DB같은 프로그램을 실행한 결과를 전달한다.
tomcat (localhost:8080/hello.jsp)
ex. CGI, ASP, JSP, PHP
Static+Dynamic
localhost:80/hello.jsp
하지만 Dynamic 컨텐츠가 클라이언트 요청마다 서버에 접근한다면 오버헤드가 크다. 따라서 Dynamic 컨텐츠를 Static화 하여 전달한다. (캐싱 기능)
프록시(캐시서버)
클라이언트 네트워크단에서 페이지를 캐싱, 없다면 프록시가 액세스하여 저장 후 업데이트
방화벽과 같이 사용한다.
리버스 프록시
캐싱되지 않은 컨텐츠를 요청하는 경우에만 이를 직접 실행한다.
프로그램을 실행해 결과페이지를 캐싱해서 전달한다.
서버단 캐시: 서버 앞에서 서버의 응답을 캐싱
nginx (웹서비스 겸 리버스 프록시 역할)
클라이언트의 요청 → 브라우저 캐시 → 프록시 서버 → 리버스 프록시 → 네이버 순으로 요청된다.
브라우저에 없다면 프록시로 접근하고, 프록시에도 없다면 리버스 프록시가 네이버에 직접 요청하여 페이지를 가져오는 방식이다.
네이버같이 다수가 사용하는 플랫폼은 네이버에 직접 요청까지 가기에(남들이 접근하지 않은 페이지로 접근하기) 쉽지 않다.
0티어: 스탠드얼론 프로그램
1티어: 웹 브라우저(HTTP 클라이언트)-웹 서버(HTTP 서버)
2티어: HTTP 클라이언트-HTTP 서버/DB 클라이언트-DB 서버
3티어: HTTP 클라이언트-HTTP 서버/WAS 클라이언트 - WAS 서버/DB클라이언트 - DB 서버
n티어: 서버-클라이언트 구조가 추가됨

Web Application Service
WAS 예시: 분산 트랜잭션, 로드밸런싱, 이중화, 동시성 제어
이러한 WAS를 HTTP 클라이언트-DB서버 사이에 넣어 거쳐가도록 만든다.
AWS의 경우에도 NLB(Network Load Balancer)가 L4 계층에 해당하고, ALB(Application Load Balanver)가 L7 계층에 해당한다.
UDP 통신을 NLB에서만 처리할 수 있는 이유도 이와 같은 계층레벨구조 때문이다.

해외간 서버 동기화
한국 서비스와 해외 서비스를 모두 사용할 때 국가별 latency(delay) 문제가 발생한다.
= 한국에 있는 서버를 외국에서 접속하려고 하면 많은 딜레이가 발생한다
-> CDN: 현지에 서버를 증설하여 국가별 서버간 동기화를 도와준다.