WebSocket 그리고 Spring4.0
2015.11.29
http://pigbrain.github.io
이현동
HTTP - 웹 브라우저와 웹 서버가 통신하는 규약 - 요청 / 응답 형태
웹 브라우저
웹 서버
주소입력링크클릭…
HTML 렌더링JS 실행
…
요청 처리
요청 응답
브라우저의 요청이 있어야 서버는 응답을 보낼 수 있다서버에서 이벤트가 발생하면 브라우저에 통지할 수 없다
Facebook 메신저 Gmail 메신저
웹 브라우저
웹 서버
onTimer()
요청 빈 응답
onTimer() onTimer()
응답
Polling
트래픽 통신할 필요가 없어도 요청 / 응답 발생
서버 부하 요청 / 응답이 계속 발생하니까 ..
지연시간 요청 간격에 따라 응답 시간도 달라짐
Polling
웹 브라우저
웹 서버
요청 응답
Long Polling
기다린다 이벤트가 발생하면응답을 보낸다 기다린다
응답 처리 후 다음 요청을 보낸다
웹 브라우저
웹 서버
요청 응답
Long Polling
저장해둔 이벤트를 보낸다 기다린다
응답 처리 후 다음 요청을 보낸다
이벤트 발생 대기중인 요청이 없을 경우 일단 저장 !
복잡하다 이전에 발생한 이벤트가 있는지 ,, 대기중인 요청이 있는지 ,,
지연시간 요청 이전에 이벤트가 발생하면 바로 응답을 보낼 수가 없다
Long Polling
웹 브라우저
웹 서버
HandShake
WebSocket
CONNECT(WebSocket Hand-
Shake)Send
Send
Receive
Receive
WebSocket
트래픽서버부하
지연시간복잡하다
WebSocket
포트 - HTTP (80) - HTTPS (443)
URL - http://www.websockets.org - ws://www.websockets.org
WebSocket HandShake
웹소켓으로 연결 하기 위해서웹브라우저와 웹서버는 HandShake 과정을 거쳐야 한다
WebSocket HandShake
웹 브라우저
웹 서버
CONNECT(WebSocket Hand-
Shake)
WebSocket HandShake
요청 응답
Sec-WebSocket-Key : Base64 로 인코딩된 랜덤한 16 바이트의 문자열Sec-WebSocket-Version : 무조건 13 !
Updage : “websocket” 키워드가 반드시 있어야 한다
Connection : “Upgrade” 토큰이 반드시 있어야 한다
WebSocket HandShake
요청 응답
Sec-WebSocket-Key : Base64 로 인코딩된 랜덤한 16 바이트의 문자열Sec-WebSocket-Key + “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” -> uRovscZjNol/umbTt5uKmw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
-> SHA-1 으로 해싱 -> acb1c2930fd22ac3 bd1801ff65216104 04c32ab5
-> Base64 로 인코딩 ->rLHCkw/SKsO9GAH/ZSFhBATDKrU=
WebSocket Frame
웹소켓 HandShake 완료 후 정해진 데이터 Frame 에 따라 양방향 통신이 가능
application data : 0x00 Hello World 0xFF….. ( 이하 생략 )
Sprint 4.x(WEBSOCKET)
1. web.xml
2. Configuration
ws://localhost:8080/chat
3. Handler (Controller)
소켓 연결 완료메시지 수신
메시지 전송
소켓 연결 종료
JavsScript(WEBSOCKET)
소켓 연결 완료
메시지 수신
소켓 끊어짐
메시지 전송
Reference- http://www.websocket.org
- NDC12 실시간 HTTP 양방향 통신 – 이승재- http://www.codeproject.com/Articles/209041/HTML5-
Web-Socket-in-Essence#WebSocketInEssence