。공부 。

SPDY - 스피디를 적용하고 사용해 보자.

kyoe 2015. 2. 6. 18:46
스피디란 무엇인가?
     SPDY(스피디/speedy/로 발음)는 웹 콘텐츠를 전송할 목적으로 구글이 개발한 개방형 네트워크 프로토콜이다.
     HTTP의 단점을 보안하여 앞으로의 인터넷 환경을 효율적으로 개선하는데 그 목적이 있다.
     웹 페이지 부하 레이턴시를 줄이고 웹 보안을 개선하는 목표 면에서 HTTP와 비슷하다.
     압축, 다중화, 우선순위, 설정을 통한 레이턴시 감소를 달성한다.    

스피디 특징
     1. 항상 TLS(SSL) 위에서 동작
 HTTS 가 적용된 웹 사이트에서만 사용가능하다.
     2. HTTP 헤더압축
          과거에는 헤더의 용량이 몇바이트 였지만 지금 2kb가 넘고 점점 증가하고 있다 스피디는 이를 효율적으로 압축하여 전송한다.
     3. 바이너리 프로토콜
          프라임 텍스트가 아닌 바이너리로 구성하므로 파싱이 빠르고 오류 발생 가능성이 적다.
     4. Multiplexing
          하나의 커넥션으로 다수의 요청을 동시에 처리한다.(HTTP는 하나의 커넥션에 하나만 처리)
     5. 우선순위 설정
          데이터 전송시 우선순위를 주어 우선순위가 높은데이터가 먼저 전송되도록 한다.
     6. Server Push
          클라이언트에서 요청이 없더라도 서버에서 데이터를 push (전송)할 수 있다.
          서버푸쉬는 따로 구현 필요
     7. 웹사이트 재작성 필요없음
          SPDY를 적용한다고 해서 기존에 있는 웹사이트를 제작성한다거나 할 필요는 없다.


그동안 잘 써온 HTTP 대신 왜 SPDY를 써야할까?
     HTTP 1.1 은 무려 15년전에 만들어져 지금까지 사용하고 있다.
     그때는 하나의 웹페이지에 제공하고자 하는 정보의 양이 적었고 하나의 페이지를 보여줄때 필요한 리소스들이 많이 들지 않았기 때문에
     지금의 HTTP 만으로도 충분했다
     15년이 지난 지금은 리소스가 무려 20배는 증가 되었다.

     웹페이지 로드에 사용되는 리소스 (yahoo 기준)
          1999년 : request 3개, 사이즈 34kb
          2014년 : request 73개, 사이즈 658,4kb


설치방법 (centos)
     nginx
          nginx 설치시 옵션을 추가해준다.
          —with-http_spdy_module —with-http_ssl_module

          /etc/nginx/nginx.conf에 SSL과 SPDY 설정               
               Listen 443 ssl spdy;
               ssl_certificate ssl/xxx.crt;
               ssl_certificate_key ssl/xxx.key;

     apache
          아파치는 스피디모듈만 따로 설치할 수 있다.
          rpm –U mod-spdy-*.rpm

          아파치 openssl 설정
          /etc/httpd/conf/httpd.conf
               SSLCertificateFile ssl/xxx.crt;
               SSLCertificateKeyFile ssl/xxx.key;

          스피디 설정
          /etc/httpd/conf.d/spdy.conf 
               spdyEnabled on


스피디가 정상적으로 적용되었으면 아래와 같이 확인 가능하다.
     크롬브라우저(주소창에 입력): chrome://net-internals/#spdy
     파이어폭스(확장기능 설치) : https://addons.mozilla.org/ko/firefox/addon/spdy-indicator/ 




서버푸쉬(server push) 테스트
     nginx는 서버푸쉬를 아직 지원하지 않는다.

     클라이언트 호출 없이 서버에서 데이터를 헤더로 전송하면 브라우저는 이를 캐시로 가지고 있다가 사용하게 된다.
     테스트로 50개의 이미지를 푸시하는데 여기에서 5.jpg이미지는 푸쉬 목록에서 제외한뒤 테스를 해보았다.
     아래 이미지에서 보는것 처럼 나머지는 캐시 되어 있지만 5.jpg는 캐시되어있지 않은것을 확인 할 수 있다.


푸시할 이미지 목록



푸시결과 5.jpg를 제외한 이미지들은 캐시되어있는 것을 확인 할 수 있다.




서버와 브라우저 지원
Server
     Apache(2.2.*): mod_spdy
     Erlang-spdy
     Node-spdy
     Netty 3.3.1 (jboss)
     Jetty 70602
     Nginx 1.3 이상
     Tomcat 8.0.0-dev
Browser
     Chrome: v 11이상, ice Cream Sandwich
     Amazon Silk(Kindle Fire)
     Firefox: v 13 이상
     Opera version 12.1이상