Foward Proxy와 Reverse Proxy

박진형·2022년 1월 10일
1

JWT

목록 보기
4/4

오늘은 Foward Proxy와 Reverse Proxy에 대해 알아보고 Jwt를 사용하는 스프링 프로젝트에 어떻게 적용했는지 알아보기로한다.

Proxy Server란?

서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.

클라이언트가 서버에 요청을 할 때 프록시 서버가 클라이언트 앞에 놓여져, 프록시 서버가 클라이언트의 요청을 가로채 웹서버에 보내는 방식이 Foward Proxy,

클라이언트가 서버에 요청을 할 때 프록시 서버가 서버 앞에 놓여져 리버스 프록시를 호출하고 서버의 응답을 리버스 프록시가 전달 받아 다시 클라이언트로 전달하는 방식이 Reverse Proxy다.

이렇게 보면 별 차이가 없어보이는데 어떤 특징과 차이점이 있는지 그림과 설명을 통해서 알아보자.

Foward Proxy

포워드 프록시는 클라이언트의 요청을 가로채 프록시 서버에서 제한을 하여 직접적인 서버로의 접근을 제한 할 수 있다.
프록시 서버가 클라이언트의 정체를 숨겨줘 서버의 입장에서는 알 수 없다. IP 역추적을 해도 프록시 서버의 IP만 보이기 때문이다.

Reverse Proxy

리버스 프록시는 대표적으로 로드밸런싱에 사용된다. 리버스 프록시를 여러대의 서버 앞에 두면
대용량의 트래픽을 서버가 과부화 되지않도록 리버스 프록시 서버의 로드 밸런서가 로드 밸런싱 해줄 수 있다.

CORS로부터 자유러울 수 있으며 Foward Proxy와 반대로 서버들은 리버스 프록시에 포함된 내부망에 존재하기 때문에 클라이언트는 서버의 정체를 알 수 없다. 보안상 유리하다는 것이다.

프로젝트에 적용

나는 내가 진행하고 있는 프로젝트에 Reverse Proxy를 적용했다. 추후 로드 밸런싱까지 적용해서 적용 전, 후의 스트레스 테스트까지 해볼 생각이다.

나는 리버스 프록시를 사용하기 위해 nginx를 사용했다.
그리고 이전 포스팅에서 프론트와 백엔드에 모두 HTTPS를 적용 했었지만 리버스 프록시를 사용하면 백엔드에는 굳이 HTTPS를 적용할 필요가 없다. 이제 HTTPS에서 HTTP로 되돌아 가는법과 어떻게 리버스 프록시 설정을 해주는지 알아본다.

nginx

이전 포스팅에서 nginx를 설치, 설정하는 과정 모두 설명했었으므로 어떻게 리버스 프록시 설정을 하는지에 대해서만 설명한다.

  • sudo vim /etc/nginx/nginx.conf로 설정 파일을 연다.
    아래와 같이 location /member { } 부분 구문을 추가해준다.

프론트엔드는 https://프론트 도메인/ , 백엔드는 http://백엔드 도메인/ 이라 가정 했을 때
https://프론트 도메인/member/** 와 같은 /member 이하의 요청에는 백엔드로 요청(http://백엔드 도메인/member/** )을 보낸다는 의미다.

여기서 주의할 점은 /member 이하의 모든 경로를 가로채게 되므로 해당 경로가 웹 페이지의 이동 경로인지, API로의 요청인지 모호할 수 있다.

그러므로 API요청을 구분할 수 있도록 API의 모든 요청 경로의 앞부분에 /api 등을 붙여 구분시키도록 변경해야 한다.

이렇게 하면 api로의 요청인지 아닌지 구별할 수 있게 됐다.

Revoke SSL

이제 HTTPS를 다시 HTTP로 되돌리는 방법을 알아본다.
처음에는 그냥 인증서와 HTTPS에 관련된 설정을 지우기만 하면 되는줄 알았는데 이상하게도 도메인으로 들어가면 자동으로 HTTPS로 리다이렉트되는 문제를 겪었다.

이런저런 삽질을 하고 알게된 것은 HTTPS를 HTTP로 되돌리기 위해서는 단순이 HTTPS 관련 설정을 지우는것 뿐만아니라 인증서를 해지해줘야 한다는 것이다. 아마 인증 서버에 내 도메인이 HTTPS를 사용하도록 등록이 되어있기 때문에인 것 같다.

나는 이전 포스팅에서 certbot을 통해서 ssl 인증서를 등록 발급 받았다. 이번에도 똑같이 certbot을 이용하면 된다.

  • sudo certbot revoke --cert-name {백엔드 도메인} 명령어 실행

  • application.yml 에서 HTTPS 관련 설정을 모두 지워준다.

    • server.port를 443이 아닌 원래 사용하던 포트로.
    • 그 외 인증서 관련 설정까지 지워줌.

✋ 프론트 엔드는 어떻게 되돌리나요? (지금 상황에선 해줄 필요 없지만 방법이 궁금한 사람들을 위해)

  • 백엔드와 똑같이 certbot revoke --cert-name {프론드엔드 도메인} 명령어 실행
  • nginx 설정파일을 열어 HTTPS 관련 설정 모두 지워준다.
    • sudo vim /etc/nginx/nginx.conf
    • #managed by Certbot 꼬리표가 붙은 내용을 주석처리 하거나 지워주면 된다.
  • sudo systemctl reload nginx

RequestMapping 및 리액트 API 요청 URL 수정

MemberController

  • 수정 전
  • 수정 후

리액트 Axios 수정

  • 수정 전

  • 수정 후

테스트

  • 로그인을 해서 토큰이 잘 발급되는지 확인한다.

이전엔 토큰이 백엔드 도메인에 들어가 있었지만 이제는 프론트에서 확인할 수 있다.
그리고 별다른 CORS 설정을 할 필요가 없게 되었다.

0개의 댓글