일반적으로 회원정보와 같은 민감한 정보를 네트워크로 전송할 땐 보안을 위해 HTTP가 아니라 HTTPS를 사용한다. Spring 프로젝트에서 HTTPS를 사용하기 위해선 프로젝트에 인증서를 추가해야 하는데, Spring의 보안을 담당하는 Spring Security 없이 java의 keytool과 Spring에 내장된 tomcat만으로도 간단하게 인증서의 추가가 가능하다.
1. java의 keytool로 인증서 생성
HTTPS를 사용하기 위해선 인증서가 필요한데, 인증서를 만들 수 있는 가장 간단한 방법은 바로 java의 keytool을 사용하는 것이다.
sudo /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -genkeypair -alias {인증서 별칭} -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore {프로젝트 경로}/src/main/resources/{인증서 파일명}.p12 -validity 3650
2. application.yml에 인증서 정보 추가
HTTPS를 사용하기 위한 인증서를 발급받았다면, 이제 Spring 프로젝트의 설정을 바꿔 주어야 한다. HTTPS가 SSL을 사용하므로, HTTPS에서 사용할 인증서의 정보를 server.ssl
에 등록해 주면 된다.
server:
ssl:
enabled: true
key-store: classpath:keytool.p12
key-store-password: password
key-store-type: PKCS12
key-alias: keyAlias
위 과정을 마치면 Spring 프로젝트에 HTTPS를 성공적으로 적용하게 된다.
번외. 기존 HTTP와 HTTPS 연결하기
HTTPS를 활성화하긴 했지만, 어떤 이유로 인해 기존 HTTP를 계속해서 사용해야 한다면 기존의 HTTP 경로와 HTTPS를 서로 연결해 기존 HTTP 경로를 그대로 활용할 수 있다. 단순히 Spring의 설정에 함수 몇 개를 새로 추가해준다면 된다.
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.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfiguration {
// ... 기존 설정들 ...
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());
return tomcat;
}
private Connector httpToHttpsRedirectConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
// ... 기존 설정들 ...
}
'웹 > Spring' 카테고리의 다른 글
Spring Security에서 DB에 존재하는 사용자 인증하기 (0) | 2022.04.12 |
---|---|
Spring 프로젝트에서 Spring Security 사용하기 (0) | 2022.04.12 |
Spring 프로젝트에 Lombok 추가하기 (0) | 2022.04.09 |
DB와 연결하기 (0) | 2022.03.22 |
JUnit / AssertJ를 이용하여 테스트하기 (0) | 2022.03.17 |