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 ''