본문 바로가기

Kotlin/Spring

(Spring) HTTP 프로젝트 HTTPS로 업그레이드 하기

HTTP와 HTTPS란??

HTTP

  • Hyper Text Transfer Protocol의 약자
  • 서로 다른 시스템들 사이에서 통신을 주고 받게 하는 가장 기본적인 프로토콜
  • 서버에서 브라우저로 데이터를 전송하는 용도로 가장 많이 사용한다
  • 전송되는 요청 / 응답 정보가 기본적으로는 암호화 되어 있지 않아서 보안 정보 도난의 위험이 있다

HTTPS

  • Hyper Text Transfer Protocol Secure 의 약자
  • HTTP의 보안정보와 도난의 단점을 보완하기 위해 사용하는 프로토콜
  • SSL / TLS 프로토콜을 사용하여 HTTP를 암호화 하여 주고 받을 때 쓰는 통신 프로토콜

진행 방식

  1. 인증서를 발급해준다
  2. 로컬에서 테스트 할 경우 인증서를 application에 등록해준다
  3. 코드로 HTTP 접속을 전부 HTTPS로 이동 시킨다

인증서 발급

  • 여러가지가 있지만 우선 도메인이 있다면 certBot을 설치하여 무료 인증서를 다운하는 방법이 가장 편하다

https://certbot.eff.org/instructions <- CertBot 가이드

 

  • 하지만 도메인이 없는 경우에는 KeyTool을 사용하여 가상 인증서를 발급 받는 것이 중요하다
keytool -genkeypair -alias {별명} -storetype {스토어 타입} -keyalg {알고리즘 타입} -keysize {키사이즈} -keystore {키 이름}.p12 -validity 4000
  • 위와 같이 입력해주고 스토어 타입에는 주로 PKCS12, 알고리즘은 RSA를 주로 사용한다
  • 작성하면 하라는 대로 입력하면 가상 인증서 파일을 하나 발급해준다

인증서를 Application.yml 파일에 등록

server:
  ssl:
    enabled: true
    key-store: {인증서 파일 경로}
    key-store-type: (스토어 타입}
    key-store-password : {설정한 비밀번호}
    key-alias : {별명}
  port : 8443 <- 여기는 HTTPS로 변환될 때 사용하는 포트 번호이다

 

 

코드로 HTTP 접속을 전부 HTTPS로 이동 시키면 끝난다

@Bean
    fun servletContainer(): ServletWebServerFactory {

        val tomcat = object : TomcatServletWebServerFactory() {
            override fun postProcessContext(context: Context) {
                val securityConstraint = SecurityConstraint()
                securityConstraint.userConstraint = "CONFIDENTIAL"
                val collection = SecurityCollection()
                collection.addPattern("/*")
                securityConstraint.addCollection(collection)
                context.addConstraint(securityConstraint)
            }
        }

        tomcat.addAdditionalTomcatConnectors(createStandardConnector())
        return tomcat
    }

    fun createStandardConnector(): Connector {

        val connector = Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL)
        connector.scheme = "http"
        connector.port = 8080
        connector.secure = false
        connector.redirectPort = 8443

        return connector
    }
  • 위 코드는 Spring Security를 사용하지 않고 직접 사용하였는데 ServletWebServerFactory를 상속을 받은 후에 TomcatServletWebServerFactory 정보를 HTTPS 로 변경 시켜주는 작업을 해주는 방법이다

위와 같이 실행을 하면 http://localhost:8080 으로 접속할 경우 https://localhost:8443으로 자동으로 변환되어 접속이 확인 되는 것을 볼 수 있다