프록시란?

dowon kim·2023년 10월 27일

프록시란 무엇인가?

프록시(proxy)는 네트워크 통신에서 중간 역할을 하는 서버로,
사용자의 요청을 받아 해당 요청을 대신 전송하거나, 외부 네트워크의 서비스에 접근하는 데 사용됩니다.
프록시 서버는 기본적으로 클라이언트와 대상 서버 사이의 게이트웨이 역할을 하며,
보안, 성능 최적화, 회사 또는 교육 기관에서의 인터넷 사용 관리 등 다양한 목적으로 사용됩니다.

프록시 서버의 작동원리

프록시 서버의 작동 원리

프록시 서버는 클라이언트와 목적지 서버 간의 중계자 역할을 합니다.

요청과 응답의 중계 과정

클라이언트(일반적으로 웹 브라우저)가 인터넷 상의 서비스(예: 웹 사이트)에 접근하려고 하면, 해당 요청은 먼저 프록시 서버로 전달됩니다. 프록시 서버는 이 요청을 검토하여 관련 규칙(예: 방화벽 정책, 캐싱 규칙, 등)에 따라 요청을 처리합니다.

  1. 요청 전달: 클라이언트의 원래 요청을 받은 프록시 서버는 이를 목적지 서버로 전달합니다. 이때 프록시 서버는 클라이언트의 IP 주소 등 일부 정보를 숨기거나 수정하여 클라이언트의 익명성을 보장할 수 있습니다.

  2. 응답 수신: 목적지 서버는 요청을 처리한 후 결과를 프록시 서버로 다시 전송합니다. 프록시 서버는 이 정보를 받아 캐시에 저장하거나 클라이언트에게 직접 반환합니다.

이 과정을 통해 프록시 서버는 네트워크 트래픽을 제어하고, 보안을 강화하며, 빠른 인터넷 리소스 접근을 제공합니다.

프록시 서버에서의 데이터 처리

프록시 서버는 데이터를 특별한 방식으로 처리하여 다양한 기능을 수행합니다.

  1. 캐싱: 프록시 서버는 반복적으로 요청되는 리소스의 로컬 복사본을 저장함으로써 네트워크 대역폭을 절약하고 리소스 접근 시간을 줄일 수 있습니다. 캐시된 리소스 요청이 들어오면 프록시 서버는 목적지 서버에 요청을 전달하는 대신 캐시된 데이터를 제공합니다.

  2. 필터링: 기업이나 교육 기관에서는 적절하지 않은 컨텐츠나 위험한 웹사이트를 차단하기 위해 프록시 서버를 사용하여 인터넷 트래픽을 필터링합니다. 이는 특정 URL, IP 주소, 도메인 등을 차단하여 이루어집니다.

  3. 로그 기록: 프록시 서버는 네트워크 트래픽에 대한 자세한 로그를 기록할 수 있습니다.
    이를 통해 네트워크 관리자는 트래픽 패턴을 분석하고, 비정상적인 활동을 탐지하며, 네트워크 정책을 강화할 수 있습니다.

세션 관리와 프록시

프록시 서버는 일반적으로 상태를 유지하지 않는 HTTP 프로토콜에서도 클라이언트 세션을 유지할 수 있게 해줍니다. 이는 특히 로드 밸런싱에서 중요한데, 여러 클라이언트의 요청을 여러 서버에 분산시킬 때, 클라이언트의 연속적인 요청이 같은 서버로 라우팅되도록 세션 상태를 유지합니다.
이 과정은 쿠키나 세션 ID를 사용하여 이루어지며, 사용자의 일관된 경험을 보장하고
백엔드 서버의 부하를 고르게 분산합니다.

프록시 서버는 클라이언트와 백엔드 서버 사이에서 이러한 다양한 작업을 수행함으로써
보안, 성능 최적화, 트래픽 관리 등 네트워크 운영에 필수적인 부분을 담당합니다.

주요 기능 및 이점

  1. 캐싱:

    • 프록시 서버는 자주 요청되는 웹 페이지나 리소스를 캐시(임시 저장)하여,
      같은 요청이 들어왔을 때 빠르게 제공함으로써 대역폭 사용을 줄이고, 로딩 시간을 단축시킵니다.

const express = require('express');
const mcache = require('memory-cache');
const app = express();

const cacheDuration = 5 * 60 * 1000; // 캐시 유지 시간 설정 (예: 5분)

const cacheMiddleware = (req, res, next) => {
  const key = '__express__' + req.originalUrl || req.url;
  const cachedBody = mcache.get(key);

  if (cachedBody) {
    res.send(cachedBody);
    return;
  } else {
    res.sendResponse = res.send;
    res.send = (body) => {
      mcache.put(key, body, cacheDuration);
      res.sendResponse(body);
    };
    next();
  }
};

app.use(cacheMiddleware);

  1. 보안 및 익명성:
    • 사용자의 실제 IP 주소를 숨기고 프록시 서버의 주소를 대신 보여주어 익명성을 제공합니다.
      이는 개인 정보 보호 및 보안 측면에서 유용합니다.
    • 또한, 악성 사이트로부터 네트워크를 보호하기 위해 일종의 방화벽 역할을 합니다.
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();

app.use('/api', createProxyMiddleware({ 
  target: 'http://www.example.org', // 프록시할 서버의 URL
  changeOrigin: true, // 호스트 헤더 변경
}));

app.listen(3000);
  1. 지리적 제한 우회:
    • 특정 지역에서만 접근 가능한 서비스에 다른 지역에서 접근할 수 있도록 합니다.
      프록시 서버가 위치한 지역에 따라 해당 지역에서 제공하는 서비스를 이용할 수 있습니다.
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

const agent = new HttpsProxyAgent('http://<proxy_ip>:<proxy_port>');

axios.get('http://geo-restricted-website.com', { httpsAgent: agent })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });
  1. 콘텐츠 필터링:
    • 학교, 회사 등에서 인터넷 사용을 제어하고, 부적절한 콘텐츠에 대한 접근을 차단합니다. 이를 통해 특정 웹사이트 접근을 통제할 수 있습니다.
const express = require('express');
const app = express();

const blockSelectedWebsites = (req, res, next) => {
  const blockedWebsites = ['www.blockedwebsite.com', 'blockedwebsite.com'];
  const host = req.get('host');

  if (blockedWebsites.includes(host)) {
    res.status(403).send('Forbidden: This website cannot be accessed.');
  } else {
    next();
  }
};

app.use(blockSelectedWebsites);
  1. 로드 밸런싱:
    • 프록시를 사용하여 네트워크 요청을 여러 서버에 분산시켜, 단일 서버에 가해지는 부하를 줄이고, 네트워크 성능과 가용성을 향상시킬 수 있습니다.
const http = require('http');
const httpProxy = require('http-proxy');

const proxy = httpProxy.createProxyServer({});
const server = http.createServer((req, res) => {
  const targets = [
    { target: 'http://localhost:3001' },
    { target: 'http://localhost:3002' }
  ];

  const target = targets[Math.floor(Math.random() * targets.length)];
  proxy.web(req, res, target);
});

server.listen(3000);
  1. 로그 및 감사:
    • 네트워크 사용에 대한 로그를 기록하여, 후에 분석하거나 감사 목적으로 사용할 수 있습니다.
const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');
const app = express();

const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' });

// 모든 요청을 로그 파일에 기록합니다.
app.use(morgan('combined', { stream: accessLogStream }));

프록시 서버의 종류

  1. 포워드 프록시:
    • 클라이언트가 인터넷에 직접 연결되는 것을 대신하여 요청을 전송하고 응답을 가져옵니다.
      일반적으로 조직 내의 보안을 강화하거나 인터넷 사용을 제어하기 위해 사용됩니다.
const { createServer } = require('http');
const { createProxyMiddleware } = require('http-proxy-middleware');

// 포워드 프록시 설정
const proxy = createProxyMiddleware({
  target: 'http://www.example.com', // 실제 서비스 URL
  changeOrigin: true,
});

const server = createServer((req, res) => {
  proxy(req, res, (proxyRes) => {
    // 필요한 경우, 응답을 여기서 조작할 수 있습니다.
  });
});

server.listen(3000, () => {
  console.log('Proxy server listening on port 3000');
});
  1. 리버스 프록시:
    • 외부 클라이언트의 요청을 받아 내부 네트워크의 서버로 전달하며,
      마치 요청 받은 내용이 프록시 서버에서 오는 것처럼 보입니다.
      이는 보안 강화, 로드 밸런싱, 인증 등을 목적으로 사용됩니다.
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');

const app = express();

app.use('/', createProxyMiddleware({ 
  target: 'http://internal.example.com', // 내부 네트워크의 서비스
  changeOrigin: true,
}));

app.listen(3000);
  1. 오픈 프록시:
    • 인터넷 상의 임의의 사용자가 접근할 수 있는 프록시 서버입니다.
      이는 사용자의 익명성을 보장하지만, 때로는 악용될 수도 있습니다.
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

// 오픈 프록시 서버 정보 (이 정보는 인터넷에서 찾을 수 있습니다)
const proxyConfig = 'http://open.proxy.example.com:8080';
const agent = new HttpsProxyAgent(proxyConfig);

axios.get('http://www.geolocation-restricted-site.com', { httpsAgent: agent })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });
  1. 데이터 센터 프록시:
    • 데이터 센터에서 호스팅되는 프록시 서버로, IP 주소가 데이터 센터의 IP 대역에 속합니다.
      주로 SEO, 웹 스크래핑 등에 사용됩니다.
const axios = require('axios');
const proxyAgent = require('proxy-agent');

// 데이터 센터 프록시 서버 정보 (구입한 서비스에서 제공받은 정보를 사용)
const proxyUri = 'http://purchased.proxy.example.com:3128';

axios.get('http://targetwebsite.com', { 
  httpsAgent: new proxyAgent(proxyUri) 
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

프록시 서버는 네트워크 성능 최적화, 보안 강화, 익명성 제공 등 다양한 이점을 제공하지만,
잘못 구성되었을 경우 보안 문제를 초래할 수 있으므로 주의가 필요합니다.

profile
The pain is so persistent that it is like a snail, and the joy is so short that it is like a rabbit's tail running through the fields of autumn

0개의 댓글