[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를 입력하면 키스토어가 생성된다.

스크린샷 2020-02-04 오전 2.33.36.png

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

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

스크린샷 2020-02-04 오전 2.38.29.png

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

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

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

스크린샷 2020-02-04 오전 2.43.58.png

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

공인된 인증서에서 발급받은 pubkey는 대부분의 브라우저가 이미 알고있기 때문에 신뢰하지 못한다고 뜨지않는 것이다.)
스크린샷 2020-02-04 오전 2.44.52.png

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

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

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

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

스크린샷 2020-02-04 오전 2.59.53.png

// 추가한 코드

    @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 둘 다 제대로 실행됨을 볼 수 있다.

스크린샷 2020-02-04 오전 3.02.31.png

스크린샷 2020-02-04 오전 3.03.34.png

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로 응답이 오는 것을 볼 수 있다.

스크린샷 2020-02-04 오전 3.25.03.png

0개의 댓글