CS 📚

많이 들어 본 Proxy

dalin❤️ 2022. 3. 24. 22:12

프록시.. 어디에서 많이 들어봤는데 뭔지 몰라서 궁금했습니다..ㅎㅎ 그래서 스터디에서 주제로 잡아서 발표했어요~

Proxy

프록시가 뭘까요?

  • 영어 사전에 검색해보면 '대리, 대리인, 대용물'이라고 나옵니다. (네이버 영어 사전) 대리는 '대리 운전'할 때 '대리'이죠. 남을 대신해서 어떤 일을 해주는 것을 말합니다.
  • 프록시는 다양한 곳에서 쓰입니다. 스프링의 프록시 패턴, 네트워크의 프록시 등이 있는데, 이 글에서는 네트워크의 프록시를 다룹니다.
    • 참고로 스프링의 프록시 패턴이란, 프록시 객체가 원래 객체를 감싸서 클라이언트의 요청을 처리하게 하는 패턴이라고 합니다. 이 블로그를 참고했습니다. 여기에서도 '프록시 객체'는 원래 객체를 대신해서 일을 해서 '프록시'라는 이름이 붙은 것 같습니다.
  • 프록시 서버는 프록시 역할을 하는 서버(대리인 역할을 하는 서버)입니다.

https://t1.daumcdn.net/cfile/tistory/99A5AC505A439E7F2D

(출처: https://yunyoung1819.tistory.com/9)

위 그림처럼 프록시 서버는 원래 서버와 클라이언트 사이에 있어서, 그 사이에서 일들을 처리해줍니다. 클라이언트의 대리인 역할을 해주는 게 forward proxy이고, 서버의 대리인 역할을 해주는 게 reverse proxy입니다.

다른 프록시 서버들도 있는 것 같지만, 다른 분들이 설명하실 때 forward와 reverse 프록시로 많이 나누시는 것 같아서 저도 그렇게 나눠서 말씀드리겠습니다.

Forward proxy

https://t1.daumcdn.net/cfile/tistory/990743455A43A1A109

(출처: https://yunyoung1819.tistory.com/9)

  • 포워드 프록시 서버는 클라이언트와 인터넷 사이에 위치합니다.
  • 클라이언트 대신 서버에게 요청을 보내고, 서버에게서 받은 응답을 클라이언트에게 줍니다.
  1. 캐시에 자원 저장하는 특징이 있습니다. 클라이언트가 A요청을 하면 서버가 B 응답을 준다고 해봅시다. 이걸 캐싱해둬서, 내부 망의 다른 클라이언트가 A요청을 또 하면, 캐시에 있는 B응답을 줍니다. 원래 서버 내용이 수정되었는지 체크도 한다고 합니다. 그래서 원래 서버의 내용이 수정되지 않았으면 B응답을 주고, 바뀌었으면 새로 서버에 요청을 해야겠죠. 만약에 안 바뀌었다면 원래 서버와 프록시 서버가 통신을 또 안해도 되니까 응답 시간도 줄이들고, 외부에 요청을 안해도 되니까 네트워크 병목 현상도 방지됩니다.
  2. 익명성을 보장하는 데 유리해집니다. 클라이언트가 요청을 보낼 때 OS 정보 등 개인 식별 정보 헤더를 서버에 전하게 되는데, 가운데 포워드 프록시가 있으면 클라이언트의 정보를 전하지 않고 포워드 프록시의 정보를 전할 수 있습니다. 그럼 그런 개인 정보를 보호할 수 있겠죠. 이것도 모든 포워드 프록시가 그런 것은 아니고, 그런 것도 있고 아닌 것도 있다고 합니다.
  3. 프록시 서버를 거치는 요청과 응답들을 필터링할 수 있습니다. 예를 들어서 학교에서는 교육용 사이트만 들어가게 하는 것처럼요. 또 로그도 남겨둘 수 있습니다.

Reverse Proxy

https://t1.daumcdn.net/cfile/tistory/992759465A43A1DA30

(https://yunyoung1819.tistory.com/9)

  • 리버스 프록시는 인터넷과 서버 사이에 위치합니다.
  • 웹 서버 앞에 위치하여, 서버로 향하는 요청들을 처리합니다.
  1. 캐시를 통한 자원 저장을 할 수 있는데, 이건 위에서 말씀드린 것과 비슷합니다. 클라이언트가 A요청을 주면 서버가 B응답을 준다는 것을 캐싱해둡니다. 그 후 같은 요청이 또 오면 전에 받았던 응답을 줍니다.

  2. 보안성이 높아질 수 있습니다. 서버 정보를 클라이언트에게 숨기는 거죠. 실제 서버의 IP 주소 등을 노출하지 않아서 보안이 높아진다고 합니다.

  3. 로드 밸런싱(Load Balancing. 부하 분산)을 할 수 있습니다. 클라이언트들이 무수히 많고, 이들이 서버에 많은 요청을 할텐데 서버가 하나밖에 없으면 너무 힘들겠죠?! 서버의 하드 웨어 성능을 높이는 '스케일 업' 방법으로 많은 요청을 처리하려고 할 수 있지만, 하드웨어 성능을 높이는 데는 한계가 있다고 합니다. 또 서버가 한 대인데 거기에서 장애가 생기면 큰 일이겠죠?! 그래서 여러 대의 서버를 두고, 클라이언트의 요청을 이 서버들에 분산시키는 로드 밸런싱을 합니다.

    • 여러 계층에서 로드 밸런싱을 할 수 있는데, 주로 4, 7 계층을 강조하시더라고요.
    • 4계층에서는 IP와 포트 번호를 가지고 로드 밸런싱을 수행합니다. 패킷 레벨에서 분산해서 속도가 비교적 빠른데, 데이터 내부는 안봐서 더 세부적으로 나눠줄 수는 없다고 합니다..

    출처: https://post.naver.com/viewer/postView.nhn?volumeNo=27046347&memberNo=2521903

  • 7계층에서는 Ip, 포트 정보에 더해서 URI, http 헤더, 쿠키 등 사용자의 요청 정보를 가지고 로드 밸런싱을 수행합니다. 예를 들어서 URI를 가지고 회원가입만 담당하는 서버, 메신저를 담당하는 서버 등으로 분리해서 각각 서버에 요청을 보내줍니다. 4계층에서 분산하는것과 비교해서 더 섬세하게 나눠줄 수 있겠죠. 또 비정상적인 트래픽을 필터링하거나, 바이러스를 감지할 수도 있다고 합니다.

  • 출처: https://post.naver.com/viewer/postView.nhn?volumeNo=27046347&memberNo=2521903

리버스 프록시를 사용하는 예시를 들어볼게요.

이전 프로젝트에서 인프라 쪽을 맡아주신 팀원분께서 'nginx를 이용한 reverse proxy를 구성'했고, 'URI에 따라서 백엔드와 openvidu 서버로 각각 연결'했다고 하신 적이 있어요. 그때는 그 말이 잘 이해가 안되었는데 지금 보니 7계층에서 로드 밸런싱을 해주었다는 말씀이었네요~

또 리버스 프록시 서버를 활용해 무중단 배포도 가능하다고 해요! 배포할 때 변경 사항 있는데 서버가 하나라면 잠깐이지만 서버가 중단될텐데요. 서버에 서로 다른 포트로 사이트를 띄운 후에, Nginx의 reverse proxy를 이용하여 포트를 번갈아가면서 접근하게 하면 된다고 합니다. 이 블로그 글을 참고했습니다. 그림과 설명이 있으니 더 궁금하신 분은 보시면 좋을 것 같습니다~

참고 자료

https://www.youtube.com/watch?v=YxwYhenZ3BE

https://www.youtube.com/watch?v=lg-wHikZg0Q

https://www.youtube.com/watch?v=u4O4zHdiFhk

-> 위 세 개는 테코톡 유튜브입니다👍

https://ko.wikipedia.org/wiki/프록시_서버

https://yunyoung1819.tistory.com/9

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=songintae92&logNo=221362831110

-> 무중단 배포에 관한 글

https://post.naver.com/viewer/postView.nhn?volumeNo=27046347&memberNo=2521903 → 로드 밸런싱

혹시 잘못된 게 있으면 댓글로 알려주세요:)

728x90

'CS 📚' 카테고리의 다른 글

인증 방식(세션-쿠키, JWT 토큰)  (3) 2022.06.13
HTTP 헤더 간단 정리  (0) 2022.04.15
IPC (Inter Process Communication)  (0) 2022.02.09
프로세스와 스레드  (0) 2021.12.15