arrow_upward
본문 바로가기
DevOps

[Apache] 아파치 서버 SSL, 리버스 프록시 설정

by dawncode 2024. 4. 26.

 

이전에 프로젝트를 진행 당시 클라이언트 사이드는 리액트로 구성했었고 서버는 FastAPI로 구성했을 때 클라이언트와 서버간 통신에서 자바스크립트의 Fetch API는 기본적으로 Same-Origin 정책을 따르기 때문에 CORS문제를 해결해야 했다.

서버의 CORS설정으로 포트를 허용하는 방법도 있지만 동일한 출처(Origin)이 아닐 때 포트를 허용하는 것이 보안상으로 좋지 않기때문에 리버스 프록시를 한번 설정해보기로 했었다.

이 때 작업을 하면서 아파치 서버에 SSL, 리버스 프록시를 설정했던 것을 기록하려 한다.



아파치 서버 설정

우선 리눅스는 우분투 서버를 기준으로 설명할 것이다.

우분투에서 아파치 서버를 설치하려면 apache2를 설치해주면 된다.

# apache2 패키지 설치
sudo apt install apache2

 

아파치 서버를 설치하고 나서 /etc/apache2 경로로 이동하면 아파치 서버의 설정 파일 및 디렉토리들을 확인할 수 있다. 간단하게 확인해보겠다.

  • apache2.conf: 아파치 서버의 전반적인 구성을 정의한 설정 파일
  • ports.conf: 아파치 서버가 어떤 포트를 통해서 들어오는 연결을 허용할지 결정하는 설정 파일
  • *available: 사용하는 모듈 설정 파일들을 저장하는 디렉토리들이다.
  • *enabled: 모듈 설정 파일중 활성화 하고자 하는 파일만 포함시키는 디렉토리이다. 이 디렉토리에는 *available 디렉토리에 있는 파일들의 심볼릭 링크를 갖는다.

 

apache2.conf 파일을 열어보면 *enable 디렉토리들을 읽어들이는 것을 볼 수 있다.





포트 설정(ports.conf)

우선 사용하고자 하는 포트를 허용해야 한다.



  • Listen 80: 아파치 서버가 80번 포트를 듣고 있다는 의미로 프로젝트의 포트를 적어주면 된다.
  • IFModule: 이 태그는 해당 모듈이 활성화 되있을 때 동작한다는 의미로 기본적으로 ssl_module이 활성화되면 443번 포트를 허용한다는 것이다.
  • ssl_module: HTTPS 통신을 위한 모듈이다.
  • mod_guntls.c: SSL과 TLS 프로토콜을 사용하여 웹 통신을 암호화하는 데 사용되는 모듈이다.

EC2서버를 사용할 때는 인바운드 설정도 같이 해주는것을 잊지 말자!

 

 

모듈 설정(mods-available)

나는 현재 리버스 프록시 설정을 추가적으로 할 것이기 때문에 해당 모듈들을 활성화시킬 것이다. 아파치 서버는 설정을 변경하면 리로드 또는 재시작을 해야 적용되지만 설정을 모두 끝내고 재시작을 할 것이다.

# 프록시 모듈 활성화
sudo a2enmod proxy
sudo a2enmod proxy_http

# SSL 설정을 해야한다면 같이 활성화 해준다.
# SSL 모듈 활성화
sudo a2enmod ssl

 

모듈을 활성화하는 방법은 아파치에서 제공하는 a2enmod 명령어를 사용해도 되고 mods-enabled 디렉토리에서 직접 심볼릭 링크를 지정해줘도 된다.



가상 호스트 파일 설정(sites-available)

기본적으로 아파치 서버를 설치하면 000-default.conf 파일을 활성화해서 사용하고 있다. 이 원본 파일은 유지하고 카피 후 설정한 파일을 활성화 시켜줄 것이다.

HTTP 설정만 해줄 것이라면 000-default.conf 파일을 카피하고, SSL설정도 같이 할 것이라면 default-ssl.conf 파일을 카피해서 사용한다.

<VirtualHost *:80>
    ServerAdmin root@localhost
    ServerName test.sample.com
    DocumentRoot /your/path/build

      # 로그 설정
    ErrorLog ${APACHE_LOG_DIR}/custom_error.log
    CustomLog ${APACHE_LOG_DIR}/custom_access.log combined

    # 특정 디렉토리에 대한 옵션과 권한을 설정한다.
    <Directory /your/path/build>
      Options FollowSymLinks
      AllowOverride All
      Require all granted
    </Directory>

      # 리버스 프록시 설정
    ProxyPreserveHost On
    ProxyPass /api http://localhost:8000/api
    ProxyPassReverse /api http://localhost:8000/api
</VirtualHost>
  • ServerAdmin: 서버 관리자 이메일 주소. 문제 발생시 보고하는 곳인데 그냥 그대로 사용한다.
  • ServerName: 서버의 도메인 명을 설정한다.
  • DocumentRoot: 아파치가 제공할 웹 컨텐츠가 있는 기본 디렉토리를 설정한다.
  • ErrorLog: 에러 로그파일의 위치를 지정한다.
  • CustomLog: 접근 로그 파일의 위치를 지정한다. combined는 로그 형식으로 common, combined가 있다.
  • ProxyPreserveHost: 프록시를 통해 요청을 보낼 때, 원래의 호스트 헤더를 유지할 것인지 결정하는 것이다. 이 설정을 ON으로 사용하면 클라이언트의 요청 헤더를 유지한채 서버로 전달한다. 서버가 호스트 헤더에 따라 다르게 반응해야 할 때 유용하다.
  • ProxyPass: 요청을 전달할 경로와 목적지를 설정한다. /api 경로로 들어오는 모든 요청은 http://localhost:8000/api 경로로 전달하게 된다.
  • ProxyPassReverse: 프록시의 응답 헤더를 조정해서 클라이언트가 직접 응답을 받는것처럼 보이게 하는 설정이다.
  • Directory: 이 태그는 특정 디렉토리에 대한 옵션과 권한을 설정한다.
    • Options: 디렉토리에 대한 추가 옵션을 설정한다. FollowSymLinks는 해당 디렉토리에서 심볼릭 링크를 따라갈 수 있도록 허용한다.
    • AllowOverride All: 이 디렉토리의 설정을 .htaccess 파일을 통해 덮어쓸 수 있도록 허용한다.
    • Require all granted: 모든 사용자가 이 디렉토리에 접근할 수 있도록 허용한다.

 

리버스 프록시에 대해서도 간단하게 확인해보자.

 

 

리버스 프록시

인터넷과 서버 사이에 존재하며, 서버를 대신해서 클라이언트의 요청을 받아서 처리한다. 클라이언트는 서버에 직접 접근하는 것이 아닌 리버스 프록시를 통해서 서버에 접근하고, 리버스 프록시가 서버의 응답을 클라이언트에게 전달한다.

리버스 프록시의 목적

  • 부하 분산: 여러 서버로 요청을 분산시켜 각 서버의 부하를 줄이고, 처리 성능을 향상시킨다. (AWS 로드 밸런서)
  • 보안: 외부에서 내부 서버에 대한 직접적인 접근을 차단해서, 내부 서버의 보안을 강화한다.
  • SSL 암호화: 리버스 프록시에서 SSL/TLS 암호화를 처리함으로써, 내부 서버의 부하를 줄일 수 있다.
  • 콘텐츠 캐싱 및 압축: 웹 콘텐츠를 캐싱하거나 압축하여 전송함으로써 사용자의 접근 속도를 향상시킨다.

포워드 프록시와 리버스 프록시 모두 IP를 숨기는데 이 둘은 사용 목적과 대상에서 차이가 있다고 보면 된다.

포워드 프록시는 클라이언트와 인터넷 사이에 존재하고, 리버스 프록시는 인터넷과 서버 사이에 위치한다.
포워드 프록시는 클라이언트의 익명성, 접근 제어, 보안, 캐싱 등을 위해 사용되며, 리버스 프록시는 서버의 부하 분산, 성능 향상, 보안 강화, 암호화 처리 등을 위해 사용된다.



SSL 설정

SSL 설정도 가볍게 확인 해보도록 하자. SSL 설정을 위해서는 default-ssl.conf 파일을 카피해서 사용하면 된다.

<IfModule mod_ssl.c>
	<VirtualHost _default_:443>

	# 기존 코드는 동일하게 사용한다.
	# host, proxy 설정 등

	SSLEngine on
	SSLCertificateFile    /etc/ssl/public.pem
	SSLCertificateKeyFile /etc/ssl/privkey.pem

	<FilesMatch "\.(cgi|shtml|phtml|php)$">
	        SSLOptions +StdEnvVars
	</FilesMatch>
	<Directory /usr/lib/cgi-bin>
	        SSLOptions +StdEnvVars
	</Directory>

	</VirtualHost>
</IfModule>
  • SSLCertificateFile: 서버의 공개 키가 포함된 인증서 파일을 설정한다.
  • SSLCertificateKeyFile: 서버의 비공개 키가 포함된 파일을 설정한다.

 

이제 설정한 파일을 활성화를 시켜줘야 한다.

sudo a2ensite custom.conf

 

파일명은 카피해서 설정한 파일명을 적어준다.  

 

a2ensite 명령어도 아파치에서 제공하는 설정 파일을 활성화 하는 명령어다. 그리고 sites-enabled 디렉토리에서 000-default.conf 파일의 심볼릭 링크를 제거하는 것을 잊지 말자!

 

이제 모든 설정은 끝났으니 아파치 서버를 재시작 해주도록 한다.

sudo systemctl restart apache2

 

 

 

지금까지 아파치 설정을 하는 방법을 알아봤다. 더 자세한 설정 방법들은 아파치 공식 문서를 확인하도록 하자.

 

 

 

참조