내장 웹 서버 응용 - HTTPS와 HTTP2

학습목표

  • HTTPS를 설정할 수 있다.
    • keystore 를 만들 수 있다.
    • application.properties를 설정할 수 있다.
    • curl로 웹 페이지 상태를 확인할 수 있다.
  • HTTP와 HTTPS를 같이 사용하도록 설정할 수 있다.
    • HTTP Connector 추가
  • HTTP/2 를 활성화 할 수 있다.

HTTPS 활성화

1. generate keystore

터미널 창을 하나 띄워서 아래의 코드를 입력하여 실행한다.
줄 바꿈 하지말고 한 줄에 다 써서 실행할 것.

keytool -genkey -alias '원하는 이름' -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000

2. application.properties

server.ssl.key-store=keystore.p12
server.ssl.key-store-password=지정한 비밀번호
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=지정한 alias 이름

3. Application 실행 및 localhost 접속해보기

2번 과정까지 정상적으로 마쳤다면 HTTPS가 되었을 것이다.
Application을 실행하여 https로 localhost에 접속해보자.

https://localhost:8080 로 접속해보면 아마도 아래와 같이 뜰 것이다.

왜?

1번 과정에서 생성했던 keystore에는 HTTPS에 대한 인증서가 들어있다.
그리고 HTTPS로 웹 서버에 요청을 보낼 경우 웹 브라우저는 이러한 인증서를 검증한다.
하지만 이 인증서는 웹 페이지의 안전성을 확인하는 공인된 단체가 발급해 준 것이 아닌,
공부 차원에서 개인인 본인이 임의로 만든 인증서이기에
브라우저는 당연히 안전하다고 확인된 인증서 리스트에 '개인'인 내가 만든 인증서는
없으니까 경고 메시지를 띄운다.

그냥 무시하고 '고급' 버튼 눌러서 localhost로 이동해보면 정상적으로 페이지가 나타난다.

4. curl을 통해서 확인

curl -I -k --http2 https://localhost:8080/hello

정상이면 200 메시지를 받을 것이다.

HTTP & HTTPS 같이 사용

기본적으로 HTTP 혹은 HTTPS에 접속하게 해주는 'HTTP Connector'는 하나만 제공된다.
때문에, HTTPS를 활성화하면 HTTP로는 접속할 수 없게 된다.

하지만,
설정을 통해서 이 둘 모두 접속 가능하게 할 수 있다.

1. HTTP Connector 추가

ex. Tomcat 기준

실행부(Application.java)에 아래 코드를 추가한다.

@SpringBootApplication
@RestController
public class Application {

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector());
        return tomcat;
    }

    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(8080);
        return connector;
    }
    
    @GetMapping("/hello")
    public String hello(){
        return "hey spring";
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2. port 설정

앞에서 생성한 'HTTP Connector'에 setPort()로 8080 포트를 지정해 줬다.
HTTP Connector 포트와 HTTPS Connector 포트가 겹치면 안되기 때문에
HTTPS 활성화 - 2번 과정에서 작성했던 application.properties에서
HTTPS 포트 번호 설정을 추가 해준다.

ex.

server.port=8443

3. curl로 HTTP & HTTPS 확인

HTTP 확인

HTTPS 확인

HTTP/2 활성화

앞서 curl로 HTTPS 페이지 응답이 정상적으로 되는지 확인했던 메시지를 다시 주의깊게 살펴보면
curl 요청 당시 HTTP/2로 요청을 했지만 응답 결과는 HTTP/1.1 임을 알 수 있다.

본래 요청한 HTTP/2로 요청 및 응답 되도록 설정 해보자.
매우 간단 . . .

application.properties

application.properties 에 아래 코드를 추가한다.

server.http2.enabled=true

끝이다. . .

좋은 웹페이지 즐겨찾기