부트 개념과 활용-06.내장 웹 서버 응용(HTTPS와 HTTP2)
내장 웹 서버 응용 2부 : HTTPS와 HTTP2
- HTTPS 설정하기
- 키스토어 만들기
- HTTP는 못쓰네?
- HTTP 커넥터는 코딩으로 설정하기
- https://github.com/spring-projects/spring-boot/tree/v2.0.3.RELEASE/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors
- HTTP2 설정
- server.http2.enable
- 사용하는 서블릿 컨테이너 마다 다름.
HTTPS 설정하기
- 키스토어 만들기 인텔리J 터미널에서 임의의 키를 생성한다.
JUui-MacBook-Pro15:web jaeuk$ keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
로컬이기 때문에 뒤에 비밀번호, 이름, 도시명 등 임의로 입력해주면 된다..
ls로 확인해보면 keystore.p12가 생성된 것을 볼 수 있다.
server.ssl.key-store= keystore.p12
# 만약 resources 에 넣을거라면 classpath: 를 붙여줘도 된다. 현재는 프로젝트 루트에 있으니 그냥 사용
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=1q2w3e4r!
server.ssl.key-alias=spring
프로퍼티 파일에 정의해주면 앞으로 모든 요청은 https 로만 정상적으로 실행이 된다.(=http는 받지 않는다)
톰캣이 사용하는 커넥터가 스프링 부트에서는 기본적으로 하나만 등록이 되는데, 그 커텍터에 SSL 적용을 해 준다.
그래서 앞으로 모든 요청은 https 붙여서 실행을 해 줘야 한다.
http 실행하면 요청을 받지 않고,
https 요청하면 처음에 경고 화면이 뜨는데,
내가 만든 인증서는 해당 브라우저는 그 인정서의 펍키를 모르기 때문에,
(공인된 인증서라면 알고 있다. 하지만 우리가 로컬에서 만든 키이기 때문에 경고해 주는것)
즉, Https 긴 하지만 공인된 사이트가 아니다. 그래도 가겠냐? 고 묻는 것이다.
그냥 확인하고 들어가면 된다.
그렇다면 http도 사용할 수 있게 하기 위해서는 따로 코딩으로 설정을 해 주어야 한다.
- http도 사용하려면? ~~~java @Bean public ServletWebServerFactory serverFactory() { 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; }
TomcatServletWebServerFactory의 addAdditionalTomcatConnectors 메서드를 활용해 톰켓 커넥터를 하나 더 연결해주는 것이다.
http 는 8080 포트를 쓰고,
다시 프로퍼티 파일에서 https 의 포트를 8443으로 바꿔주면 된다.
~~~Xml
server.ssl.key-store= keystore.p12
# 만약 resources 에 넣을거라면 classpath: 를 붙여줘도 된다. 현재는 프로젝트 루트에 있으니 그냥 사용
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=1q2w3e4r!
server.ssl.key-alias=spring
server.port=8443
이렇게 설정하면 http는 8080 포트로,
https는 8443 포트로 사용하면 된다.
HTTP2 설정
그렇다면 Http2 설정은 어떻게 할 수 있을까?
server.http2.enabled=true
프로퍼티 파일에 설정만 해 주면 된다.
그런데 이게 서버에 따라 제약사항이 있는데,
언더토우의 경우 SSL만 적용이 되어 있으면 아무런 추가 설정이 없더라도 자동으로 적용이 되고,
톰켓의 경우 제약사항이 있다…(8.5.x 버전에서는 복잡) 뭘 설치하고 등..
(JDK 9, 톰캣 9 이상부터는 추가 설정이 없더라도 지원)
버전을 올리면 가능하겠지만, 우선은 서버를 언더토우로 바꾸면 http2가 바로 적용이 되는 걸 확인할 수 있다.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 기존 가져오는 tomcat exclusion -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- undertow 추가-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
...
JUui-MacBook-Pro15:web jaeuk$ curl -I -k --http2 https://localhost:8443/hello
HTTP/2 200
content-type: text/plain;charset=UTF-8
content-length: 11
date: Sat, 14 Dec 2019 11:22:01 GMT