기록하는 공간
NGINX로 Http, Https 적용하기 본문
처음 프로젝트를 진행했을 때, Https를 적용하기 위해, AWS의 로드밸런서를 사용했었다. 하지만 로드밸런서를 사용하게 되면서 대학생인 나에게 부담되는 금액이 부과되었었다.
그래서 NGINX를 사용하여 Https를 적용해 주기로 했다.
아래부터 설명하는 부분은 AWS, GCP 등 클라우드 서비스로 이미 서버를 열어 둔 상태라고 가정한다.
현재 나는 GCP 를 사용하여 우분투 서버를 열었다.
NGINX, certbot설치와 SSL인증서 발급
먼저 우분투 서버에서 NGINX설치를 하기 전에 업데이트 해준다.
$ sudo apt update
nginx install
$ sudo apt install nginx
certbot install
$ sudo apt install certbot python3-certbot-nginx
그리고 certbot을 이용해서 도메인에 대한 SSL 인증서를 발급받는다.
$ sudo certbot certonly --nginx -d {본인 도메인주소 ex.) abcdefg.com}

그럼 위와 같이 성공적으로 도메인에 대한 SSL인증서가 발급된 것을 알 수 있다.
NGINX 설정
$ cd /etc/nginx
$ vi nginx.conf
nginx 메인 설정파일을 확인한다.

이미 있지만 확인하고, 없으면 작성해 준다.
그 후 sites-available 디렉터리에 작성하며, 아래 명령어를 통해 심볼릭 링크를 만들어준다.
$ sudo nginx -t # 문법 확인
$ sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled
$ cd /etc/nginx/sites-available
이 명령어를 통해 해당 디렉터리에서 test.conf 파일을 만든다.
$ vi test.conf
$ vim test.conf
등...
공백을 만들고 밖으로 나와 파일이 만들어졌는지 확인한 후 진행한다.
그 후 test.conf 파일에 입력한다
# 1)
server {
listen 80; # 80포트로 받을 때
server_name {도메인 주소};
return 301 https://$host$request_uri;
}
# 2)
server {
listen 443 ssl http2;
server_name {도메인 주소} www.{도메인 주소};
location / {
include /etc/nginx/proxy_params;
proxy_pass { 퍼블릭ip주소 ex) http://12.34.56.78:8080 };
if ($http_x_forwarded_proto = 'http'){
return 308 https://$host$request_uri;
}
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'Authorization';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
}
# ssl 적용
ssl_certificate /etc/letsencrypt/live/{도메인 주소}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{도메인 주소}/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
# 3)
server {
listen 80;
server_name {도메인 주소};
if ($host = {도메인 주소}) {
return 301 https://$host$request_uri;
}
return 404;
}
위의 test.conf 파일에서 중간에 if (~~~~~ = 'OPTIONS') 부분이 있는데, 이 부분은 CORS 설정을 해준 것이다.
NGINX에서 CORS를 설정해 주면, 스프링부트 서버에서는 CORS를 설정해 줄 필요가 없다.
만약 NGINX와 스프링부트 서버 둘 다 CORS를 설정했다면, 충돌이 나기 때문에 설정에 주의해야 한다.
마지막으로 NGINX를 재시작해준다.
$ sudo systemctl restart nginx
재시작 후 확인한다.

이와 같이 잘 되는 것을 확인할 수 있다.
지금까지 NGINX를 사용하여 도메인에 SSL을 적용하여 간편하게 Https 설정을 해주었다.
개인의 서버 환경이나 다양한 부분에서 이 글의 설정과 다를 수 있으니 본인의 환경에 주의하여 사용하면 된다.
'Spring' 카테고리의 다른 글
CSRF 방어 방법, 코드 (Security 사용 X) (0) | 2024.07.05 |
---|---|
빌더 패턴(Builder Pattern)은 무엇인가 (0) | 2023.11.29 |
경로 매개변수(@PathVariable)와 쿼리 매개변수(@RequestParam) (0) | 2023.08.03 |
@ManyToMany를 사용하지 말자! (0) | 2023.07.26 |
intelliJ에서 Api통신을 해보자! (0) | 2023.07.20 |