웹 캐시

웹 캐시는 웹 리소스의 복사본을 저장하여 반복된 요청에 대해 더 빠르고 효율적으로 응답할 수 있도록 하는 기술입니다. 캐시를 활용하면 서버의 부하를 줄이고, 사용자에게 더 빠른 응답을 제공하며, 네트워크 대역폭을 절약할 수 있습니다.



웹 캐시의 작동 원리

캐시 저장

웹 서버가 클라이언트의 요청을 처리하여 응답을 생성하면, 이 응답은 웹 캐시에 저장됩니다. 저장된 응답은 특정 자원(예: 웹 페이지, 이미지, CSS 파일 등)의 복사본입니다.

캐시된 응답 제공

클라이언트가 동일한 자원에 대해 후속 요청을 보낼 때, 웹 캐시는 서버에 직접 요청하지 않고 저장된 응답을 클라이언트에 반환합니다. 이를 통해 응답 속도가 빨라지고 서버의 부하가 줄어듭니다.

유효성 검사 및 업데이트

캐시된 자원은 일정 시간이 지나거나 특정 조건에 따라 유효성을 검사해야 합니다. 유효성 검사는 서버에 요청을 보내 자원의 최신 상태를 확인하고, 필요에 따라 캐시를 업데이트합니다.



웹 캐시의 주요 구성 요소

브라우저 캐시:

클라이언트의 웹 브라우저에 저장되는 캐시입니다. 사용자가 방문한 웹 페이지의 리소스(이미지, CSS, JavaScript 파일 등)를 저장하여, 같은 리소스에 대한 후속 요청 시 빠르게 제공됩니다.

프록시 캐시:

클라이언트와 서버 사이에 위치하는 서버나 프록시가 캐시를 저장합니다. 주로 ISP(인터넷 서비스 제공자)나 기업 네트워크에서 사용됩니다. 프록시 캐시는 여러 사용자의 요청을 처리하며, 서버의 부하를 줄이는 데 도움을 줍니다.
(프록시 캐시의 확장된 형태로는 CDN 존재)

서버 측 캐시:

웹 서버나 애플리케이션 서버에서 자원을 캐시하여, 서버의 응답 속도를 개선합니다. 데이터베이스 쿼리 결과나 동적 웹 페이지의 생성 결과를 캐시할 수 있습니다. 서버 측 캐시는 메모리 기반의 캐시 시스템(Redis, Memcached 등)을 활용할 수 있습니다.



캐싱 전략

캐시 만료 (Expiration)

캐시된 자원의 유효 기간을 설정하여 일정 시간이 지나면 캐시를 만료시키고, 새로운 요청이 들어올 때 서버에서 최신 자원을 받아오게 합니다. Cache-Control 헤더의 max-age, Expires 헤더를 통해 설정할 수 있습니다.

검증 (Validation)

자원이 최신 상태인지 확인하기 위해 서버와 캐시 간에 유효성 검사를 수행합니다.
ETag 또는 Last-Modified 헤더를 사용하여, 캐시된 자원이 변경되었는지 여부를 확인합니다.

조건부 요청 (Conditional Requests)

클라이언트가 자원을 요청할 때, 서버가 자원의 변경 여부에 따라 응답을 달리하는 방식입니다.
If-None-Match와 If-Modified-Since 헤더를 사용하여, 자원이 변경되지 않았으면 304 Not Modified 상태 코드를 반환합니다.

캐시 무효화 (Cache Invalidation)

특정 조건에서 캐시된 자원을 강제로 무효화하여, 최신 자원을 가져오도록 합니다. 이 전략은 주로 서버 측에서 캐시를 관리하는 경우 사용됩니다.



웹 캐시의 장점과 단점

장점:

  • 성능 향상: 자원을 캐시하여 응답 시간을 줄이고, 사용자 경험을 개선합니다.
  • 서버 부하 감소: 서버에 대한 반복 요청을 줄여 서버의 부하를 감소시킵니다.
  • 네트워크 대역폭 절약: 동일한 자원에 대한 요청을 줄여 네트워크 대역폭을 절약합니다.

단점:

  • 데이터 최신성 문제: 캐시된 자원이 오래되거나 최신 상태가 아닐 수 있어 데이터의 신뢰성을 떨어뜨릴 수 있습니다.
  • 캐시 관리 복잡성: 캐시의 유효성, 만료, 무효화 등을 적절히 관리해야 하며, 이는 복잡할 수 있습니다.







프록시 서버

프록시 서버(Proxy Server)는 클라이언트와 서버 간의 중계 역할을 수행하는 서버입니다.
프록시 서버는 클라이언트의 요청을 받아 서버로 전달하고, 서버의 응답을 다시 클라이언트에 전달합니다. 프록시 서버는 다양한 용도로 사용되며, 주로 보안, 성능 향상, 그리고 네트워크 관리 등을 위한 기능을 제공합니다.



프록시 서버의 주요 기능

보안 강화:

  • 익명성 제공: 클라이언트의 IP 주소를 숨기고, 서버에는 프록시 서버의 IP 주소만 전달합니다. 이를 통해 클라이언트의 신원을 보호할 수 있습니다.
  • 필터링 및 차단: 특정 웹 사이트나 콘텐츠에 대한 접근을 차단하거나 필터링하여 네트워크 보안을 강화합니다. 예를 들어, 악성 웹사이트나 불법 콘텐츠에 대한 접근을 차단할 수 있습니다.
  • 방화벽 역할: 외부 네트워크와 내부 네트워크 간의 방화벽 역할을 수행하여, 외부 공격으로부터 내부 네트워크를 보호합니다.

성능 향상:

  • 캐싱: 프록시 서버는 자원의 복사본을 저장하고, 동일한 자원에 대한 후속 요청이 있을 때 저장된 자원을 반환합니다. 이를 통해 서버의 부하를 줄이고 응답 속도를 향상시킵니다.
  • 로드 밸런싱: 여러 서버에 트래픽을 분산시켜 서버의 부하를 줄이고, 서비스의 가용성과 안정성을 높입니다.

콘텐츠 압축 및 최적화:

  • 압축: 서버에서 클라이언트로 전송되는 데이터를 압축하여 대역폭 사용을 줄이고 전송 속도를 높입니다.
  • 최적화: 이미지 크기 조정, HTML/CSS/JavaScript 파일의 압축 등 다양한 최적화 작업을 수행하여 성능을 개선합니다.

트래픽 모니터링 및 로그 기록:

  • 모니터링: 클라이언트의 요청과 서버의 응답을 모니터링하여 네트워크 트래픽을 분석하고 문제를 감지합니다.
  • 로그 기록: 모든 요청과 응답의 로그를 기록하여 추후 분석 및 감사 목적으로 사용합니다.



정방향 프록시(Forward Proxy)

정방향 프록시(Forward Proxy) 서버는 클라이언트와 서버 간의 중계 역할을 하는 서버로, 클라이언트의 요청을 받아서 실제 서버로 전달하고, 서버의 응답을 다시 클라이언트에게 전달하는 구조입니다. 클라이언트는 실제 서버의 IP 주소나 위치를 알지 못하며, 오직 프록시 서버를 통해서만 자원에 접근합니다.

정방향 프록시는 클라이언트와 서버 간의 중계 역할을 통해 보안 강화, 성능 향상, 트래픽 관리 등의 다양한 기능을 제공하며, 네트워크 관리와 보안을 개선하는 데 중요한 역할을 합니다.
주로 기업 네트워크, 학교 및 공공기관, 익명성 보장 및 캐싱을 통한 성능 향상 측면에서 사용됩니다.



정방향 프록시의 작동 과정

  • 클라이언트 요청: 클라이언트는 프록시 서버에 요청을 보냅니다. 이 요청은 프록시 서버를 통해서만 서버로 전달됩니다.

  • 프록시 서버 처리: 프록시 서버는 클라이언트의 요청을 받아, 실제 서버로 전달합니다. 요청이 캐시된 자원에 대한 것일 경우, 프록시 서버는 캐시된 응답을 반환합니다.

  • 서버 응답: 실제 서버는 요청을 처리하고 응답을 프록시 서버에 반환합니다.

  • 프록시 서버 응답: 프록시 서버는 서버의 응답을 받아 클라이언트에게 전달합니다. 이 과정에서 응답을 캐시할 수 있습니다.


정방향 프록시의 주요 기능과 역할

  • 익명성 제공:
    클라이언트의 실제 IP 주소를 숨기고, 프록시 서버의 IP 주소를 서버에 전달합니다. 이를 통해 클라이언트의 신원을 보호하고, 웹사이트에서 클라이언트의 IP 주소를 볼 수 없게 합니다.

  • 콘텐츠 필터링:
    특정 웹 사이트나 콘텐츠에 대한 접근을 차단하거나 필터링할 수 있습니다. 예를 들어, 회사 네트워크에서 불법적인 사이트나 부적절한 콘텐츠에 대한 접근을 차단할 때 사용됩니다.

  • 캐싱:
    클라이언트가 자원을 요청할 때 프록시 서버가 자원의 복사본을 저장하고, 후속 요청에 대해 저장된 자원을 반환합니다. 이를 통해 서버의 부하를 줄이고, 응답 속도를 향상시킬 수 있습니다.

  • 트래픽 관리:
    네트워크 트래픽을 관리하고 제어하는 역할을 합니다. 예를 들어, 대역폭 사용을 조절하거나 특정 시간대에 트래픽을 제한할 수 있습니다.

  • 접속 제어:
    네트워크 보안을 강화하기 위해 접근 제어를 수행할 수 있습니다. 예를 들어, 특정 IP 주소나 사용자에 대해 접근 권한을 제한하거나 허용할 수 있습니다.

  • 로그 기록 및 모니터링:
    클라이언트의 요청과 서버의 응답을 기록하여 네트워크 활동을 모니터링하고 분석합니다. 이를 통해 보안 문제를 감지하거나 네트워크 성능을 개선하는 데 도움을 줄 수 있습니다.


정방향 프록시의 장점

  • 보안: 클라이언트의 IP 주소를 숨기고, 접근 제어 및 필터링을 통해 네트워크 보안을 강화합니다.
  • 성능 향상: 캐싱을 통해 서버 부하를 줄이고, 응답 속도를 개선합니다.
  • 관리 용이: 중앙에서 네트워크 트래픽을 모니터링하고 관리할 수 있습니다.

정방향 프록시의 단점

  • 구성 복잡성: 프록시 서버의 설정 및 관리가 복잡할 수 있습니다.
  • 성능 병목: 모든 클라이언트 요청이 프록시 서버를 거치기 때문에, 프록시 서버가 성능 병목점이 될 수 있습니다.



역방향 프록시(Reverse Proxy)

역방향 프록시(Reverse Proxy)는 클라이언트가 직접 접근할 수 없는 서버나 서버 그룹에 대한 요청을 중계하는 서버입니다. 클라이언트는 역방향 프록시 서버와만 상호작용하고, 실제 서버의 위치나 주소를 알지 못합니다. 역방향 프록시는 클라이언트의 요청을 받아 내부 서버로 전달하고, 내부 서버의 응답을 클라이언트에게 전달합니다.

역방향 프록시는 서버와 클라이언트 간의 중계 역할을 수행하며, 성능 향상, 보안 강화, 트래픽 관리 등의 기능을 통해 웹 애플리케이션의 안정성과 효율성을 높이는 데 중요한 역할을 합니다.



역방향 프록시의 작동 과정

  • 클라이언트 요청: 클라이언트는 역방향 프록시 서버에 요청을 보냅니다. 클라이언트는 이 요청이 실제 서버로 전달될 것이라고 인식합니다.

  • 역방향 프록시 처리: 역방향 프록시는 클라이언트의 요청을 수신하고, 내부 서버 중 하나로 요청을 전달합니다. 이 과정에서 요청을 처리하고 필요한 경우 캐시에서 응답을 반환할 수 있습니다.

  • 서버 응답: 내부 서버는 요청을 처리하고 응답을 역방향 프록시에 반환합니다.

  • 역방향 프록시 응답: 역방향 프록시는 내부 서버로부터 받은 응답을 클라이언트에게 전달합니다. 이 과정에서 응답을 캐시하거나 암호화된 연결을 종료할 수 있습니다.


역방향 프록시의 주요 기능

  • 로드 밸런싱 (Load Balancing):
    클라이언트의 요청을 여러 백엔드 서버에 분산시켜, 서버 간의 부하를 균등하게 분산합니다. 이를 통해 서버의 과부하를 방지하고, 서비스의 가용성과 안정성을 향상시킵니다.
    (예시 : 웹 애플리케이션이 여러 서버에서 실행될 때, 역방향 프록시는 트래픽을 균등하게 분산시켜 서버의 부하를 조절합니다.)

  • 캐싱 (Caching):
    자원의 복사본을 저장하여, 동일한 자원에 대한 후속 요청에 대해 저장된 응답을 반환합니다. 이를 통해 서버의 부하를 줄이고 응답 속도를 향상시킬 수 있습니다.
    (예시 : 이미지, 스타일 시트, 정적 파일 등을 캐시하여 웹 페이지 로딩 시간을 단축합니다.)

  • SSL 종료 (SSL Termination):
    클라이언트와 역방향 프록시 서버 간의 SSL/TLS 암호화 연결을 종료하고, 내부 서버와의 연결은 비암호화된 상태로 유지합니다. 이를 통해 내부 서버의 부하를 줄이고, SSL 처리의 복잡성을 관리합니다.
    (예시 : HTTPS 요청을 역방향 프록시에서 처리하고, 내부 서버와는 HTTP로 통신합니다.)

  • 보안 강화 (Security Enhancement):
    외부 공격으로부터 내부 서버를 보호합니다. 역방향 프록시는 클라이언트와 서버 간의 중계 역할을 하므로, 내부 서버에 대한 직접적인 접근을 차단합니다.
    (예시 : DDoS 공격이나 악성 트래픽을 차단하거나 필터링하여 내부 서버를 보호합니다.)

  • 트래픽 관리 및 모니터링:
    클라이언트의 요청과 서버의 응답을 모니터링하고 분석합니다. 이를 통해 네트워크 트래픽을 제어하고, 성능 문제를 감지할 수 있습니다.
    (예시 : 트래픽 패턴을 분석하여 서버 용량을 조정하거나 문제를 진단합니다.)

  • 애플리케이션 방화벽 (Application Firewall):
    웹 애플리케이션에 대한 공격을 방어합니다. 역방향 프록시는 애플리케이션 계층에서 필터링을 수행하여 SQL 인젝션, XSS와 같은 웹 공격을 차단할 수 있습니다.
    (예시 : OWASP의 웹 애플리케이션 방화벽 규칙을 적용하여 공격을 방어합니다.)


역방향 프록시의 장점

  • 성능 향상: 로드 밸런싱과 캐싱을 통해 서버의 부하를 줄이고 응답 속도를 개선합니다.
  • 보안 강화: 내부 서버를 보호하고, 애플리케이션 방화벽 기능을 통해 웹 애플리케이션 공격을 방어합니다.
  • 관리 용이: 중앙에서 서버 트래픽을 모니터링하고 관리할 수 있으며, SSL 종료 및 보안 설정을 통합적으로 관리할 수 있습니다.

역방향 프록시의 단점

  • 복잡성: 설정 및 관리가 복잡할 수 있으며, 특정 기능을 구현하기 위한 추가적인 구성 작업이 필요할 수 있습니다.
  • 성능 병목: 모든 트래픽이 역방향 프록시를 통과하기 때문에, 역방향 프록시 서버가 성능 병목점이 될 수 있습니다.







L7 로드 밸런서

L7 로드 밸런서 (Layer 7 Load Balancer)는 OSI 모델의 애플리케이션 계층(7계층)에서 동작하는 로드 밸런서입니다. 이는 클라이언트의 요청을 애플리케이션 계층의 세부 정보에 따라 처리하여, 웹 애플리케이션 트래픽을 효율적으로 분산시키는 기능을 제공합니다. L7 로드 밸런서는 HTTP/HTTPS와 같은 애플리케이션 프로토콜을 이해하고, 요청의 내용에 기반하여 트래픽을 분산할 수 있습니다.
프록시 서버는 다양한 보안 및 캐싱 기능을 제공하지만, 성능 병목, 확장성 문제, 단일 실패 지점 등의 단점이 있을 수 있습니다. 로드 밸런서는 이러한 단점을 해결하는 데 도움을 줄 수 있으며, 특히 성능 향상과 고가용성, 확장성을 제공합니다. 따라서 프록시 서버와 로드 밸런서는 서로 보완적인 역할을 하며, 종합적인 네트워크 성능과 안정성을 개선하는 데 기여합니다.

예시로는 Nginx(오픈 소스 웹 서버 및 리버스 프록시 서버로, L7 로드 밸런서 기능을 제공), HAProxy(고성능 L7 로드 밸런서로, 다양한 트래픽 관리 및 라우팅 기능을 지원), AWS Elastic Load Balancer (ALB)(Amazon Web Services의 L7 로드 밸런서 서비스로, 애플리케이션 로드 밸런싱 기능을 제공)가 있습니다.



L7 로드 밸런서의 주요 기능

정교한 라우팅

HTTP 헤더, URL 경로, 쿼리 문자열, 쿠키 등 애플리케이션 계층의 정보를 기반으로 트래픽을 분산합니다. 이를 통해 특정 URL 패턴이나 요청 특성에 따라 적절한 서버로 요청을 전달할 수 있습니다.
예시: /api/v1/* 경로의 요청을 특정 서버 그룹으로 라우팅하거나, 특정 도메인 이름에 따라 다른 백엔드 서버로 요청을 전달합니다.

세션 유지

사용자의 세션 정보를 기반으로 동일한 사용자 요청을 동일한 서버로 라우팅합니다. 이를 통해 사용자 세션의 일관성을 유지할 수 있습니다.
예시: 사용자가 로그인 후, 특정 서버에서 세션을 유지하고 이후 요청도 동일한 서버로 전달하여 사용자 상태를 유지합니다.

정적 콘텐츠와 동적 콘텐츠 분리

정적 콘텐츠(예: 이미지, CSS, JavaScript)와 동적 콘텐츠(예: API 호출, 데이터베이스 쿼리)를 별도로 처리하여 성능을 향상시킵니다.
예시: 정적 콘텐츠는 CDN을 통해 제공하고, 동적 콘텐츠는 애플리케이션 서버로 전달합니다.

SSL 종료 (SSL Termination)

클라이언트와 L7 로드 밸런서 간의 SSL/TLS 암호화 연결을 종료하고, 내부 서버와는 비암호화된 연결을 유지합니다. 이를 통해 내부 서버의 부하를 줄이고 SSL 처리의 복잡성을 관리합니다.
예시: HTTPS 요청을 L7 로드 밸런서에서 처리하고, 내부 서버와는 HTTP로 통신합니다.

정책 기반 라우팅

트래픽을 특정 정책에 따라 분산합니다. 이러한 정책은 HTTP 헤더, URL, 쿠키 값 등 다양한 요청 속성에 따라 결정될 수 있습니다.
예시: 특정 사용자 에이전트(브라우저)에 따라 다른 서버로 요청을 라우팅합니다.

애플리케이션 방화벽

웹 애플리케이션 방화벽(WAF) 기능을 통합하여 애플리케이션 계층의 공격(예: SQL 인젝션, XSS 등)을 방어합니다.
예시: 악성 요청을 필터링하고 차단하여 웹 애플리케이션을 보호합니다.



L7 로드 밸런서의 장점

정교한 트래픽 분산

애플리케이션 계층의 세부 정보에 기반하여 정교한 트래픽 분산이 가능하며, 복잡한 요청 라우팅 규칙을 설정할 수 있습니다.

향상된 성능

정적 콘텐츠와 동적 콘텐츠를 분리하여 처리함으로써 성능을 향상시키고, SSL 종료를 통해 내부 서버의 부하를 줄일 수 있습니다.

보안 강화

애플리케이션 계층에서의 공격을 방어할 수 있는 기능을 통합하여 보안을 강화합니다.

유연한 정책 적용

다양한 요청 속성에 따라 라우팅 정책을 설정할 수 있으며, 세션 유지 및 사용자 맞춤형 트래픽 처리가 가능합니다.



L7 로드 밸런서의 단점

성능 오버헤드

애플리케이션 계층에서 작동하므로, L4 로드 밸런서에 비해 성능 오버헤드가 클 수 있습니다. 트래픽의 내용 분석과 처리 과정이 추가되기 때문입니다.

복잡성 증가

다양한 요청 라우팅 규칙과 정책을 설정해야 하며, 이로 인해 설정과 관리가 복잡할 수 있습니다.

비용

L7 로드 밸런서는 기능이 많고 복잡하여 L4 로드 밸런서에 비해 비용이 더 높을 수 있습니다.







커넥션 타임아웃, 리드 타임아웃

커넥션 타임아웃(Connection Timeout)과 리드 타임아웃(Read Timeout)은 네트워크 연결 및 데이터 전송 과정에서 중요한 두 가지 시간 관련 설정입니다. 이들은 각각 다른 시점에서의 타임아웃을 정의하며, 네트워크 통신의 신뢰성과 효율성을 유지하는 데 도움을 줍니다.
커넥션 타임아웃이 먼저 발생하고, 그 다음에 리드 타임아웃이 적용됩니다. 따라서 리드 타임아웃이 커넥션 타임아웃보다 짧은 경우, 연결이 성공적으로 설정된 후 응답을 받는 데 더 빨리 타임아웃될 수 있습니다. 반대로, 커넥션 타임아웃이 리드 타임아웃보다 짧으면, 서버와의 연결 자체가 실패한 것으로 간주되기 때문에 리드 타임아웃이 발생하지 않습니다.



커넥션 타임아웃 (Connection Timeout)

커넥션 타임아웃은 클라이언트가 서버와의 네트워크 연결을 시도할 때, 연결을 설정하는 데 걸리는 최대 시간을 설정합니다. 이 타임아웃이 지나면, 연결 시도가 실패한 것으로 간주하고, 연결을 종료합니다.

정의:

클라이언트가 서버에 연결을 요청한 후, 서버가 연결을 수립할 때까지 기다리는 최대 시간.

적용 시점:

네트워크 연결이 설정되기 시작할 때, 즉 클라이언트가 서버에 연결을 시도할 때.

용도:

서버가 응답하지 않거나, 네트워크가 불안정하여 연결을 설정할 수 없을 때, 연결 시도를 종료하고 대처할 수 있도록 합니다.

예시:

클라이언트가 웹 서버에 연결을 시도할 때, 서버가 10초 안에 응답하지 않으면 커넥션 타임아웃 설정에 따라 연결을 종료하고, 실패로 처리합니다.



리드 타임아웃 (Read Timeout)

리드 타임아웃은 클라이언트가 서버에 요청을 보낸 후, 서버로부터 응답을 기다리는 최대 시간을 설정합니다. 이 타임아웃이 지나면, 응답이 없거나 데이터 전송이 중단된 것으로 간주하고, 연결을 종료합니다.

정의:

서버가 응답을 보내기 시작한 후, 클라이언트가 데이터를 읽는 데 걸리는 최대 시간.

적용 시점:

연결이 성공적으로 설정된 후, 서버로부터 데이터가 도착하기 시작할 때.

용도:

서버가 응답을 보내지 않거나 데이터 전송이 지연될 때, 클라이언트가 대기하는 시간을 제한하고, 처리할 수 있는 대처 방안을 마련합니다.

예시:

클라이언트가 웹 서버에 데이터를 요청한 후, 서버가 5초 이내에 응답을 보내지 않으면 리드 타임아웃 설정에 따라 연결을 종료하고, 요청을 실패로 처리합니다.

profile
성장하는 프론트엔드 개발자입니다.

0개의 댓글