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

클라이언트(일반적으로 웹 브라우저)가 인터넷 상의 서비스(예: 웹 사이트)에 접근하려고 하면, 해당 요청은 먼저 프록시 서버로 전달됩니다. 프록시 서버는 이 요청을 검토하여 관련 규칙(예: 방화벽 정책, 캐싱 규칙, 등)에 따라 요청을 처리합니다.
요청 전달: 클라이언트의 원래 요청을 받은 프록시 서버는 이를 목적지 서버로 전달합니다. 이때 프록시 서버는 클라이언트의 IP 주소 등 일부 정보를 숨기거나 수정하여 클라이언트의 익명성을 보장할 수 있습니다.
응답 수신: 목적지 서버는 요청을 처리한 후 결과를 프록시 서버로 다시 전송합니다. 프록시 서버는 이 정보를 받아 캐시에 저장하거나 클라이언트에게 직접 반환합니다.
이 과정을 통해 프록시 서버는 네트워크 트래픽을 제어하고, 보안을 강화하며, 빠른 인터넷 리소스 접근을 제공합니다.
프록시 서버는 데이터를 특별한 방식으로 처리하여 다양한 기능을 수행합니다.
캐싱: 프록시 서버는 반복적으로 요청되는 리소스의 로컬 복사본을 저장함으로써 네트워크 대역폭을 절약하고 리소스 접근 시간을 줄일 수 있습니다. 캐시된 리소스 요청이 들어오면 프록시 서버는 목적지 서버에 요청을 전달하는 대신 캐시된 데이터를 제공합니다.
필터링: 기업이나 교육 기관에서는 적절하지 않은 컨텐츠나 위험한 웹사이트를 차단하기 위해 프록시 서버를 사용하여 인터넷 트래픽을 필터링합니다. 이는 특정 URL, IP 주소, 도메인 등을 차단하여 이루어집니다.
로그 기록: 프록시 서버는 네트워크 트래픽에 대한 자세한 로그를 기록할 수 있습니다.
이를 통해 네트워크 관리자는 트래픽 패턴을 분석하고, 비정상적인 활동을 탐지하며, 네트워크 정책을 강화할 수 있습니다.
프록시 서버는 일반적으로 상태를 유지하지 않는 HTTP 프로토콜에서도 클라이언트 세션을 유지할 수 있게 해줍니다. 이는 특히 로드 밸런싱에서 중요한데, 여러 클라이언트의 요청을 여러 서버에 분산시킬 때, 클라이언트의 연속적인 요청이 같은 서버로 라우팅되도록 세션 상태를 유지합니다.
이 과정은 쿠키나 세션 ID를 사용하여 이루어지며, 사용자의 일관된 경험을 보장하고
백엔드 서버의 부하를 고르게 분산합니다.
프록시 서버는 클라이언트와 백엔드 서버 사이에서 이러한 다양한 작업을 수행함으로써
보안, 성능 최적화, 트래픽 관리 등 네트워크 운영에 필수적인 부분을 담당합니다.
캐싱:

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);

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);

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);
});

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);

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);

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 }));

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');
});

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);

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);
});

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