http2 https with Spring

Jongmyung Choi·2023년 10월 18일
0
post-custom-banner

개요

개발 중 권한 관련 에러가 발생하여 Spring에 https와 http2 를 적용해본
과정을 기록하기 위해 작성하였다.

http와 https의 차이는 생략하고 다음을 알아보자.

  1. http1.1과 http2의 차이
  2. Spring에 https와 http2 적용하는 방법
  3. 적용 결과

Http1.1 vs Http2

Http1.1

연결마다 하나의 요청과 응답을 처리하는 방식으로 설계되었다.

Http1.0과 비교하여

  • persistent Connection(keep-alive) 을 통한 커넥션 유지
  • 파이프라이닝 기법을 통한 multiple request에 대한 처리가 가능
  • Virtual Hosting
  • 캐시 적용

이러한 방법으로 Http1.0의 단점을 보완하였지만 여전히 많은 단점이 존재한다.

Http1.1 단점

  1. HOB (Head of Line Blocking)
    Pipelining을 적용하였지만 요청의 순서를 기다려야 하는 병목 현상이 발생할 수 있다.
  2. RTT( Round Trip Time ) 증가
    여러 요청을 처리할 때 다수의 TCP 연결이 필요하고, 3-way Handshake 가 반복적으로 일어나 성능 저하가 발생할 수 있다.
  3. 무거운 Header 구조
    http/1.1의 헤더에는 많은 메타정보들이 존재하고 매 요청 시 마다 중복된 Header 값을 전송한다.

이러한 성능적인 문제 때문에 이를 개선한 Http2가 탄생하였다.

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 with Spring

이제 스프링에 Http2를 적용해보자.
Http2를 사용하기 위해서는 Https 적용이 필수적이다.

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 에 작성하면 적용 완료이다.

적용 결과

올바르게 적용됐는지 확인하고 헤더가 어떻게 다른지 살펴보자

Http + Http1.1

업로드중..

Https + Http2

업로드중..
이렇게 주의 요함이라고 뜨는데 SSL 인증서가 인증 기관에서 발급된 인증서가 아니라 자체 인증한 인증서라 그렇다. 실 배포에서는 SSL 인증서를 신뢰할 수 있는 기관에서 발급한 다음에 적용하면 된다.
업로드중..

참고

https://ijbgo.tistory.com/26

profile
총명한 개발자
post-custom-banner

0개의 댓글