웹소켓 프로토콜 1 : 양방향통신, Postback, Ajax에 이어 등장한 웹소켓
웹소켓 이전 클라이언트-서버간 양방향 통신 기술
polling
- 전송할 데이터의 유무에 상관없이
클라이언트가 지정된 시간 간격에 맞춰 주기적으로 요청을 수행한다.
보낼 데이터가 없는 경우 적절히 서버에서 핸들링 해준다.
클라이언트가 지정된 시간 간격에 맞춰 주기적으로 요청을 수행한다.
보낼 데이터가 없는 경우 적절히 서버에서 핸들링 해준다.
- 대부분의 경우 연결이 많이 필요하다.
- 전송할 양에 비해 너무 많은 자원을 소비한다.
보낼 데이터가 없는데도 일단 요청을 받는다.
보낼 데이터가 없는데도 일단 요청을 받는다.
- 서비스 규모가 작은 경우 사용 할만하다.
- 서버 push가 불가능하다.(full-duplex가 아니다.)
- 매 요청마다 http header가 패킷에 동반되기 때문에
상대적으로 websocket보다 부하가 높다.
상대적으로 websocket보다 부하가 높다.
long polling
- polling과 달리 지연 없이 메시지를 전달한다.
polling은 주기에 도달했을 때만 요청을 수행하기 때문에
다음 요청까지 기다려야 데이터를 받을 수 있지만
long polling은 데이터가 생길 때 까지 연결을 닫지 않고 유지한다.(untill timeout)
데이터가 생기면 곧바로 응답한다.
polling은 주기에 도달했을 때만 요청을 수행하기 때문에
다음 요청까지 기다려야 데이터를 받을 수 있지만
long polling은 데이터가 생길 때 까지 연결을 닫지 않고 유지한다.(untill timeout)
데이터가 생기면 곧바로 응답한다.
- 타임아웃 된 경우에도 응답을 반환한다.
- 위의 이유로 폴링보다 성능적으로 향상되었다.
- polling보다 실시간성이 높다.
- 연결을 닫지않고 유지하기 때문에
연결 유지와 동시 접속 처리에 대한 고려가 필요하다.
연결 유지와 동시 접속 처리에 대한 고려가 필요하다.
( 계속해서 TCP 연결은 유지되므로 )
HTTP Polling Use-case
- 이메일 업데이트
- 날씨 정보 업데이트
스트리밍
- 클라이언트의 요청에 대해 서버는 무기한 연결을 유지한다.
- 준비가 되면 데이터를 보낸다.
스트리밍은 앞 2가지 방법에 비해 다음과 같은 개선이 이루어졌다.
과도한 요청의 수를 줄였고 데이터 스트림을 연결 1개로 유지할 수 있다.
하지만 HTTP 헤더가 포함되어있다.
HTTP 헤더의 정보량은 꽤 많다.
이 기술들은 전부
- http header를 전송한다.
- 클라이언트-서버 한 쪽이 완료될 때까지 기다려야하는 반이중 통신 방식이다.
- 웹 서버가 많은 자원을 소모한다.
Postback과 AJAX
postbacks는 클라이언트가 서버에 요청한 응답이 도착할 때 페이지가 새로 고쳐지는데
이 현상을 '포스트백' 이라고 한다.
새로운 페이지 로딩은 화면 깜빡임을 수반한다.
ajax가 등장하면서 이미 렌더링된 UI를 방해하지않고
자바스크립트 코드의 비동기 실행을 가능하게 해 주면서
일부분만 수정을 위해 서버에 요청 및 서버로부터 응답을 받을 . 수있다.
ajax를 사용하지 않았다면
소셜 네트워크 서비스의 친구 게시글에 댓글 하나하나 달릴 때마다
페이지 새로고침이 발생할 것이다.
웹소켓 프로토콜
- 웹소켓은 TCP 기반 소켓 API를 대체할 목적으로
HTML5 사양에서 TCPConnection으로 처음 참조되었다.
HTML5 사양에서 TCPConnection으로 처음 참조되었다.
- 2008년 6월, 일련의 토론이 마이클 카터(Michael Carter)에 의해 주도되었으며,
웹소켓으로 알려진 최초 버전의 프로토콜이 탄생되었다.
- tcp 트랜스포트 프로토콜 위에서 동작하는 애플리케이션 계층 프로토콜이다.
웹소켓은 HTTP 포트 80과 443 위에 동작하도록 설계됨.
- request-response 메시지 쌍으로 이뤄진 HTTP와 달리,
웹소켓 프로토콜은 데이터의 변경사항에 대해 실시간으로 알아차릴 수 있고
실시간 양방향, 전이중 통신이 가능하다.
(이벤트 발생시 즉시 보냄. 반면, polling은 interval이 주어짐.)
- 브라우저의 웹 소켓 API는 W3C에서 표준화 진행중임.
- 지속적인 연결이 보장되므로
데이터를 푸시하고 이벤트 기반 통신을 가능하게한다.
- 초기 세팅의 오버헤드를 제외하고는(websocket upgrade)
http polling 방식보다 부하가 적다.
http polling 방식보다 부하가 적다.
웹소켓 프로토콜의 수립 절차는 다음과 같다.
0. TCP 연결
0. TCP 연결
1. http handshake
2. 웹소켓 프로토콜로 업그레이드
3. 같은 tcp 연결 상에서 데이터를 주고 받는다.
웹소켓 프로토콜의 Use-case
- 주식 거래 정보
- 채팅
- 멀티플레이어 게임
웹소켓 프로토콜의 보안 관점
통합 자원 식별자
웹소켓 프로토콜 사양은 2개의 새로운 통합 자원 식별자(URI) 스킴인
ws(WebSocket)(ws://), wss(WebSocket Secure)(wss://)를 정의.
각각 암호화되지 않은 연결과 암호화된 연결에 사용.
프록시 경유
웹소켓 프로토콜 클라이언트 구현체는
목적지 호스트와 포트에 연결할 때
사용자 에이전트가 프록시를 사용하도록 구성되어 있는지 확인을 시도한다.
만일 그러한 경우 HTTP CONNECT 메소드를 사용하여 영구적인 터널을 구성한다.
웹소켓 프로토콜 그 자체는 프록시 서버와 방화벽을 인지하지 못하지만
HTTP 호환 핸드셰이크의 기능을 제공하므로
HTTP 서버들이 기본 HTTP와 HTTPS 포트(80과 443)를
웹소켓 게이트웨이나 서버와 공유할 수 있게 한다.
일부 프록시 서버는 투명(transparent)하며 웹소켓과 잘 동작한다.
다른 것들은 웹소켓이 정상 동작하지 못해 연결을 실패한다.
일부의 경우 추가 프록시 구성이 필요할 수 있으며
웹소켓 지원을 위해 특정 프록시 서버의 업그레이드가 필요할 수 있다.
암호화되지 않은 웹소켓 트래픽이
웹소켓을 지원하지 않는 명시적이거나 투명한 프록시 서버를 통해 경유하는 경우
연결이 실패할 가능성이 높다.
암호화된 웹소켓 연결에서는
웹소켓 보안 연결에 전송 계층 보안(TLS)을 사용한다.
브라우저가 명시적인 프록시 서버를 사용하도록 구성될 때
HTTP CONNECT 명령이 발행됨을 보증한다.
HTTP Tunnel
두 포인트 간에 네트워크적인 제약사항 ( firewall, nat, acl)이 있을 때
두 지점간 네트워크 링크를 만들기 위해 생성한다.
중개 역할을하는 프록시 서버에 의해 생성된다.
프록시 서버는 주로 DMZ에 위치.
HTTP CONNECT 메서드
HTTP Tunnel은 HTTP CONNECT 메서드를 통해
HTTP 프록시 서버에게 원하는 지점으로 tcp connection을 포워딩 해 줄 것을 요청한다.
프록시 서버는 클라이언트 대신 이 작업을 수행한다.
프록시 서버-종착지 연결이 수립되면,
프록시 서버는 TCP 스트림을 클라이언트-종착지 사이에서 교환한다.
이 방법으로 클라이언트는 HTTP proxy 뒤에서 SSL/TLS을 이용하여
원하는 웹 사이트에 접속한다.
proxy 서버에서는 이를 이용하여
http 요청을 https 요청 포트로 redirect할 수도 있고 아예 막을 수도 있다.
참고
다음 글에서는 웹소켓 애플리케이션을 개발할 때 쓰는 웹소켓 API를 다룰 예정.
댓글
댓글 쓰기