개발 중 권한 관련 에러가 발생하여 Spring에 https와 http2 를 적용해본
과정을 기록하기 위해 작성하였다.
http와 https의 차이는 생략하고 다음을 알아보자.
연결마다 하나의 요청과 응답을 처리하는 방식으로 설계되었다.
Http1.0과 비교하여
이러한 방법으로 Http1.0의 단점을 보완하였지만 여전히 많은 단점이 존재한다.
이러한 성능적인 문제 때문에 이를 개선한 Http2가 탄생하였다.
Http1.1의 성능 개선에 초점을 두어 탄생한 프로토콜
Multiplexed Streams
한 커넥션으로 동시에 여러 개의 메세지를 주고 받을 수 있으며, 응답은 순서에 상관없이 stream으로 주고 받는다.
Stream Prioritization
리소스간 우선순위를 설정하여 브라우저 렌더링 속도를 향상 시킨다.
Server Push
서버는 클라이언트의 요청에 대해 요청하지 않은 리소스를 보내줄 수 있다.
이를 통해 클라이언트가 미래에 요청할 것 같은 리소스를 미리 예측하여 보내줄 수 있다.
Header Compression
HTTP/2는 HPACK 압축방식을 통해 Header 정보를 압축하기 위해 Header Table과 Huffman Encoding 기법을 사용하여 처리한다.
이를 통해서 중복된 헤더에 대해서 동일한 헤더의 인덱스만 전송하고 중복이 아닌 헤더는 인코딩한다.
이러한 특징으로 Http2 를 적용만 함에도 Http1.1에 비해 웹 응답속도가 15~50% 상승만 한다고 한다!
이제 스프링에 Http2를 적용해보자.
Http2를 사용하기 위해서는 Https 적용이 필수적이다.
1.JDK 설치
https://www.oracle.com/kr/java/technologies/downloads/#jdk17-windows
위 링크에서 JDK를 설치한다.
2. 환경변수 편집
환경변수 → 시스템변수 → Path 에 jdk-17\bin 추가
3.OpenSSL 설치
https://code.google.com/archive/p/openssl-for-windows/downloads
위 파일을 다운로드 하여 압축풀고
C:\Program Files\openssl-0.9.8k_WIN32\bin
에 이동 시키고 환경변수 추가
4.keystore 파일 생성
$ keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
해당 keystore파일을 스프링 프로젝트 루트에 옮긴다.
application.yml
server:
http2:
enabled: true
ssl:
key-store: keystore.p12
key-store-type: PKCS12
key-store-password: mzbr707!
key-alias: spring
application.yml 에 작성하면 적용 완료이다.
올바르게 적용됐는지 확인하고 헤더가 어떻게 다른지 살펴보자
이렇게 주의 요함이라고 뜨는데 SSL 인증서가 인증 기관에서 발급된 인증서가 아니라 자체 인증한 인증서라 그렇다. 실 배포에서는 SSL 인증서를 신뢰할 수 있는 기관에서 발급한 다음에 적용하면 된다.