프록시.. 어디에서 많이 들어봤는데 뭔지 몰라서 궁금했습니다..ㅎㅎ 그래서 스터디에서 주제로 잡아서 발표했어요~
Proxy
프록시가 뭘까요?
- 영어 사전에 검색해보면 '대리, 대리인, 대용물'이라고 나옵니다. (네이버 영어 사전) 대리는 '대리 운전'할 때 '대리'이죠. 남을 대신해서 어떤 일을 해주는 것을 말합니다.
- 프록시는 다양한 곳에서 쓰입니다. 스프링의 프록시 패턴, 네트워크의 프록시 등이 있는데, 이 글에서는 네트워크의 프록시를 다룹니다.
- 참고로 스프링의 프록시 패턴이란, 프록시 객체가 원래 객체를 감싸서 클라이언트의 요청을 처리하게 하는 패턴이라고 합니다. 이 블로그를 참고했습니다. 여기에서도 '프록시 객체'는 원래 객체를 대신해서 일을 해서 '프록시'라는 이름이 붙은 것 같습니다.
- 프록시 서버는 프록시 역할을 하는 서버(대리인 역할을 하는 서버)입니다.
(출처: https://yunyoung1819.tistory.com/9)
위 그림처럼 프록시 서버는 원래 서버와 클라이언트 사이에 있어서, 그 사이에서 일들을 처리해줍니다. 클라이언트의 대리인 역할을 해주는 게 forward proxy이고, 서버의 대리인 역할을 해주는 게 reverse proxy입니다.
다른 프록시 서버들도 있는 것 같지만, 다른 분들이 설명하실 때 forward와 reverse 프록시로 많이 나누시는 것 같아서 저도 그렇게 나눠서 말씀드리겠습니다.
Forward proxy
(출처: https://yunyoung1819.tistory.com/9)
- 포워드 프록시 서버는 클라이언트와 인터넷 사이에 위치합니다.
- 클라이언트 대신 서버에게 요청을 보내고, 서버에게서 받은 응답을 클라이언트에게 줍니다.
- 캐시에 자원 저장하는 특징이 있습니다. 클라이언트가 A요청을 하면 서버가 B 응답을 준다고 해봅시다. 이걸 캐싱해둬서, 내부 망의 다른 클라이언트가 A요청을 또 하면, 캐시에 있는 B응답을 줍니다. 원래 서버 내용이 수정되었는지 체크도 한다고 합니다. 그래서 원래 서버의 내용이 수정되지 않았으면 B응답을 주고, 바뀌었으면 새로 서버에 요청을 해야겠죠. 만약에 안 바뀌었다면 원래 서버와 프록시 서버가 통신을 또 안해도 되니까 응답 시간도 줄이들고, 외부에 요청을 안해도 되니까 네트워크 병목 현상도 방지됩니다.
- 익명성을 보장하는 데 유리해집니다. 클라이언트가 요청을 보낼 때 OS 정보 등 개인 식별 정보 헤더를 서버에 전하게 되는데, 가운데 포워드 프록시가 있으면 클라이언트의 정보를 전하지 않고 포워드 프록시의 정보를 전할 수 있습니다. 그럼 그런 개인 정보를 보호할 수 있겠죠. 이것도 모든 포워드 프록시가 그런 것은 아니고, 그런 것도 있고 아닌 것도 있다고 합니다.
- 프록시 서버를 거치는 요청과 응답들을 필터링할 수 있습니다. 예를 들어서 학교에서는 교육용 사이트만 들어가게 하는 것처럼요. 또 로그도 남겨둘 수 있습니다.
Reverse Proxy
(https://yunyoung1819.tistory.com/9)
- 리버스 프록시는 인터넷과 서버 사이에 위치합니다.
- 웹 서버 앞에 위치하여, 서버로 향하는 요청들을 처리합니다.
캐시를 통한 자원 저장을 할 수 있는데, 이건 위에서 말씀드린 것과 비슷합니다. 클라이언트가 A요청을 주면 서버가 B응답을 준다는 것을 캐싱해둡니다. 그 후 같은 요청이 또 오면 전에 받았던 응답을 줍니다.
보안성이 높아질 수 있습니다. 서버 정보를 클라이언트에게 숨기는 거죠. 실제 서버의 IP 주소 등을 노출하지 않아서 보안이 높아진다고 합니다.
로드 밸런싱(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 → 로드 밸런싱
혹시 잘못된 게 있으면 댓글로 알려주세요:)
'CS 📚' 카테고리의 다른 글
인증 방식(세션-쿠키, JWT 토큰) (3) | 2022.06.13 |
---|---|
HTTP 헤더 간단 정리 (0) | 2022.04.15 |
IPC (Inter Process Communication) (0) | 2022.02.09 |
프로세스와 스레드 (0) | 2021.12.15 |