IT STUDY LOG

[네트워크 기초] 02. 아키텍처를 구성하는 요소들 본문

devops bootcamp 4/클라우드 서비스 운영

[네트워크 기초] 02. 아키텍처를 구성하는 요소들

roheerumi 2023. 4. 7. 10:15

# 학습 목표

  • 아키텍처의 구성요소에 대해서 알 수 있다.
  • 프록시, 로드밸런서에 대해 설명할 수 있다.
  • 캐시의 기본 원리와 CDN에 대해 설명할 수 있다.
  • 프록시 서버를 만들고, 프록시 캐시를 컨트롤 할 수 있다.

 


# 학습 내용

목차
1. 프록시 (Proxy)
2. 로드밸런서(Load Balancer)
3. 캐시의 기본 원리 및 적용
4. 캐시 검증 헤더와 조건부 요청
5. 프록시 캐시(Proxy Cache)
6. CDN

1.  프록시(proxy)

프록시(Proxy)란?

- 기존 서버를 대리하여 통신하며 캐시, 로드밸런서, 보안 등 중계 역할을 하는 하는 서버

- 구성 : 클라이언트 - 프록시 서버 - 서버

 > 클라이언트는 프록시 서버를 ‘서버’라고 인식

 > 서버 입장에서는 프록시 서버를 ‘클라이언트’로 인식

 

프록시 서버 위치에 따른 구분

포워드 프록시(forward proxy)

-  클라이언트-서버 구조에서 클라이언트 쪽을 대리하며, 클라이언트에서 서버로 리소스를 요청할 때 직접 요청하지 않고 프록시 서버를 거쳐서 요청

리버스 프록시(reverse proxy)

- 포워드 프록시와 반대의 개념으로, 애플리케이션 서버의 앞에 위치하여 클라이언트가 서버에 요청할 때 리버스 프록시를 호출하고, 리버스 프록시가 원 서버로부터 응답을 전달받아 다시 클라이언트에게 전송하는 역할

- 클라이언트는 리버스 프록시를 서버라고 생각하는 구조

 

프록시 서버의 사용 목적 및 용도

프록시 서버의 사용 목적

- 프라이버시 강화 (ex) 웹 서버에 클라이언트 IP 숨기는 요청

- 암호화

- 네트워크 대역폭 감소 및 성능 향상을 위해 서버 응답 압축

- 정보 보안 위협으로부터 웹 서버를 보호하는 보안 프론트엔드 역할

- 로드밸런싱 구현으로 부하 분산

-  캐싱 프록시를 통해 과부하 방지 및 응답 속도 향상

- 콘텐츠 전송 네트워크 캐시 서버를 통해 응답 향상

- 캐시 서버를 통해 필터링 가능

- 네트워크 트래픽을 로깅 

- 네트워크 서비스 속도를 향상하도록 프록시 설계 

 

리버스 프록시 서버의 예시

- 로드 밸런싱 역할을 수행, 수평 확장

- 요청 전달 위치를 판단하고 결정

- 암호화

 - DDoS와 같은 위협 방어를 위한 보안

- 성능 향상과 서버 부하 감소를 위한 캐싱

- 콘텐츠 전송 네트워크

 

2. 로드밸런서(Load Balancer)

- 가용성을 위해 서비스를 보통 두 대 이상의 서버로 구성할 경우

① 각 서버 IP주소가 다르기 때문에 사용자가 서비스를 호출할 때는 어떤 IP로 서비스를 요청할지 결정할 필요성

② 사용자에 따라 호출하는 서버의 IP가 다르면 특정 서버에 장애가 발생했을 때 전체 사용자에게 영향을 미치지는 않겠지만 여전히 부분적으로 서비스 장애가 발생

∴ 이러한 문제점을 해결하기 위해서 로드 밸런서(Load Balancer)를 사용

 

로드밸런서

- 로드밸런서에 동일한 서비스를 하는 다수의 서버를 등록하고, 요청이 오면 로드 밸런서가 받아 사용자별로 다수의 서버에 요청을 분산시켜 부하를 분산

- 로드밸런서에 서비스를 위한 가상 IP를 하나 제공하고, 사용자는 각 서버의 개별 IP 주소가 아닌 동일한 가상 IP를 통해 각 서버로 접근 

- 로드 밸런서는 각 서버의 서비스 상태를 체크해 서비스가 가능한 서버로만 사용자의 요청을 분산해 서버에서 장애가 발생하더라도 기존 요청을 분산하여 다른 서버에서 서비스를 제공 가능

 

계층별 로드 밸런서

L4 로드 밸런서

- 일반적인 로드 밸런서 동작하는 방식

- TCP, UDP 정보(포트 넘버)를 기반으로 로드 밸런싱을 수행

- 부하를 분산하는 기능뿐만 아니라, TCP 계층에서의 최적화와 보안 기능을 함께 제공

- But, 최근 사용되는 로드 밸런서는 4 계층과 7 계층의 기능을 모두 지원

L7 로드 밸런서

- HTTP, FTP, SMTP와 같은 애플리케이션 프로토콜 정보를 기반으로 로드 밸런싱을 수행

- HTTP 헤더 정보나 URI와 같은 정보를 기반으로 프로토콜을 이해한 후 부하를 분산

- 일반적으로 이런 장비를 ADC(Application Delivery Controller)라고 부르며 리버스 프록시 역할을 수행

- 대부분의 L7 로드밸런서는 4 계층에서 7 계층까지 로드밸런싱 기능을 제공하며, 장애극복(Failover), 리다이렉션의 기능도 함께 수행

 

3. 캐시의 기본 원리 및 적용

캐시란?

- 캐시 : 데이터나 값을 미리 복사해 놓는 임시 장소

- 캐시가 없을 경우 데이터 변경이 없어도 동일한 요청에 네트워크를 통해 또 응답/요청 과정 수행 필요

- 용량이 클수록 비용이 커지고 브라우저의 로딩 속도 지연

- 느린 사용자 경험

 

캐시의 적용

- 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용

- 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근 가능

- 브라우저에 캐시를 저장할 땐 헤더에 cache-control 속성을 통해 캐시가 유효한 시간을 지정 가능

- 캐시 가능 시간 동안 네트워크 재요청, 응답 필요 없음

- 브라우저 로딩 속도가 빠름

- 빠른 사용자 경험 제공

 

캐시 시간이 초과한다면?

- 다시 서버에 요청하고 응답

- 응답 결과를 브라우저가 렌더링 하면 브라우저 캐시는 기존 캐시를 지우고 새 캐시로 데이터를 업데이트, 유효 간 초기화

 

4. 캐시 검증 헤더와 조건부 요청

캐시 유효 시간이 지났지만 변경이 없을 경우 검증하고 사용하려면?

If-Modified-Since 헤더와 Last-modified 헤더

응답 헤더 : Last-modified

- HTTP 응답 헤더의 Last-modified 검증 헤더를 통해 캐시 수정 시간을 확인 가능

- 응답 결과를 캐시에 저장할 때 해당 데이터의 최종 수정일 정보가 담기게 됨

 

요청 헤더 :  If-Modified-Since 

- 캐시 유효 시간이 초가 되더라도 HTTP 요청 헤더에 If-Modified-Since 헤더를 이용해 조건부 요청이 가능

 

 If-Modified-Since, Last-modified의 작동 방식

- 요청 시 서버는 HTTP 요청의  If-Modified-Since 헤더를 확인하고 최종 수정일을 검증하고 변경되지 않았을 경우 304 Not Modified로 HTTP 응답함

- 변경된 데이터가 없으므로 응답 바디가 없음

- 클라이언트는 응답을 확인하고 서버가 보 응답 헤더 정보로 캐시의 메타 데이터를 갱신하여 다시 캐시 유효 시간만큼 유지

- 클라이언트는 캐시에 저장되어 있는 해당 데이터를 재사용하고 캐시에서 조회한 데이터를 렌더링

∴ 네트워크 다운로드 발생하나 용량이 적은 헤더 정보만 다운로드하여 실용적

 

 If-Modified-Since, Last-modified의 단점

- 1초 미만(0.x초) 단위로 캐시 조정 불가능

- 날짜 기반의 로직 사용

- 데이터를 수정해 날짜가 다르더라도 같은 데이터를 수정해 데이터 결과가 똑같은 경우 적용 어려움

- 서버에서 별도의 캐시 로직을 관리하고 싶은 경우 적용 어려움 (ex) 스페이스나 주석처럼 크게 영향이 없는 변경에서 캐시 유지하고 싶은 경우

 

ETag 헤더와 If-None-Match 헤더

응답 헤더 : ETag (Entity Tag)

- 캐시용 데이터에 임의의 고유한 버전 이름을 달아두는 방식 (ex) ETag : "v1.1", ETag : "630dfmope690afk" 등

- 데이터가 변경되면 이 이름을 바꾸어 변경함(Hash를 재생성) (ex) ETag : "630dfmope690afk" -> ETag : "9k19tmdl1djmf"

- 단순하게 ETag만 보내서 같으면 유지, 다르면 다시 받는 방식

 

요청 헤더 : If-None-Match

- 캐시 시간이 초과되어 다시 요청해야 하는 경우 ETag값을 검증해 달라는 요청인 If-None-Match 요청 헤더에 ETag 값을 넣어 조건부 요청

 

ETag, If-None-Match의 작동 방식

- 요청 시 서버는 HTTP 요청의  If-None-Match 헤더를 확인 후 ETag 값과 검증하고 변경되지 않았을 경우 304 Not Modified로 HTTP 응답함

- 변경된 데이터가 없으므로 응답 바디가 없음

- 클라이언트는 응답을 확인하고 서버가 보 응답 헤더 정보로 캐시의 메타 데이터를 갱신하여 다시 캐시 유효 시간만큼 유지

- 클라이언트는 캐시에 저장되어 있는해당 데이터를 재사용하고 캐시에서 조회한 데이터를 렌더링

- 클라이언트는 캐시 메커니즘을 모르고 단순히 서버에 값을 제공하기만 하면 됨

∴ If-Modified-Since, Last-Modifed 방식과 동일하게 효율적이며 캐시 제어 로직을 서버에서 완전 관리 가능

 

캐시와 관련된 헤더 - Cache-Control : 캐시 지시어(directives)

Cache-Control: max-age

- 캐시 유효 시간, 초 단위

Cache-Control: no-cache

- 데이터는 캐시해도 되지만, 항상 Origin 서버에 검증하고 사용

Cache-Control: no-store

- 데이터에 민감한 정보가 있으므로 저장해선 안됨(메모리에서 사용하고 최대한 빨리 삭제)

 

Expires : 캐시 만료일 지정(하위 호환)

- Expires: Mon, 01 Jan 1990 00:;00:00 GMT

- 캐시 만료일을 정확한 날짜로 지정

- HTTP/1.0부터 사용

- 지금은 더 유연한 Cache-Control: max-age를 권장하며 동시 사용 시 Expires는 무시됨

 

5. 프록시 캐시(Proxy Cache)

프록시 서버란?

- 클라이언트가 다른 네트워크 서비스에 간접적으로 접속할 수 있께 하는 컴퓨터 시스템이나 응용 프로그램

- 클라이언트-서버 사이에 대리로 통신을 수행하는 것을 프록시, 그 중계 기능을 하는 서버를 프록시 서버

- 클라이언트-서버가 간접적으로 네트워크에 접속할 수 있어 보안, 캐싱을 통한 성능, 트래픽 분산의 장점

 

프록시 캐시

- 지리적으로 멀리 떨어진 지역의 Origin 서버에 접근하기 보다 중간에 Proxy Cache 서버를 두어 자료를 조회하도록 서버 구성하면 속도 향상

 > Priavte 캐시 : Client에서 사용, 저장하는 캐시

 > Public 캐시 : Proxy Cache Server에서 사용, 저장하는 캐시

 

프록시 캐시와 관련된 헤더 - Cache-Control : 캐시 지시어(directives) 

Cache-Control: public

- 응답이 public 캐시에 저장되어도됨

Cache-Control: private

- default값, 응답이 해당 사용자만을 위한 것으로 private 캐시에 저장되어야 함

Cache-Control: s-maxage

- 프록시 캐시에만 적용되는 max-age

Age: 60(HTTP 헤더)

- 오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간(초)

 

민감한 정보와 같은 정보를 웹 브라우저가 임의로 캐싱할 때 무효화하는 방법? 

프록시 캐시와 관련된 헤더 - Cache-Control : 캐시 지시어(directives) 

Cache-Control: no-cache

- 데이터는 캐시해도 되지만, 항상 Origin 서버에 검증하고 사용

Cache-Control: no-store

- 데이터에 민감한 정보가 있으므로 저장해선 안됨(메모리에서 사용하고 최대한 빨리 삭제)

Cache-Control: must-revalidate

- 캐시 만료 후 최초 조회 시 origin 서버에서 검증해야 함

- origin 서버에 접근 실패하면 반드시 오류 발생 (504 Gateway Timeout)

- must0revalidate는 캐시 유효 시간이라면 캐시를 사용

Pragma: no-cache

- HTTP/1.0 하위 호환

∴ 확실히 캐시 무효화 응답을 하고 싶을 경우 Cache-Control: no-cache, no-store, must0revalidate Pragma: no-cache 지시어를 모두 넣어야 함

 

no-cache vs must-revalidate 동작 방식의 차이

no-cache 기본 동작

① 원 서버에 접근이 가능할 경우

- 클라이언트 -> 프록시 캐시 서버 : 캐시 서버 요청

- 프록시 캐시 서버 -> 원 서버 : 검증 요청

- 원 서버 -> 프록시 캐시 서버 : 304 Not Modified

- 프록시 캐시 서버 -> 클라이언트 : 304 Not Modified

- 클라이언트 : 저장된 캐시 사용해 렌더링

② 원 서버에 접근이 불가능할 경우

- 클라이언트 -> 프록시 캐시 서버 : 캐시 서버 요청

- 프록시 캐시 서버 -> 원 서버 : 검증 요청

- 원 서버 -> 프록시 캐시 서버 : X

- 프록시 캐시 서버 -> 클라이언트 : 200 OK

- 클라이언트 : 오류가 아닌 오래된 캐시 렌더링

 

must-revalidate 기본 동작

① 원 서버에 접근이 불가능할 경우

- 클라이언트 -> 프록시 캐시 서버 : 캐시 서버 요청

- 프록시 캐시 서버 -> 원 서버 : 검증 요청

- 원 서버 -> 프록시 캐시 서버 : X

- 프록시 캐시 서버 -> 클라이언트 : 504 Gateway Timeout

- 클라이언트 : 캐시를 사용하지 않음 (ex) 오래된 통장 잔고를 보여주어선 안 되므로 

 

6. CDN (Content Delivery Network) 

- 콘텐츠를 좀 더 빠르고 효율적으로 제공하기 위해 등장한 서비스

- 원본 서버와 다수의 CDN 데이터 센터로 구성

 

CDN의 특징

- 원본을 복사해 저장할 여러개 캐시 서버로 구성

- 콘텐츠를 요청 받은 경우 데이터 전달이 가장 유리한 캐시 서버에서 관련 콘텐츠르 제공 

- 제공할 콘텐츠를 가지고 있으며, 지리적으로 가장 가까운 캐시 서버가 우선 순위

 

CDN의 동작 방식

- 요청한 곳에서 가장 가까운 CDN 데이터 센터가 해당 콘텐츠를 저장하고 있는지 확인

- 만일 데이터가 존재하지 않는다면, 해당 CDN 데이터 센터를 제외하고 나머지 중 지리적으로 가까운 CDN 데이터 센터를 확인 * 반복

- 만일 모든 CDN 데이터 센터가 데이터를 가지고 있지 않으면 원본 서버에서 콘텐츠를 제공

- 제공된 데이터는 요청한 곳에서 가장 지리적으로 가까운 CDN 데이터 센터에 저장

 

정적 및 동적 콘텐츠

정적 콘텐츠 동적 콘텐츠
- 내용이 거의 변하지 않는 콘텐츠
- HTML, CSS 파일, 동영상과 같이 변화가 없는 콘텐츠
- 개인화되지 않은 개인적인 콘텐츠
- CDN 캐시 서버 저장이 적합
- 접속 시마다 내용이 바뀌거나, 사용자에 따라 다른 내용을 보여주어야 하는 콘텐츠
- 위치, IP 주소, 사용시간 관련 콘텐츠로 사용자 접근 시마다 내용이 변경되는 콘텐츠
- 카드번호, 전화번호 등 개인화된 정보 관련 콘텐츠 
- 컨텐츠가 바뀔 때마다 캐시 서버에 바뀐 컨텐츠가 전파되어야 하므로 '공통적인 부분'을 캐시 서버에 저장
- CDN 캐시 서버에 저장하기 적합하지 않음 
 

CDN의 이점

DDoS 공격에 대해 어느 정도 대응이 가능

- CDN 데이터 센터와 같이 데이터 센터가 지리적으로 여러 곳에 분산될 경우 하나의 서버가 마비되어도 다른 데이터 센터가 동작함

- 데이터 센터들은 거대한 컴퓨팅 능력을 가지고 있어 DDoS 공격으로 서비스 장애가 발생하기 어려움

 

로딩 속도 감소로 인한 사용자 경험 향상

- 페이지 로딩이 짧아져 사이트 이탈이나 잠재 고객 감소와 같은 부정적 효과가 줄어듦

 

트래픽 분산으로 인한 트래픽 관련 비용 절감

- 방대한 요청을 하나의 서비스에서 담당하기 위해서는 고성능 서버와 고성능 인터넷 수용력이 필요 -> 고비용

- 서버를 분산하면 낮은 성능의 인터넷, 서버로도 요청 처리가 가능

- 사용자 경험 향상과 비용 절감 효과

 

CDN 네트워크 구성 방법

Scattered 방식

- 최대한 빠른 응답 속도에 집중하는 방식

- 지리적으로 많은 곳에 저성능의 데이터 센터를 구성하고 연결

- 관리해야하는 데이터 센터가 많아져 데이터 센터 유지 비용이 높아 클라우드 제공자가 관리 비용을 사용자에 전가 -> 고비용

- 수요가 적은 지역에 데이터 센터를 세울 경우 유리

 

Consolidated 방식

- 여러 서버를 통합해 운용하는 방식

- 고성능의 데이터 센터를 통합하여 운용하는 방식

- 응답 시간은 늘어나지만 데이터 센터 수가 줄어들어 관리 및 유지 비용 절감

- 유지 관리 비용이 줄어들어 사용자에게 전가하는 요금이 감소

- 연결 수요가 많은 지역 대상에 데이터 센터를 설립할 경우 적절한 방식

∴ 필요에 따라서 적절한 방식을 선택하여 사용

 

CDN의 시간에 따른 변화

과거

- 빠른 응답 속도에 집중

- 정적 콘텐츠

- Scattered 방식 (데이터 센터를 최대한 분산)

- 응답 속도는 빠르나 고비용

 

현재

- 동적 및 정적 콘텐츠

- 상대적으로 느린 응답 속도, 안정성, 보안에 집중

- Consolidated 방식 (데이터 센터를 대다수 통합)

- 저렴한 비용


# References

- 10 Examples of a Proxy Server

- 6 Examples of a Reverse Proxy

Comments