[SpringBoot] HTTP to HTTPS Redirection 하기

이재윤·2024년 11월 21일

SpringBoot와 Devops

목록 보기
4/6
post-thumbnail

HTTP to HTTPS 리디렉션

HTTPS란?

HTTPS는 HyperText Transfer Protocol Secure의 약자이다. 이는 웹에서 데이터를 주고받을 때 보안된 통신을 보장하는 프로토콜이다. HTTPS는 HTTP(웹 브라우저와 웹 서버 간에 데이터를 전송하는 기본 프로토콜)에 암호화와 인증 기능을 추가한 형태이다.

📌 즉, 웹사이트 주소가 http://로 시작하면 보안이 약한 상태이며, https://로 시작하면 보안이 강화된 웹사이트임을 알 수 있다.

SpringBoot에서 HTTP -> HTTPS

저번 시간에 SpringBoot 프로젝트에 SSL 인증서를 발급 받아 적용하는 글을 포스팅 하였었다. 하지만 http와 https가 따로 작동하는 현상이 발생할 것이다. 이렇게 되면 사용자가 https 말고 http로 접속하게 될 경우 보안상 문제가 생길 수 있기 때문에 http로 접속해도 https로 리디렉션 되도록 SpringBoot에 적용해보자.

  1. 본인의 SpringBoot 프로젝트의 해당 경로에 Config 패키지 만들기

    src/main/java/com/{본인 프로젝트명}

    📌 application.java와 동일한 경로

  2. Config 패키지 안에 클래스 파일 생성 후 해당 코드 입력하기

@Configuration
public class WebConfig {
    
    @Bean
    public TomcatServletWebServerFactory 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(createHttpConnector());
        return tomcat;
    }

    private Connector createHttpConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }
}

📖 코드 이해하기

Spring Boot 애플리케이션에서 Tomcat 서버를 본인에 맞게 설정하는 Java 클래스이다. @Configuration 어노테이션을 사용하여 Spring의 설정 클래스를 정의하고, 이를 통해 Tomcat 서버의 동작을 제어한다.

@Bean : 메소드를 Spring의 Bean으로 등록하여, 애플리케이션의 컨텍스트에 의해 관리한다.

postProcessContext() : Tomcat의 Context에 보안 설정을 추가하는 부분입니다.

  • SecurityConstraint : 보안 제약 조건을 명시적으로 설정
    userConstraint를 "CONFIDENTIAL"로 설정하여, 강제적으로 모든 요청이 HTTPS를 통해야되도록 한다.
  • SecurityCollection : 특정 URL 패턴에 보안을 적용
    /* 패턴을 사용하여 모든 경로에 대해 보안 요구 사항을 설정한다.

tomcat.addAdditionalTomcatConnectors(createHttpConnector()) : HTTP와 HTTPS 두 가지 포트를 모두 활성화한다. HTTP로 요청이 오면 자동으로 HTTPS로 리다이렉트 된다.

  • createHttpConnector() : HTTP 커넥터
    HTTP를 포트 80에서 활성화하고, HTTP 연결이 들어오면 HTTPS(포트 443)로 리다이렉트 되도록 설정한다.

결론 : "무조건 HTTPS로 가야해!"라고 강제적으로 명시해주는 코드이다.





아직 학생이라 부족한 점이 있을 수 있습니다. 댓글과 피드백은 언제든지 환영입니다!

profile
부족한 점이 많습니다. 피드백은 환영입니다!

0개의 댓글