[Server_Note] 1.웹 애플리케이션 구조(1)
웹 애플리케이션 구조
웹 애플리케이션은 다음과 같이 동작합니다.
만약 사용자가 www. kookyung. com 사이트에 접속을 요청한다고 합시다.
원래, IP주소로 서버에 접속해야하지만 도메인 이름으로도 접속이 가능합니다.
이를 가능하게 해주는 것이 DNS(Domain Name Server)인데, DNS에는 IP와 도메인 네임이 매핑되어 있습니다.
우리나라 같은 경우는 www.gabia.com에서 도메인을 관리합니다!
웹 브라우저(Chrome 등)에 사용자가 http:// www. koohkyung. com를 입력하면,
웹브라우저는 DNS 에 매핑된 IP주소를 요청하고, DNS는 웹브라우저에게 매핑된 IP 주소(192.168.0.1)를 전해줍니다.
참고로 HTTP(Hypertext Transfer Protocol)는 하이퍼텍스트 전송 규약으로 클라이언트와 서버가 서로 통신할 수 있게 하기 위한 언어를 정의하는 어플리케이션 규약 입니다.
DNS 에서 IP주소를 받으면, 웹브라우저는 Web Server에 IP 주소(192.168.0.1)로 웹서버에 접속요청을 보냅니다.
그 요청은 WAS를 거쳐 DB로 이동하고 요청된 파일을 DB에서 가져옵니다!
그리고 그 파일은 다시 WAS를 거쳐 웹서버를 통해 웹브라우저에게 전달됩니다!
이것이 웹 애플리케이션의 기본 구조이구요~!
실제론 더 복잡합니다.
Web Server 와 WAS
- Web Server
웹 서버는 클라이언트가 웹 브라우저에게 서버에 페이지 요청을 하면 웹 서버에서 요청을 받아 정적 페이지(.html .jpeg .css 등)을 제공하는 서버입니다.
대표적인 웹 서버에는 Apache, NGINX 와 Windows 전용 웹 서버 인 IIS가 있습니다.
- WAS(Web Application Server)
WAS는 html 만으로 할 수 없는 데이터베이스 조회나 다양한 로직처리 같은 동적인 컨텐츠를 제공하기 위해 만들어진 애플리케이션 서버입니다.
대표적인 WAS에는 Tomcat, Jeus, JBoss, Web Sphere가 있습니다.
WAS는 웹서버와 웹 컨테이너의 결합으로 다양한 기능을 컨테이너에 구현하여 다양한 역할을 수행할 수 있습니다.
클라이언트의 요청이 있을 때 내부의 프로그램을 통해 결과를 만들어 내고 이것을 다시 클라이언트에 전달해주는 역할을 하는 것이 바로 웹 컨테이너입니다.
Web Server와 가장 큰 차이는 이 컨테이너 기능이 가능하냐(동적 기능)가 가장 큽니다.
Web 서버를 반드시 구축해야하는 것은 아니지만, WAS 는 동적 컨텐츠를 제공하기 위해 존재하는 서버이기에 정적 요청이 들어온다면 웹서버보다 수행속도가 느릴 수 밖에 없습니다.
이 때문에 웹 서버를 앞에 두고 필요한 WAS 들을 웹서버에 플러그인 형태로 설정하여 효율적으로 처리되도록 합니다.
IP주소/ 포트 번호
IP 주소는 논리적인 주소로 장비들을 구분하는 주소입니다.
IP 표현방법은 IPv4 와 IPv6 가 있습니다!
IPv4는 32bit 주소이고 8bit 씩 구분해서 10진수로 표현합니다!
예를 들면 255.255.255.255 와 같습니다!
그런데 이제는 PC이외에 스마트폰, TV, 자동차 등도 통신을 하기 때문에 위 주소 체계로는 모든 디바이스를 구분할 수 없습니다!
그 때문에 나온 것이 IPv6입니다~
IPv6는 128bit 주소이고, 16비트씩 끊어서 16진수로 표현합니다!
예를 들면 2001:0DB8:AC10:FE01:0000:0000:0000:0000 과 같습니다!
집 PC를 보면 IPv4 표현방식을 많이 보셨죠? 사실은 통신선을 타고 넘어갈 때 IPv6로 변환되서 나가는 겁니다.
포트 번호(Port number)는 프로세스 번호입니다(0~65535)
IP내에서 프로세스를 구분하기 위해 사용됩니다~ 거의 쓰레드라고 생각하시면 됩니다!
만약 포트번호가 없다고 하고, 두 사람이 하나의 LAN카드에 동시에 접속하려고 한다면 한 사람밖에 서비스를 못 받지 못할 것입니다.
포트번호를 사용하게 되면 두 사람은 서로 다른 포트번호를 할당받아 서비스를 받을 수 있습니다.
0부터 65535의 포트번호가 있습니다!
- 0번 ~ 1023번: 잘 알려진 포트
- 1024번 ~ 49151번: 등록된 포트
- 49152번 ~ 65535번: 동적 포트
잘 알려진 포트 번호(0~1023)는 자주 사용되는 프로세스들이 고정 포트로 사용하고 있고 생략가능합니다!
- 20,21 : 파일 전송 (data,제어)
- 22: SSH(원격 제어)
- 23: 텔넷
- 53: DNS
- 80: 월드 와이드 웹 HTTP
- 443: HTTPS
그리고 다음은 쓰면 안되는 절대로 외워야 하는 포트 번호입니다~
- 8080 : 톰캣 서버의 기본포트
- 1521 : 오라클의 기본 포트
- 3306 : MySQL의 포트번호
방화벽 (Fire Wall)
모든 클라이언트가 웹 서버에 요청했을 때 요청된 파일을 받을 수 있다면, 보안이 너무 위험합니다.
그래서 일반적으로 방화벽(Fire Wall)을 사용합니다.
방화벽은 80포트를 제외한 모든 포트를 차단합니다. 즉, 80포트만 계속 열어두고 시간 단위로 접속을 끊습니다.
그리고 80포트에는 중요하지 한 것이 없는 웹서버만 존재합니다~!
80포트는 누구나 접속할 수 있기에 중요한 것이 있다면 큰일나겠죠?
80포트로 접근한 정상 트래픽은 WAS를 거쳐 DB에 접근할 수 있고,
유해한 트래픽은 WAS,DB로 접근하지 못하고 웹서버에서 끊깁니다.
보통 로그인을 통해 웹의 접근권한을 획득하는데, 웹에 로그인을 하게되면, token(키)를 받게 되고 이 token을 가진 트래픽은 정상트래픽으로 분류되고,
token이 없는 트래픽은 유해한 트래픽이라고 웹서버는 생각하고 차단합니다!
방화벽을 사용하면 이러한 방법으로 보안을 유지할 수 있는 것입니다!
그리고 한 번 접속한 권한은 브라우저에 쿠키로 저장될 수 있습니다!
쿠키는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다.
브라우저는 쿠키를 저장해놓고 동일한 서버 접속 시 쿠키를 요청과 함께 전송해 로그인을 또 할 필요없이 서비스를 받을 수 있습니다!