말하는 컴공감자의 텃밭

스프링 & 톰캣. http -> https 로 변경해보자. 본문

백엔드/Spring

스프링 & 톰캣. http -> https 로 변경해보자.

현콩 2025. 11. 18. 13:33
728x90

기존에 http로 유지되던 레거시 서비스를 TLS 와 SSL에 세계로 끌어들여보자.

 

먼저 간단하게 http랑 https 의 차이점은 잘 정리된 글을 확인해보자 https://mangkyu.tistory.com/98

 

[Web] HTTP와 HTTPS의 개념 및 차이점

1. HTTP란? [ HTTP(Hyper Text Transfer Protocol)란? ] HTTP(Hyper Text Transfer Protocol)란 서버/클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜이다. 즉, HTTP는 인터넷에서 하이퍼텍스트를 교환하기 위

mangkyu.tistory.com

 

간단하게 요약 요약하면 끝에 붙는 저 s 라는 의미가 보안이 추가됐다고 치환해버리자.

TLS와 SSL은 프로토콜로 우리가 네트워크 환경에서 보안이 중요하기 때문에 주로 사용되게 된다.

 

그럼 우리는 기존에 서비스를 어떻게 바꿀것이냐.

여러가지 방법이 있지만 오늘은 리디렉션을 해줄것이다.

 

서버에 인증 관련 키를 만들어서 인증을 받고. http 에서 https 로 이동시켜 줄 예정이므로~ 키를 만들어 주자.

 

# 프로젝트 루트 또는 안전한 폴더에서 실행
keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650
# PKCS12로 변환 (권장)
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype PKCS12
# 검증
keytool -list -v -keystore keystore.p12 -storetype PKCS12

 

 

터미널에 명령어를 작성해서 인증을 받아주자. 들어가는 데이터는 식별용이라 마구 마구 넣어줬다.

마지막엔 확인 메세지가 뜬다.

마지막에 입력한 정보가 맞는지 확인하는데 yes 나 y를 입력해서 키를 생성해주자.

 

키 사이즈와 유효 기간은 개개인에 환경에 맞추어 해주자. 데모로 테스트만 할거기에 2048에 10년을 넣어버렸다.

귀여운 키

해당 경로에 키가 잘 생성 되었다면,

설정파일인 application.properties도 수정해주자.

server.ssl.enabled=true
server.ssl.key-store=**/절대/경로/keystore.p12**
server.ssl.key-store-password=***          # 실제 비밀번호로 교체
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
server.port=8443

 

서버에서 ssl 키를 갖고 있어요~ 를 명시해준다.

적어둔 포트로 톰캣이 열리게 될 예정이다. 

 

이런 식으로.

 

이 설정만 있어도 톰캣은 

아무 세팅 안한 프로젝트는 ...

기존에 8080 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.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServerConfig {
    @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(redirectConnector());
        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

 

가장 중요한건 당연히 setPort인데, 포트주소를 잘 적어서 https 가 적용될 수 있도록 해주자.

 

+++

 

Smart Tomcat으로 띄우는 경우도 추가하려한다.
일단 인덱스 하나 만들어주고

<%@ page contentType="text/html; charset=UTF-8" language="java" %>

테스트용 JSP 페이지입니다.

현재 서버 시간: <%= new java.util.Date() %>

Context Path: <%= request.getContextPath() %>

접속 프로토콜: <%= request.getScheme() %>

포트: <%= request.getServerPort() %>

 

index.jsp 

 

.smarttomcat 내부에 있는 server.xml을 수정해주자.

 

 <Service name="Catalina">

    <!-- HTTPS -->
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
        maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
        keystoreFile="{KEY_ROOT}"
        keystorePass="{PW}" keystoreType="JKS" keyAlias="tomcat" />

    <!-- HTTP → HTTPS 리디렉션 -->
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps"
          unpackWARs="true" autoDeploy="true">
        <Context path="/test" docBase="TestConvert" />
      </Host>
    </Engine>
  </Service>

 

설정으로 8443으로 https 포트를 열어주고. 리디렉션 하는 내용을 톰캣에 추가 해 주었다.

하지만 여기까지면 리디렉션이 안된다. 
톰캣이 HTTP 요청을 HTTPS로 강제할 기준이 없기 때문이다.

web.xml을 수정해서 힘을 주자 ^<^

 

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">

...

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>SecureAll</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
    
...    

</web-app>

뿜.

728x90

'백엔드 > Spring' 카테고리의 다른 글

JWT로 관리하는 사용자 인증 - Json Web Token  (0) 2024.12.31
Spring 포인트 컷? - AOP  (0) 2024.06.24
Spring - 로깅? 요청 매핑?  (0) 2024.04.17
Spring과 웹 애플리케이션  (1) 2023.10.29
Comments