Server-Side Event(SSE)
여기서는 ref. 2 에 있는 이야기의 일부를 다룬다. 되도록 ref. 2 내용 전체를 보는 것이 더 도움이 될 듯 하다.
대략적으로 이야기하면, 이녀석은 기본적으로 ajax 로 했던 polling 을 browser 가 대신해준다고 생각하면 된다. 즉, polling 을 사용했어야 하는 모든 경우에 사용할 수 있다. 그리고 polling 이 끊겼을때등에 대한 처리에 관한 설정(id 같은, ref. 2를 참고) 도 가능하기 때문에 훨씬 편리하고 좋다.
그리고 ref.2 에 보면 SSE 는 http protocol 로 만들어졌다고 한다. 그래서 이것을 실행하는 주체는 browser 안에서 layer 가 좀 다를 수는 있지만, js script 내에서 polling 을 구현한 것이랑 거의 다를 바가 없을 듯 하다. 여하튼 ref. 2 에서는 이것을 event streaming 이라고 부른다.
event streaming 을 close 하는 법
이렇게 주기적으로 browser 가 server로 부터 event 를 받아오는데, 이것을 close 하는 방법이 2가지 있다.
- 서버에서 close 하는 법 :
- Content-Type 이 text/event-stream 가 아닌 response 를 보내거나
- 200 이외의 HTTP status 를 보낸다.
- client 에서 close 하는 법
- source.close();
다만 이런 방법으로 Event streaming 을 끝내지 않고, 만약 network 가 끊어진 상황, 즉 browser 가 아예통신을 못하거나 한 상황에 의해 event streaming 이 끊긴 경우라면, browser 가 알아서 주기적으로 연결을 위해 시도를 한다.
message event
기본적으로 발생시키는 event 는 message event 이다. 하지만, server 의 응답에 "event" 를 정의해서 browser 로 하여금 새로운 event 를 발생시키도록 할 수 있다.
event: servertime data: The server time...
source.addEventListener('servertime', function(event) { document.getElementById("result").innerHTML += event.data + "<br>"; });
Response
header 조건
- Content-Type: text/event-stream
- Cache-Control: no-cache
body
- data: data_you_want_to_put
data: The server time...
Security
보안상의 이슈로 client 에서 event handler 를 구현할 때 event 의 origin 을 check 하라고 한다.[ref. 2]source.addEventListener('message', function(e) { if (e.origin != 'http://example.com') { alert('Origin was not http://example.com'); return; } ... }, false);
댓글 없음:
댓글 쓰기