[Spring boot 강의] #2 스프링부트 HTTPS / HTTP2적용하기 :: 잡다한 프로그래밍
반응형

1. HTTPS란

  • HTTP는 인터넷에서 웹 서버와 사용자 브라우저간 문서를 전송하기 위한 통신 규약이다. HTTP는 정보를 텍스트로 주고받기 때문에 누군가가 네트워크 이를 가로챈다면 정보를 확인할 수 있어서 보안에 취약하다 HTTPS는 이를 암호화하여 보안상의 문제를 해결해주는 프로토콜이다
  • HTTPS는 새로운 프로토콜이 아닌 HTTP와 통신을 하는 소켓 부분을 SSL이나 TSL로 대체하는 것 즉 사용자는 SSL과 통신하여 암호화된 정보를 주고받는다.
  • HTTPS는 공개키 암호화 방식을 사용한다. 공개키 암호화 방식에는 비밀키와 공개키가 존재하는데 비밀키는 서버 쪽에 가지고 있으며 공개되어서는 안 되고, 공개키는 누구에게나 공개되어도 괜찮은 키이다. 먼저 클라이언트는 공개키를 통해 텍스트를 암호화하고 이는 비밀키로만 복호화할 수 있다 따라서 다른 사람이 정보를 가로채더라도 비밀키만 안전하다면 괜찮은 방식이다.

2. SpringBoot에 HTTPS 적용하기

 

#1) 사전준비

  • 스프링 부트 2.2.5 RELEASE, Dependency로 spring Web사용
  • Maven 사용 (Gradle사용 가능)
  • JAVA 1.8, 내장 톰캣 9 사용

 

#2) JAVA를 이용한 인증서 만들기

Intellij 터미널에서 다음과 같이 keystore.p12라는 키를 만든다 입력해야 할 이름, 도시 등 정보는 임의로 입력한다. 인증받은 키가 아니고 로컬에서 확인하는 용도 이므로 자유롭게 입력한다. 만약 인증된 키를 사용할 경우 값을 지불하고 이용해야 한다.

keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000

 

#3) application.properties 추가

키가 만들어졌다면 다음과 같은 내용을 추가한다

server.ssl.key-store= keystore.p12
server.ssl.key-store-password= 본인이 입력한 패스워드
server.ssl.key-store-type= PKCS12
server.ssl.key-alias= spring

#4) 프로젝트 실행

http://localhost:8080가 아닌 https://localhost:8080으로 접속해야 작동하는 것을 확인할 수 있다.


3. HTTP2란?

  • HTTP는 그림과 같이 기본적으로 1번의 연결로 1개의 리소스를 요청할 수 있다. 따라서 동시 요청이 어렵고 느리다.
  • 만약 총 4개의 데이터 a, b, c, d가 있다고 할 때 a가 만약 요청 시간이 가장 길다면 b, c, d는 순차적으로 요청시간이 느려지게 될 것이다. 이를 HOL Blocking 이라 한다
  • 무거운 Header구조를 가지고 있어 속도가 느리다
  • HTTP2는 HTTP/1.1의 무거운 헤더 정보를 압축하는 HPACK방식을 사용하여 데이터의 크기를 줄였다
  • 하나의 연결에 한 번의 정보가 아닌 여러 개의 메시지를 전달하여 순서에 상관없이 Stream으로 받을 수 있게 개선되었다
  • HTTP/1.1보다 약 15~50% 향상된다고 한다 (웹 기준)

 

4. SpringBoot에 HTTP2 적용하기

#1) 사전 준비

  • 스프링 부트 2.2.5 RELEASE, Dependency로 spring Web사용
  • Maven 사용 (Gradle사용 가능)
  • JAVA 9, 내장 톰캣 9 버전 사용 (이 버전을 이용하지 않을 시 과정이 복잡하여 버전을 올리는 것을 추천)

 

#2) 인텔리제이에서 JAVA 1.8로 사용하다가 9 버전으로 바꾸고 에러가 나는 경우

File > ProjectStructure > Project Settings > project에 Project SDK 버전을 JAVA 9 버전으로 변경

File > ProjectStructure > Project Settings > Modules > Dependencies에 ModuleSDK버전을 JAVA 9 버전으로 변경

 

#3) application.properties 추가

키가 만들어졌다면 다음과 같은 내용을 추가한다. HTTP2는 SSL이 반드시 적용되어야 사용할 수 있다. HTTPS 과정을 마치고 진행해야 한다.

server.ssl.key-store= keystore.p12
server.ssl.key-store-password= 본인이 입력한 패스워드
server.ssl.key-store-type= PKCS12
server.ssl.key-alias= spring
server.http2.enabled=true

#4) 프로젝트 실행

프로젝트 실행 후 다음과 같이 요청을 날려보면 HTTP/2로 통신하는 것을 확인할 수 있다.

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

 

반응형

+ Recent posts