CHAPTER2 - HTTP/2 맛보기

2019. 2. 25. 14:15Learning HTTP2


우리는 보통 새롭고 반짝이는 무언가를 처음 접할 때, 안내문, 유지보수 정보, 안전 권고문을 읽느라 몇 시간을 할애하지는 않는다. 포장을 뜯고, 플러그를 꽂고, 전원을 켠 후, 포장 박스의 광고대로 신비로운 체험을 바로 시작하고 싶어 한다. HTTP/2(h2)도 이와 다를 게 없다.


2.1 서버 구동하기

독자들은 HTTP/2를 일상적으로 접해왔을 가능성이 크다. 최신 브라우저(엣지, 사파리, 파이어폭스, 크롬 등)를 열고 페이스북, 인스타그램, 트위터와 같은 주요 웹사이트로 가보라. 본인도 모르는 사이에 h2를 경험하게 될 것이다. 하지만 이 책은 단순히 h2웹사이트를 소개하기보다는 h2 내부를 설명하고 족자들이 활용하도록 돕디 위해 만들어 졌기 때문에 h2로 동학하는 차세대 웹사이트를 운영할 서버를 구동해보자.

h2 서버를 구동하려면 두 가지 절차를 거쳐야 한다.

  • h2로 통신하는 웹 서버 설치하기
  • 브라우저가 서버와 h2로 통신하기 위한 TLS 인증서 발급 및 설치하기

이 두 절차 모두 쉽지는 않지만 우리는 가을한 한 단순하게 만들어 볼 것이다. 이 내용은 7.4절 '서버, 프락시, 캐시'에서 더 자세히 살펴보겠지만, 이번 장이 끝나면 h2 서버 한 대를 두공하게 될 것이다.


2.2 인증서 발급받기

인증서 관련 작업은 책 한 권으로 다룰 수 없을 만큼 방대하다. 그러므로 이론을 건너뛰고 가능한 빨리 시험용 인증서를 발급받아보자. 인증서를 얻는 세 방법으로, 온라인 생성기를 사용하는 방법, 자체 인증서 생성 방법, 인증 기관(여기서는 'Let`s Encrypt'를 사용할 것이다.)을 통한 인증서 발급 방법을 살펴볼 것이다. 처음 두 방법은 이른바 자체 서명된 인증서를 생성하며, 시험 목적으로만 쓸 수 있다는 점을 염두에 두어야 한다. 자체 서명된 인증서는 CA가 서명한 인증서가 아니므로 웹 브라우저에서 경고 메시지가 나타날 것이다.


2.2.1 온라인 생성기 사용하기

자체 서명된 인증서를 생성해주는 온라인 사이트가 많다. 안전한 환경에서 개인키를 생성하는 것이 아니니 이 인증서는 지금처럼 시험 목적 외에는 사용하면 안 된다. 웹에서 검색하면 생성기 사이트 몇 군데를 바로 찾을 수 있을 것이다. 그 중 한 군데가 https://www.sslchecker.com/cst/self_sifned다.

화면 안내를 따라 생성한 인증서와 키를 2개의 로컬 파일로 저장하면 된다. 각 파일명은 cert.pem과 privkey.pem이면 적절하다.


2.2.2 자체 서명하기

https://www.openssl.org에서 제공하는 openssl은 매우 널리 사용되며 쉽게 구할 수 있는 도구다. 거의 모든 주요 플랫폼을 지원한다. openssl로 자체 서명된 인증서와 키를 생성하는 방법을 알아보자. 유닉스/리눅스 또는 macOS 계열 시스템을 사용한다면 openssl이 이미 설치되었을 가능성이 매우 크다. 터미널을 열고 다음을 따라 해보라.


$ openssl genrsa -out privkey.pem 2048

$ openssl req -new -x509 -sha256 -key privkey.pem -out cert.pem 0days 265 \ -subj "/CN=fake.example.org"
 

privkey.pem이라는 새 키 하나와 cert.pem이라는 새 인증서 하나가 생성될 것이다.


2.2.3 Let`s Encrypt

Let`s Encrypt는 2015년 가을에 공개 베타 서비스를 시작한 신생 인증 기관이다. 누구나 쉡고 자동화된 방식으로 저렴하게(무료로) TLS 인증서를 사용할 수 있게 하려는 목적으로 설립됐다. 이는 'TLS Everywhere' 운동의 핵심이며, 모든 웹 통신은 항상 암호화되고 인증되어야 한다는 믿음을 바탕으로 한다. 여기에서는 인증서를 '쉽게' 얻을 수 있다는 점이 가능한 한 빨리 서버를 구동하려는 우리의 목적에 부합한다.

Let`s Encrypt와 연동하는 클라이언트와 라이브러리가 많지만, EFF는 certbot이라는 Let`s Encrypt 권장 클라이언트를 제공한다. certbot은 인증서를 발급한 후 웹 서버레 설치하기까지 모든 것을 대신 처리해주어 인증서 발급과 관리 절차를 완전히 자동화 해준다.


NOTE_ Let`s Encrypt에서 인증서를 발급받으려면 도메인의 소유권을 인증해야 한다. 이는 DNS나 웹 서버를 수정해 발급 신청자가 도메인의 소유권을 가지고 있음을 입증해야 한다는 의미다. 도메인이 없거나 귀찮은 절차를 피하고 싶다면 간단히 앞에 소개한 자체 서명 방식을 사용하는 게 낫다.
 

설명서를 따라 원하는 운영체제용 certbot을 내려받자. 이번 장의 목적상, 어떤 웹 서버를 사용할지는 신경 쓰지 않아도 된다. 리눅스 계열 대부분에서 가장 간단한 방법은 웹 서버가 동작중인 시스템에서 다음 명령어를 입력하는 것이다.


$ wget httpsL//dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
 

내려받기가 완료되면, 다음처럼 certbot-auto를 실행한다.


$ ./certbot-auto certonly --webroot -w <웹 루트 경로> -d <도메인>
 

웹 서버 파일시스템 루트 경로와 도메인은 여러분의 정보를 입력하자. 필요한 모든 페이지가 자동으로 설치되고 몇 가지 질문에 답하면, 마침내 Let`s Encrypt의 인증서가 발급될 것이다. 새로 발급받은 인증서와 개인키는 /etc/letsencrypt/live/<도메인> 에 저장된다.

파일 

설명 

/etc/letsencrypt/live/<도메인>/privkey.pem 

인증서의 개인키 파일 

/etc/letsencrypt/live/<도메인>/cert.pem 

새 인증서 파일 

/etc/letsencrypt/live/<도메인>/chain.pem 

Let`s Encrypt CA 체인 파일 

/etc/letsencrypt/live/<도메인>/fullchain.pem 

새 인증서와 체인을 하나로 통합한 파일 


2.3 첫 번째 HTTP/2 서버 구동하기

HTTP/2로 통신하는 웹 서버는 상당히 많다.(7.4절 '서버, 프락시, 캐시'에서 다양한 서버를 설명한다.) 여기에서는 빠르고 쉽게 서버를 구동하는 것이 목적이므로, nghttp2 패키지를 사용할 것이다. 다츠히로 츠지카와가 개발한 nghttp2는 h2로 작업하고 디버깅하는 유용한 도구를 많이 제공한다. 지금부터는 nghttpd 도구에 집중할 것이다.

nghttp2는 8.4절 'nghttp2'에서 상세히 다루므로 이번 절에서는 간단히 살펴보자. 선호하는 패키지 관리자를 사용하거나 소스를 컴파일해 nghttp2를 설치하면 된다. 예를 들어, 우분투16에서는 다음 명령어를 실행한다.


$ sudo apt-get install nghttp2
 

설치가 완료되면, 발급받은 인증서로 nghttpd를 실행한다.


$ ./nghttpd -v -d <웹 루트> <포트> <키> <인증서>
 

<웹 루트>는 웹사이트의 문서 경로, <포트>는 서버가 수신 대기할 포트 번호, <키>와 <인증서>는 앞서 생성한 개인키와 인증서 파일의 경로다.

예를 들면 다음과 같다.


$ ./nghttpd -v -d /usr/loacl/www 8443\

/etc/letsencrypt/live/yoursite.com/privkey.pem \

/etc/letsencrypt/live/yoursite.com/cert.pem
 


2.4 브라우저 선택하기

드디어 그동안의 노력에 대한 보상의 시간이 왔다. 최신 브라우저를 하나 골라 새 서버로 접속해보라. HTT{/2를 지원하는 브라우저의 전체 목록은 7.1절 '데스크톱 웹 브라우저'에서 확인할 수 있다. 자체 서명된 인증서를 생성했다면 보안 경고 메시지가 나타날 것이다. 새성한 인증서에 관한 경고 메시지를 확인한 후 승인하면 독자들의 웹사이트를 볼 수 있을 것이다.

이제 독자들의 웹사이트는 h2로 서비스 중인 것이다!