[Spring Boot] 내장 웹 서버 - 2 (스프링부트 HTTPS / HTTP2)

Junseo Kim·2020년 2월 3일
0

HTTPS

HTTPS(SSL프로토콜 위에서 돌아가는 프로토콜)을 사용하려면 키스토어(인증서)를 만들어야한다.

티미널을 열어 프로젝트 위치에서 아래의 명령어를 입력한다.
keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
그런 다음 비밀번호와, 이름 등등 부가정보를 입력해야하는데 로컬에 저장하는 인증서기 때문에 임의로 알아서 입력해도 된다. 모든 정보를 입력하고 마지막에 yes를 입력하면 키스토어가 생성된다.

키스토어가 생성되었으면 application.properties에 터미널 명령어로 설정해준 내용들을 적어준다.

server.ssl.key-store 명령어는 만들어진 키스토어 파일의 이름을 적는 것이다.(root에 있을 경우, 아래와 같이 이름만 적어줘도 되지만, main안에 있는 경우 앞에 classpath: 를 붙여줘야한다.)

이렇게 하고 실행하면, 스프링부트는 기본적으로 톰캣이 사용하는 connector가 하나만 등록이된다.

그 connector에 SSL을 적용해준다. 그래서 앞으로 모든 요청은 HTTPS를 거쳐서 하게 된다.

브라우저에 원래대로 localhost:8080을 입력하여 접속하면 Bad request가 발생한다.

https://localhost:8080으로 접속하면 접속이 됨을 볼 수 있다.
(https로 접속하면 신뢰하지 못한다고 뜬다. 그 이유는, 브라우저에 주소를 입력하면 서버로 요청을 보내는데, 서버는, https이므로 인증서를 보낸다. 그 인증서는 아까 만들어준 keystore안에 들어있는데, 브라우저는 그 인증서의 pubkey를 모르는 상태이기 때문에 발생하는 현상이다.

공인된 인증서에서 발급받은 pubkey는 대부분의 브라우저가 이미 알고있기 때문에 신뢰하지 못한다고 뜨지않는 것이다.)

https 적용한 상태에서 http 받는 방법

이렇게 https를 적용하면, 이제 http는 사용하지 못한다.(왜냐하면 connector가 하나인데, 거기에 https를 적용했기 때문에 더이상 http를 받을 수 있는 connector가 없기 때문이다.)

그러나 아래의 방법으로 http를 받을 수 있다.

바로 새로운 connector를 생성해주는 것이다. 이때 새로운 connector와 기존 https의 connector의 포트번호는 겹치면 안된다.(application.properties에 server.port=으로 https의 포트를 8080말고 다른 것으로 바꿔주도록하겠다.)

// 추가한 코드

    @Bean
    public ServletWebServerFactory serverFactory() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 톰캣에 Connector 추가
        return tomcat;
    }

    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(8080); // 포트 설정(https랑 달라야함)
        return connector;
    }

이렇게 하면 https와 http 둘 다 제대로 실행됨을 볼 수 있다.

HTTP2

HTTP2를 활성화 하려면, 기본적으로 SSL은 기본적으로 적용되어 있어야며, application.properties에 server.http2.enabled=true를 추가해줘야한다.

서버마다 제약사항이 있다.

Undertow인 경우 https만 적용이 되어 있으면 아무런 추가설정을 하지 않아도 된다.

tomcat 9.0.x & JDK9 를 사용할 경우도 아무런 추가설정을 하지 않아도 된다.

만약 tomcat과 JDK 버전을 바꾸고 싶으면 pom.xml에 아래 코드를 추가해준다.

    <properties>
        <java.version>9</java.version>
        <tomcat.version>9.0.10 </tomcat.version>
    </properties>

(jdk는 추가적으로 file -> project structure -> [Platform Settings] SDKs에서 '+' 버튼 -> JDK 선택 -> pom.xml에 적어준 jdk 버전 선택 -> apply버튼 -> [Project Settings] Project에서 Project SDK부분에 아까 추가해준 jdk 선택 -> Project language level 부분에 아까 추가해준 jdk버전 선택 -> apply 버튼 -> [Project Settings] Modules에서 Dependencies탭을 눌러 -> Module SDK를 추가해준 jdk버전 선택 -> apply 버튼 해주면 된다.)

터미널에 curl -I -k --http2 https://localhost:8443/hello 명령어로 확인해보면 HTTP2로 응답이 오는 것을 볼 수 있다.

0개의 댓글