AWS EC2 우분투 서버에서 스프링 부트 서버를 가동하고 있습니다.
$ nohup java -jar -Djasypt.encryptor.password=암호화키 ./서버애플리케이션.jar &
NginX 설정에선 이미 Https (SSL) 설정을 마친 상태인데요.
Https 설정을 적용한 채로 스프링 부트 서버에 접속하기 위해선, 리버스 프록시 설정을 추가해야 합니다.
리버스 프록시는 NginX 에 요청이 들어오면, 다른 서버에 연결을 토스해주는 기능을 해줍니다.
사용자는 실제 서버의 정체를 모르고도 통신을 할 수 있게 되는데요.
NginX 에선 다음과 같이 설정했습니다.
$ vi /etc/nginx/sites-available/default
NginX 설정 편집기에 들어가 아래와 같이 작성합니다.
...
server {
listen 443 ssl http2;
server_name 도메인명;
root /var/www/html;
index index.html;
ssl_certificate "/etc/letsencrypt/live/도메인명/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/도메인명/privkey.pem";
ssl_dhparam "/etc/ssl/certs/dhparam.pem";
add_header Strict-Transport-Security "max-age-31536000";
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwared-Proto $scheme;
proxy_pass http://localhost:8080/;
proxy_redirect off;
}
}
...
ssl_~~~~ 속성은 이전에 마친 Https SSL 설정입니다.
LetsEncrypt ( 또는 Certbot ) 에서 만들어준 키를 입력하고, openssl 도구로 생성한 디피-헬만 파라미터 파일을 넣었습니다.
$ openssl dhparam 2048 -out /etc/ssl/certs/dhparam.pem
location / { ... } 부분이 리버스 프록시 설정입니다.
proxy_set_header field value 은 다른 서버로 요청을 전달할 때 추가로 헤더에 field : value 형태로 붙여줍니다.
일반적으로 HTTP 리버스 프록시 헤더로 아래와 같이 헤더를 추가하여 백엔드 서버로 보내줍니다.
표준으로 정해져 있진 않지만 관습적으로 사용하고 있습니다.
X-Forwarded-For: 12.34.56.78, 23.45.67.89
X-Real-IP: 12.34.56.78
X-Forwarded-Host: example.com
X-Forwarded-Proto: https
proxy_set_header 으로 직접 헤더에 NginX 가 제공하는 변수를 활용해 요청 헤더에 추가해주고 있습니다.
$http_host 는 요청으로 넘어온 Host 헤더를 변경하지 않은 채로 그대로 전달합니다.
만약 요청 헤더에서 Host 가 없다면 전달되지 않습니다.
이를 방지하기 위해선, $host 를 사용하는 걸 추천드립니다.
$host 는 요청 헤더에서 넘어온 Host 를 넘겨주고, 만약 그 값이 없다면 프라이머리 서버 이름(내 도메인)이 들어갑니다.
두 번째로 X-Real-IP 헤더에 $remote_addr 값을 담아 보내줍니다.
스프링 부트(백엔드) 서버에서 실제로 요청한 사용자의 IP 주소를 알 수 있도록 헤더에 담아서 보내줍니다.
세 번째로 X-Forwarded-For $proxy_add_x_forwared_for 은 IP 주소($remote_addr)를 콤마(,)로 구분해서 계속 추가해줍니다.
마지막으로 X-Forwarded-Proto 헤더에 $scheme 값을 넣어줍니다. $scheme 변수는 요청 프로토콜 http 또는 https 을 넣어줍니다.
현재 프라이머리 서버는 https 만 받으므로 https 만 들어오게 됩니다.
proxy_pass 는 요청을 보낼 서버 주소를 입력합니다.
같은 서버에서 스프링 부트 서버를 가동시키고 있으므로, localhost:8080, 포트번호까지 포함합니다.
내부 백엔드 서버에선 http 프로토콜로 가동되는데요.
NginX 요청으로 Https 설정이 되어있기에, 사용자 입장에선 백엔드 서버와 Https 으로 통신이 되는 것처럼 느껴집니다.
proxy_redirect off; 는 이전 레벨에서 상속된 설정을 사용하지 않고 proxy_redirect 기능을 끕니다.
proxy_redirect redirect replacement; 으로 설정하면, 서버 응답 헤더에서 Location, Refresh 헤더 필드의 값이 대체(Replace)됩니다.
proxy_redirect http://localhost:8000/two/ http://frontend/one/; 으로 설정하면, 첫 번째 값의 문구가 두 번째 값의 문구로 대체됩니다.
위 설정으로 저장하고 재시작 또는 설정 새로고침을 하면 적용이 완료됩니다.
$ sudo service nginx reload
$ sudo service nginx restart
'Back-End > Back-End 자료실' 카테고리의 다른 글
[C# Blazor] NET::ERR_CERT_INVALID 오류 해결하기 (0) | 2023.09.04 |
---|---|
Backend Interview Q1. 프로세스와 스레드의 차이 (1) | 2020.08.25 |
[Laravel] MySQL 8.0 이상 인증 오류 해결 (0) | 2018.09.25 |
[Ruby On Rails] pg Gem 설치 오류 해결하기 (0) | 2018.05.21 |
REST API: PUT & PATCH (0) | 2018.05.08 |
댓글