
Proxy라는 단어는 대리(행위)나 대리권, 대리 투표, 대리인 등을 뜻하며 말 그대로 서버 요청에 대한 대리자 역할을 수행하는 것을 프록시 서버라고 한다.
프록시 서버(Proxy Server)는 클라이언트와 서버 사이에서 동작하는 중간 서버를 의미한다.
클라이언트가 서버에 직접 요청을 보내는 대신 프록시 서버는 클라이언트 요청을 받아 서버로 전달하고, 서버에서 받은 응답을 클라이언트에게 다시 전달하는 중계자 역할을 한다.
프록시 서버는 아래와 같이는 2가지 형태가 있습니다.

클라이언트와 인터넷 사이에 있는 프록시 서버를 뜻한다.포워드 프록시는 클라이언트의 익명성을 보장한다.WAS는 클라이언트에 대해 알 수 없다. IP 역추적을 해도 프록시 서버의 IP만 보인다.캐싱한다.포워드 프록시는 요청을 보내는
클라이언트 측에 설정해두는 프록시 서버로,
클라이언트에서 특정 서버로 요청을 보내기 전에 프록시를 거쳐서 요청을 전송하는 것이다.
때문에 클라이언트의 정보가 아닌 프록시 서버의 정보로 요청을 보내 익명성을 보장할 수 있는 것이다.자세한 내용과 Nginx를 통한 설정 방법은 아래 참고 자료를 통해 확인해보길 바란다.
Nginx 포워드 프록시 사용법1
Nginx 포워드 프록시 사용법2
Nginx 포워드 프록시와 리버스 프록시

로드 밸런싱(Load Balancing)에 사용된다.로드 밸런싱이 가능하다.보안성을 얻는다.리버스 프록시이 진짜 서버인 것처럼 요청을 보내게 되기 때문에 클라이언트는 서버의 정체를 알 수 없어 보안성이 좋다.AWS EC2에서 서버들을 관리하기 때문에 인바운드 보안 규칙을 통해 WAS는 Reverse Proxy Server의 IP로만 접근할 수 있도록 설정하여 보안성을 더욱 개선하였다.캐싱한다.Forward Proxy와 동일하지만 이미 프록시 서버가 캐싱하여 알고 있는 내용도 인터넷을 거친다는 차이가 있어 Forward Proxy가 캐싱된 데이터를 조금 더 빠르게 전송하는 것으로 이해했다.리버스 프록시는 요청을 받는
서버 측에 설정해두는 프록시 서버로,
WAS에 요청이 도달하기 전에 프록시를 거치게 되는 것이다.
이는 WAS가 직접 요청을 받는 것이 아니라 프록시 서버가 요청을 대신 전달받는 것이기 때문에 WAS의익명성을 보장할 수 있는 것이다.
제가 이해한 바를 정리해보면
포워드 프록시는 클라이언트의 정보를 보호하는 것에 효과적이며리버스 프록시는 서버의 정보를 보호하는 것에 효과적이라는 것을 알 수 있었습니다.저의 경우 WAS의 정보를 보호하려는 목적을 가졌고, 이후에 추가할
BlueGreen CI/CD와로드 밸런싱(Load Balancing)작업을 수행할 수 있는 확장성 있는 환경을 만들어두고자Reverse Proxy 서버를 추가하게 되었습니다.
제가 사용할 리버스 프록시의 장점을 한번 나열해보겠습니다.
리버스 프록시는 서버를 직접 노출시키지 않고 클라이언트와의 통신을 중계하므로 서버의 실제 위치를 숨기고 보안을 강화합니다.
프록시 서버로 인해 본래 서버의 IP 주소를 노출시키지 않을 수 있어, 해커들의 DDos 공격과 같은 공격을 막는데 용이하다.
리버스 프록시는 여러 서버로 요청을 분산할 수 있으며, 부하 분산을 구현할 수 있습니다. 이는 트래픽이 여러 서버에 고르게 분산되어 서버의 성능을 향상시키고 가용성을 높이는 데 도움이 됩니다.
리버스 프록시는 정적 리소스를 캐싱하여 동일한 요청에 대한 응답을 빠르게 제공할 수 있으며, 웹 서버의 부하를 줄이고 대역폭을 절약합니다.
리버스 프록시는 클라이언트와의 SSL/TLS 연결을 종단하고, 백엔드 서버와의 일반 HTTP 연결을 사용하게 할 수 있다.
이렇게 함으로써 백엔드 서버에선
요청에 대한 응답에만 집중하도록 하고 들어오는요청의 복호화와응답의 암호화를 모두 리버스 프록시 서버에서 관리하여서버의 부담을 줄여준다.
리버스 프록시는 URL을 변경하거나 재작성할 수 있으며, 서버 측에서 클라이언트에 보다 친화적인 URL을 제공할 수 있습니다.
이처럼 리버스 프록시는 웹 서버, 로드 밸런서, 보안 디바이스, 캐싱 서버 등 다양한 용도로 사용됩니다. 이러한 기능은 웹 응용 프로그램의 안전성, 성능 및 가용성을 향상시키는 데 도움이 됩니다.
WAS의 정보를 보호하여 보안을 강화하고자 리버스 프록시 설정 작업을 진행하게 되었다.Scale Out 했을 때 Load Balancing 기능까지 수행할 수 있다.t2.microubuntu 22.04 AMINginx 1.18.0계정 생성EC2 생성IPv4, IPv6 허용IPv4, IPv6 허용IPv4 허용볼륨 크기는 EC2 프리티어에서 사용할 수 있는 최댓값인 27GiB 설정Swap Memory 설정하여 t2.micro 환경에서 3GB의 메모리 흭득# apt-get 업데이트
sudo apt-get update
# Nginx 설치
sudo apt-get install nginx
sudo service start nginx
# nginx Config 파일 열기
sudo vim /etc/nginx/nginx.conf
# http 설정 바로 아래에 server 설정을 추가하여 리버스 프록시 설정(사용하지 않는 주석 전부 제거)
http {
server {
listen 80; # 포트를 필요에 따라 조정하세요.
#server_name your_domain.com; # 도메인 이름 대신 IP 주소를 사용할 경우 필요 없습니다.
location / {
proxy_pass http://서버_주소:포트; # 백엔드 서버의 IP 주소
proxy_http_version 1.1;
proxy_set_header Connection ""; #504 Bad GateWay 문제 방지
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
이 헤더는 원격 서버로 전달되는 HTTP 요청 헤더 중 하나이다.
$host 변수는 클라이언트가 요청한 호스트 헤더 값을 가지고 있다.
호스트 이름은 일반적으로
도메인 이름이나IP 주소인데,
이를 통해 리버스 프록시는 요청을 받은 원격 서버에게 어디로부터 온 요청인지 알려준다.
이 헤더는 클라이언트의 실제 IP 주소를 리버스 프록시를 통해 전달한다.
이것은 원격 서버가 클라이언트의 실제 IP를 알고자 할 때 사용된다.
일반적으로 HTTP 요청에는 X-Forwarded-For 헤더가 포함되어 있다.
이 헤더는 클라이언트가 어떤 IP 주소를 통해 요청을 보냈는지를 기록하며, 여러 프록시 서버를 거친 경우 쉼표로 구분된 목록으로 기록된다.
Nginx에서 $proxy_add_x_forwarded_for 변수는 이 X-Forwarded-For 헤더의 값을 가져와 저장한다.
이를 통해 서버는 실제 클라이언트의 IP 주소를 파악할 수 있다.
예를 들어, 클라이언트
A에서 요청이 오고, 그 요청이Nginx 프록시 서버를 거쳐 백엔드 서버로 전달되면,
X-Forwarded-For헤더에는"A, Nginx_IP"와 같이 표시된다.
이때$proxy_add_x_forwarded_for변수에는"A, Nginx_IP"와 같은 값이 저장된다.

EC2의 보안 규칙에서 접속하여 스프링부트의 포트(ex. 8080) 에 대해,
EC2 IP의 연결을 허용해준다.
이 설정을 통해 리버스 프록시인 Nginx가 SpringBoot로 요청을 전달할 수 있게 된다.

Nginx EC2의 IP에 80번 포트로 접속했는데 SpringBoot EC2의 IP에 8080번 포트로 접속한 것과 동일한 화면이 출력되는 것을 확인할 수 있다.
또한 SpringBoot의 포트인 8080번으로 접속하면, 접속할 수 없는 것을 알 수 있다.
이는 우리가 AWS의 EC2 보안 그룹의 인바운드 규칙에서 8080번 포트를 외부에서 접속하지 가능하도록 설정해주지 않았기 때문이다.
위와 같은 설정들을 통해 무조건 리버스 프록시를 거쳐서 접속할 수 있게 된 것이다.
WAS에 대한 접근과 정보 노출을 방어했지만 아직 Nginx를 통해서 요청하면 WAS에 요청하는 것과 똑같이 요청하여 데이터를 흭득할 수 있다. 그렇기에 고의적으로 리버스 프록시 서버에 많은 요청을 보내게 되면, 그대로 받아들여 서버에 과부하가 오게 된다.Co:RE는 유저들이 운영 측의 GPT API Key를 사용하여 무료로 응답값을 얻는 형식이다. 때문에 더더욱 많은 고의적인 요청이 보내지면 금전적으로 큰 손해를 볼 수 밖에 없다과도한 트래픽에 대한 방어로 잡았다.Bucket4j 라는 것을 통해 유저들에게 API를 요청할 수 있는 Token을 주고 Token의 사용 시간 또는 사용 횟수에 제한을 걸어, 고의적인 요청을 방어할 수 있다고 한다.