가수면

스프링 부트 서버에 https 설정 본문

Java

스프링 부트 서버에 https 설정

니비앙 2024. 1. 23. 04:31

외부 웹 서버 설정

사이트에 접속할 때, 기본적으로 443 포트를 사용하게 되어 https://~~~.com에 에 접속하게 되면 자동으로 443 포트로 연결을 시도하게 된다. (8443같은 포트를 사용하면 주소 뒤에 포트를 적어줘야함)

그렇기 때문에 일반적으로 https의 포트를 사용할 땐 443을 사용하게 되는데 리눅스와 같은 유닉스 기반 시스템에서는 1024 이하의 포트(관리자 또는 특권 포트)를 일반 사용자가 열 수 없기에 1024 이하의 포트를 사용하는 것이 권장되지 않는다

 

443을 사용이 권장되는데 권장되지 않는다니!?

 

이 문제를 외부 웹 서버(Nginx, Apache 등)를 사용해 해결할 수 있다.

외부 웹 서버에서 443 포트로 HTTPS 트래픽을 수신하고,  SSL/TLS 핸드셰이크를 처리한 다음, 이 트래픽을 내부 애플리케이션의 8080 또는 8443과 같은 다른 포트로 전달하는 것이다.

이것을 "리버스 프록시"라고 하며, 이를 통해 SSL/TLS 처리를 웹 서버에서 수행하고 애플리케이션에서는 일반 HTTP 트래픽을 처리할 수 있게 된다.

 

예시는 Nginx를 예시로 한다.

 

1. NGINX 설치

sudo yum install nginx

2.NGINX 설정 파일 편집

리눅스의 경우

/etc/nginx/nginx.conf파일 안에 include /etc/nginx/conf.d/*.conf; 구문이 디폴트로 설정되어 있기 때문에 /etc/nginx/conf.d 경로에 .conf 확장자로 파일을 생성해줘야 엔진엑스 설정이 적용된다.

// ubuntu
cd /etc/nginx/sites-enabled
sudo rm default		// default 링크는 동일한 80번 포트를 사용하도록 설정되어 있으므로 반드시 삭제
sudo nano todo(설정파일 이름)

// linux
cd /etc/nginx/conf.d
sudo nano todo(설정파일 이름).conf
server {
    listen 80;				// 웹 서버를 80번 포트로 서비스
    server_name jihyeon.store;		// 도메인명

    location / {
        proxy_pass http://localhost:8080;	// 웹 서버가 받은 모든 클라이언트 요청을 이 주소로 리다이렉트
        // 엔진엑스를 통해 스프링 부트의 톰캣 서버로 요청이 전달되는 과정에서 클라이언트의 주소가 실제 IP 주소가 아닌 엔진엑스가 설치된 서버의 주소로 톰캣 서버에 전달되는 것을 방지
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}
Ctrl + O	// 저장
Ctrl + X	// 나가기

 

3.NGINX 설정 확인 및 재실행

설치할 때 자동 실행되므로 설정 변경 후 재실행시켜준다.

// 설정 테스트
sudo nginx -t
// 재실행
sudo systemctl restart nginx

https 설정

0. 권장 사항)
업데이트 해준다.

sudo yum update

 
1. Certbot 설치
SSL은 CA(Certificate Authority, 인증기관)에서 발급해주는 인증서인데 https 연결을 가능하게 해준다.
대부분이 유료이지만, Let's Encrypt를 통해 무료로 발급받을 수 있다.
다만 3개월마다 수동으로 갱신을 해줘야한다는 점이 단점인데, Certbot이라는 오픈 소스를 이용하면 인증서 발급도 쉽게 받고 갱신도 자동화할 수 있다.

sudo yum install certbot
sudo yum install python3-certbot-nginx	// 인증서를 쉽게 생성하고 관리할 수 있는 라이브러리

Amazon Linux 2023 AMI는 바로 설치가 가능하지만, 만약 패키지를 찾을 수 없다는 오류가 발생한다면 사용하는 리눅스 배포판의 기본 레포지토리에 포함되어 있지 않은 것이므로 EPEL 리포지토리를 활성화해야 한다.

sudo amazon-linux-extras install epel

2. Certbot 실행 및 인증서 발급
apach나 nginx를 사용하지 않고 임시 서버를 사용하여 Certbot을 실행시키고 인증서를 발급받는 명령어

sudo certbot certonly --nginx

이후 메일이나 도메인 주소 등 입력하라는 대로 입력한다.

그러면 인증서가 발급된 경로가 나온다.

3. NGINX 설정 수정

공백의 경우 하나 이상이어야 하지만, 그 이상의 길이는 기능에 영향을 미치지 않는다. 코드의 가독성을 위해 사용.

server {
        listen 80;
        server_name jihyeon.store;
        rewrite        ^ https://$server_name$request_uri? permanent;
}

server {
        listen 443 ssl;
        server_name jihyeon.store;

        ssl_certificate /etc/letsencrypt/live/jihyeon.store/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/jihyeon.store/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }
}

모든 HTTP (server_name jihyeon.store에 대한 80번 포트) 요청을 HTTPS (443번 포트)로 리다이렉트

rewrite 구문은 모든 HTTP 요청을 HTTPS로 영구적으로 리다이렉트

 

이후 재실행

sudo systemctl restart nginx.service

 

4. EC2 보안 그룹의 인바운드 규칙 설정 추가

 

'Java' 카테고리의 다른 글

[Spring Boot] 에러 핸들링  (1) 2024.02.20
Junit5  (0) 2024.02.17
Spring Security와 JWT  (0) 2024.01.09
[Spring Boot] 심화  (0) 2023.12.28
HATEOAS  (1) 2023.12.26
Comments