Spring Boot에서 HTTPS 활성화하기

Spring Boot 프로젝트에서 HTTPS를 설정하는 방법에 대해 알아보겠습니다. 이 문서에서는 SSL 인증서 생성, 구성 파일 수정 및 HTTP 요청을 HTTPS로 리다이렉션하는 과정을 다룹니다.

SSL 인증서란?

SSL 인증서는 웹 서버와 브라우저 간의 데이터 전송을 암호화하여 보안성을 강화하는 디지털 인증서입니다. 이 인증서는 신뢰할 수 있는 기관에서 발급되며, 서버의 정체성을 검증하고 데이터 전송을 암호화하는 역할을 합니다.

1. JKS 형식의 인증서 생성

다음 단계를 통해 Linux 서버에서 JKS 형식의 SSL 인증서를 생성할 수 있습니다. 아래 명령어들을 차례대로 실행하며, 생성 과정에서 필요한 패스워드는 기본값인 "changeit"을 사용하거나 직접 지정할 수 있습니다.

## 1. 개인 키 생성
openssl genrsa -out custom_key.pem

## 2. CSR(Certificate Signing Request) 생성
openssl req -new -key custom_key.pem -out custom_request.csr

## 3. 인증서 생성 (CSR 기반)
openssl x509 -req -days 365 -in custom_request.csr -signkey custom_key.pem -out custom_cert.pem

## 4. PKCS12 형식으로 변환
openssl pkcs12 -export -in custom_cert.pem -inkey custom_key.pem -out custom_cert.p12

## 5. JKS 형식으로 변환
keytool -importkeystore -srckeystore custom_cert.p12 -srcstoretype pkcs12 -destkeystore custom_cert.jks -deststoretype JKS

2. 인증서 위치 지정

생성된 custom_cert.jks 파일을 프로젝트의 src/main/resources 디렉토리에 저장합니다.

3. application.properties 구성

HTTPS를 사용하도록 Spring Boot의 구성 파일(application.properties)을 다음과 같이 수정합니다. 여기서 사용하는 패스워드는 인증서 생성 시 설정한 값입니다.

# HTTPS 설정
server.port=8443
server.ssl.key-store=classpath:custom_cert.jks
server.ssl.key-store-password=your_password
server.ssl.keyStoreType=JKS

4. HTTP를 HTTPS로 리다이렉션 (선택사항)

모든 HTTP 요청을 HTTPS로 자동 리다이렉션하려면 다음 코드를 사용합니다.

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebServerConfig {

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
    }

    @Bean
    public Connector redirectConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

5. 프로젝트 실행 결과

프로젝트를 실행하면 아래와 같은 로그가 출력됩니다.

o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8443 (https) 8080 (http) with context path ''

태그: SpringBoot SSL Tomcat

6월 9일 17:27에 게시됨