프록시 패턴과 프록시 서버
2024. 5. 31. 12:07ㆍ면접을 위한 cs 전공지식 노트/디자인 패턴
프록시 패턴?
- 프록시 패턴(Proxy Pattern)은 대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다. 객체 지향 프로그래밍에 접목해 보면 클라이언트가 대상 객체를 직접 쓴느게 아니라 중간에 프록시(대리인)을 거쳐서 쓰는 코드 패턴이다.
중계 대리인을 이용하는 이유?
- 중계 대리인은 클라이언트가 대상 객체에 접근하기 전 흐름을 가로채 클라이언트의 정보(요청)를 필터링 하거나 데이터를 가공하는 역할을 한다.
- 대상 클래스가 민감한 정보를 가지고 있거나 인스턴스화 하기에 무겁거나 추가기능을 가미하고 싶은데, 원본 객체를 수정할 수 없는 상황일 때를 극복하기 위해서이다.
프록시 패턴을 사용해서 누릴 수 있는 효과
- 보안 : 프록시는 클라이언트가 작업을 수행할 수 있는 권한이 있는지 확인하고 검사 결과가 긍정적인 경우에만 요청을 대상으로 전달한다.
- 캐싱 : 프록시가 내부 캐시를 유지하여 데이터가 캐시에 아직 존재하지 않는 경우에만 대상에서 적업이 실행되도록 한다.
- 데이터 유효성 검사 : 프록시가 입력을 대상으로 전달하기 전에 유효성을 검사한다.
- 지연 초기화 : 대상의 생성 비용이 비싸다면 프록시는 그것을 필요로 할 때까지 연기할 수 있다.
- 로깅 : 프록시는 메소드 호출과 상대 매개 변수를 인터셉트하고 이를 기록한다.
- 원격 객체 : 프록시는 원격 위치에 있는 객체를 가져와서 로컬처럼 보이게 할 수 있다.
프록시 서버
프록시 서버는 서버와 클라이언트 사이에 위치한다. 클라이언트가 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 준다.
nginx : 웹 서버 앞단의 프록시 서버로 활용된다. 실제 포트를 숨길 수 있다.
- 로드 밸런싱 : Nginx는 여러 대의 서버에 요청을 분산시키는 로드 밸런싱 기능을 제공한다. 이를 통해 서버의 부하를 고르게 분산시키고, 서버의 성능과 가용성을 향상할 수 있다.
- 캐싱 : Nginx는 프록시 서버로서 동작할 때, 웹 콘텐츠를 캐시 할 수 있다. 이를 통해 동일한 요청에 대해 더 빠른 응답 시간을 제공하고, 원래의 백엔드 서버에 대한 부하를 줄일 수 있다.
- SSL/TLS 종단점 : Nginx는 SSL/TLS 종단점으로서의 기능을 제공한다. 이는 클라이언트와의 통신을 암호화하고, 백엔드 서버는 그럴 필요가 없도록 함으로써, 보안을 강화하고 백엔드 서버의 부하를 줄일 수 있다.
- 정적 컨텐츠 제공 : Nginx는 효율적인 정적 파일 처리 능력을 가지고 있다. 이를 통해 이미지, CSS, JavaScript 파일 등의 정적 컨텐츠를 빠르게 제공할 수 있다.
- 효율적인 리소스 사용 : Nginx는 비동기, 이벤트 주도 구조를 가지고 있어, 수 천 개의 동시 연결을 효과적으로 처리할 수 있다. 이는 메모리 사용량을 최소화하고, 높은 성능을 유지하는데 도움을 준다.
프록시 서버로 사용되는 CloudFlare : 전 세계적으로 분산된 서버가 있다. CDN 서비스 제공
- DDos 공격 방어
- HTTPS 구축 : 별도의 인증서 설치 없이 좀 더 손쉽게 HTTPS 구축가능
CORS(Cross-Origin Resource sharing)
브라우저에는 보안적인 이유로 cross-origin HTTP 요청들을 제한한다. 그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브라우저에서는 요청을 허락하고, 동의하지 않는다면 브라우저에서 거절한다.
이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데, 이를 CORS(Cross-Origin Resource Sharing)라고 부른다.
따라서 브라우저에서 cross-origin 요청을 안전하게 할 수 있도록 하는 메커니즘이다.
Cross-origin?
cross-origin 이란 다음 중 한 가지라도 다른 경우를 말한다.
- 프로토콜 - http와 https는 프로토콜이 다르다.
- 도메인 - domain.com과 other-domain.com은 다르다.
- 포트번호 - 8080 포트와 3000 포트는 다르다.
- 예를 들어 프론트엔드에서는 127.0.0.1:3000으로 테스팅을 하는데 백엔드 서버는 127.0.0.1:12010 포트번호가 다르기 때문에 CORS 에러가 발생한다.
프록시 서버를 둬서 프론트 엔드 서버에서 요청되는 오리진을 백엔드 서버 오리진과 같게 만든다.
- 오리진 : 프로토콜 호스트 이름, 포트의 조합을 말한다.