Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[베이] Chapter 3. Web Server & Web Application Server(WAS), Reverse Proxy #18

Merged
merged 4 commits into from
Apr 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file removed docs/chapter2/chapter1.md.txt
Empty file.
Binary file added docs/chapter3/images/01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter3/images/02.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter3/images/03.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter3/images/04.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter3/images/05.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter3/images/06.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter3/images/07.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
41 changes: 41 additions & 0 deletions docs/chapter3/keyword_01.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
### Web server란?

---

- 미리 정해진**(정적인)** 콘텐츠를 준비해두고 요청이 오면 응답으로 주는 서버
- `nginx`에서는 웹 서버가 실행될 때 설정 파일(default)을 읽으면서 실행된다.
- 설정 파일에서 **지정해둔 디렉토리에서, 요청된 문서를 가져와**서 보여주는 방식
- 요청된 문서를 URL에 기입함으로써 각기 다른 페이지를 보여줄 수 있음

(문서를 기입하지 않으면 `index` 키워드를 통해 설정한 디폴트 파일을 보여줌)

- ex) Apache Server, Nginx, IIS(Windows 전용 Web 서버) 등

### Web Server의 구성

---

하드웨어와 소프트웨어로 구분된다.

- 하드웨어: Web Server가 설치되어 있는 컴퓨터
- 소프트웨어: 웹 브라우저 클라이언트로부터 HTTP 요청을 받아

정적인 컨텐츠(.html .jpeg .css 등)를 제공하는 컴퓨터 프로그램


### Web Server의 기능

---

HTTP 프로토콜을 기반으로 하여 클라이언트(웹 브라우저 등)의 요청을 서비스 하는 기능

**요청에 따라 아래의 두 가지 기능 중 적절하게 선택하여 수행한다.**

- 기능 1) 정적인 컨텐츠 제공
- WAS를 거치지 않고 바로 자원을 제공한다.
- 기능 2) 동적인 컨텐츠 제공을 위한 요청 전달
- 클라이언트의 요청(Request)을 WAS에 보내고,

WAS가 처리한 결과를 클라이언트에게 전달(응답, Response)한다.

- 클라이언트는 일반적으로 웹 브라우저를 의미한다.
18 changes: 18 additions & 0 deletions docs/chapter3/keyword_02_1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
### WAS란?

---

- 요청이 올 때마다 해당 요청에 적절한 (동적인) 콘텐츠를 만들어 응답하는 서버
- DB 조회 등 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어짐
- “`Web Container`” 혹은 “`Servlet Container`”라고도 불린다.
- 이때 Container란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말한다.
- 즉, WAS는 JSP, Servlet 구동 환경을 제공한다.
- ex) Node.js, SpringBoot, Apache Tomcat

### WAS의 주요 기능

---

- 프로그램 실행 환경과 DB 접속 기능 제공
- 여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능
- 업무를 처리하는 비즈니스 로직 수행
33 changes: 33 additions & 0 deletions docs/chapter3/keyword_02_2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
### 웹 서버 아키텍쳐의 구조

---

다양한 구조를 가질 수 있다.

- 1) Client -> Web Server -> DB
- 2) Client -> WAS -> DB
- 3) Client -> Web Server -> WAS -> DB

### 3번 구조의 동작 과정

---

![poster](./images/01.png)

1. `Web Server`는 웹 브라우저 클라이언트로부터 HTTP 요청을 받는다.
2. `Web Server`는 클라이언트의 요청(Request)을 WAS에 보낸다.
3. `WAS`는 관련된 Servlet을 메모리에 올린다.
4. `WAS`는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성한다. (Thread Pool 이용)
5. HttpServletRequest와 HttpServletResponse 객체를 생성하여 Servlet에 전달한다.

5-1. Thread는 Servlet의 service() 메서드를 호출한다.

5-2. service() 메서드는 요청에 맞게 doGet() 또는 doPost() 메서드를 호출한다.

```jsx
protected doGet(HttpServletRequest request, HttpServletResponse response)
```

6. doGet() 또는 doPost() 메서드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 `WAS`에 전달한다.
7. `WAS`는 Response 객체를 **HttpResponse** 형태로 바꾸어 `Web Server`에 전달한다.
8. 생성된 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.
151 changes: 151 additions & 0 deletions docs/chapter3/keyword_03.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
### 프록시란?

---

- 프록시(proxy)는 `대리`의 의미로,

빠른 액세스와 안전한 통신을 확보하기 위한 중계 서버를 `프록시 서버`라고 일컫는다. 

- 클라이언트와 웹 서버 중간에 위치하고 있어, **"대리"로 통신을 받아주는 개념**이라 생각하면 된다.

> 네트워크에 연결된 모든 컴퓨터에는 IP가 있다.
> 마찬가지로 프록시 서버는 **네트워크의 자체 IP 주소가 있는 컴퓨터**이다.
> 그러나 때로는 제한된 웹 사이트나 서버에 액세스하여 IP주소를 표시하지 않으려는 경우도 있다.
> 이런 경우, 프록시 서버를 사용하여 같은 결과를 달성할 수 있다.

프록시 서버는 클라이언트의 수신 요청을 수락하고 이러한 요청을 대상 서버로 전달하는
인터넷상의 컴퓨터이며 최종 사용자와 인터넷 사이의 게이트 역할을 한다.

앞에서 언급했듯 자체 IP 주소가 있으며, 클라이언트 시스템과 웹 서버를 글로벌 네트워크에서 분리한다.

→ 즉, 프록시 서버를 통해 다른 IP 주소를 가진 웹 사이트에 액세스 할 수 있다.

![poster](./images/02.png)

**프록시 서버는 클라이언트의 요청을 수락하고 다음 조건에 따라 응답을 생산한다.**

1. 요청된 데이터 또는 페이지가 로컬 캐시에 이미 있는 경우,

프록시 서버 자체가 필요한 검색을 클라이언트에 제공한다.

2. 요청한 데이터 또는 페이지가 로컬 캐시에 없는 경우 프록시 서버는 해당 요청을 대상 서버로 전달한다.

3. 프록시 서버는 클라이언트에 응답을 전송하고 또한 클라이언트에 `캐시`된다.

따라서 프록시 서버는 서버뿐 아니라 클라이언트 역할도 한다고 할 수 있다.

### Forward Proxy

---

일반적으로 프록시라고 하면 포워드 프록시를 뜻한다. 
**클라이언트 대신 프록시 서버가 목적 서버에 통신해주는 구성**을 말한다.

- ex) 회사 내부 인트라넷에서 인터넷상에 있는 서버에 요청할 때 먼저 프록시 서버를 호출하는 방식.

만약 proxy server가 없다면 아래처럼 클라이언트가 직접적으로 액세스할 수 있다.

![poster](./images/03.png)

반면 포워드 프록시를 사용하면 서버에게 **클라이언트가 누구인지 감출 수** 있다.
서버가 응답받은 IP는 포워드 프록시 서버의 IP이기 때문에 클라이언트가 누군지 알 수 없다.

![poster](./images/04.png)

- 우리가 `http://racoon.com` 페이지를 요청하면 포워드 프록시 서버가 **리소스를 대신 받아와** 클라이언트에게 내밀어준다(forward).
- **인터넷보다 프록시 서버를 먼저 호출하게 되면 포워드 프록시**인 것이다.

![poster](./images/05.png)

### Foward Proxy 이점

---

- **클라이언트 보안 측면**
- 보통 정부, 기업 같은 기관에서 제한적인 인터넷 사용을 위한 `방화벽`과 같은 개념으로 사용
- 방문하려는 웹에 직접적인 방문을 방지할 수 있음
- 룰을 추가하면 사용자 전원의 외부 웹사이트로의 액세스를 필터링할 수도 있음

→ **무조건 프록시 서버를 경유**하기 때문!

- **프록시 서버는 페이지 서버의 정보를 캐싱해둔다.**
- 다른 클라이언트가 해당 페이지를 요청할 때, 캐싱된 정보를 그대로 반환할 수 있다.
- 서버의 부하를 줄이는 효과가 있다.
- **클라이언트의 요청은 포워드 프록시 서버를 통과할 때 암호화된다.**
- 암호화된 요청은 다른 서버를 통과할 때 필요한 최소한의 정보만 가짐 → 보안 효과
- 따라서 본 서버에서 IP 주소를 역추적해도 포워드 프록시 서버의 IP 주소만 보여 정체를 파악하기 어렵다.

### Reverse Proxy

---

- 포워드 프록시와 달리 Web Server 쪽에 위치하여 클라이언트의 접근을 최초로 받아

리퀘스트에 해당하는 Web Server에 배분해주는 역할을 함

- 클라이언트는 웹 서비스에 접근할 때 **프록시 서버로 요청**하게 되고,

프록시가 배후(reverse)의 서버로부터 데이터를 가져오는 방식이다.


![poster](./images/06.png)

리버스 프록시는 **서버가 누구인지를 감추는 역할**을 한다.
클라이언트는 리버스 프록시 서버를 먼저 호출하게 되기에 실제 서버의 IP를 알 수 없다.

내부 서버가 직접 서비스를 제공해도 되지만 이렇게 구성하는 이유는 **보안** 때문이다.

> 보통 기업의 네트워크 환경에서는 `DMZ`라고 부르는 내부 네트워크/외부 네트워크 사이에 위치하는 구간이 존재한다.
> 이 구간에는 보통 메일 서버, 웹 서버, FTP 서버 등 외부 서버를 제공하는 서버가 위치하게 된다.
> WAS를 `DMZ`에 놓고 서비스해도 되지만 WAS는 DB와 연결되어 있으므로, WAS가 해킹당할 경우 DB까지 해킹당할 수 있는 문제를 초래할 수 있다.
> 따라서 **리버스 프록시 서버를** `DMZ`**에 두고 실제 서비스 서버는 내부망에 위치시킨 후 서비스하는 것이 일반적**이다.

<aside>
🔥 흔히 서버 아키텍처로 구성하는 web server(nginx) - WAS(tomcat) 분리 형태를 reverse proxy라고 보면 됨 !
</aside>

![poster](./images/07.png)

### Reverse Proxy 이점

---

- **서버를 부담 분산할 수 있다.**
- 유명한 웹 사이트 → 대량의 트래픽을 하나의 싱글 서버로 감당하기 어려움
- 리버스 프록시 서버를 여러개의 본 서버들 앞에 두어 특정 서버가 과부화되 지 않게 `로드밸런싱`
- 클라이언트 요청을 여러 대의 서버로 분산시켜서,
서버의 부하를 골고루 분산하여 서버 성능을 최적화하고, 서버 다운 시간을 줄인다.
- **확장성**
- 새로운 서버를 간단히 프록시 서버에 추가하거나 필요 없어진 서버를 제거할 수 있다.
- **서버 보안 측면**
- 리버스 프록시 서버를 두면 본 서버의 IP 주소를 감출 수 있다 → 해킹 방어
- 요청을 필터링하고 의심스러운 트래픽을 차단하여 악의적인 트래픽으로부터 백엔드 서버를 보호
- **포워드 프록시와 유사하게 캐싱 기능을 갖고 있다.**
- 자주 액세스하는 콘텐츠를 캐시하고 클라이언트에 직접 제공 → 응답 시간 향상

### Foward Proxy & Reverse Proxy

---

- 포워드 프록시 : 클라이언트 단, 리버스 프록시: 서버 단

| Forward Proxy 서버 | 클라이언트 앞에 놓여져 있음 |
| --- | --- |
| Reverse Proxy 서버 | 웹서버/WAS 앞에 놓여 있음 |

| Forward Proxy 서버 | `클라이언트를 보호`, 직접 서버 URL로 요청을 보내고 내부망에서 포워드 프록시 서버를 호출하여 프록시가 요청을 보내게 되어 → 서버에게 클라이언트를 감출 수 있다. |
| --- | --- |
| Reverse Proxy 서버 | `서버를 보호`, 프록시 서버 URL로만 접근이 가능하여 본 서버의 IP 정보를 숨길 수 있다. |

| Forward Proxy 서버 | 내부망에서 클라이언트와 Proxy 서버가 통신하여 인터넷을 통해 외부에서 데이터를 가져온다. |
| --- | --- |
| Reverse Proxy 서버 | 내부망에서 Proxy 서버와 내부망서버가 통신하여 인터넷을 통해 요청이 들어오면 Proxy 서버가 받아 응답해준다. |




<aside>
💡 3주차 내용
`포워드 프록시` → 또 다른 외부(다른 컴퓨터) 서버로 요청을 보내주는 것
`리버스 프록시` → 내부(같은 컴퓨터)의 다른 서버로 요청을 보내주는 것
</aside>