퍼블릭/브로드캐스트/프라이빗 전송 개념은 Socket.IO를 사용하면서 익혀야할 중요한 서버-사이드 개념입니다. 퍼블릭(Public)은 발송자를 포함한 모든 클라이언트들에게, 브로드캐스트는 발송자를 제외한 다른 모든 클라이언트들에게, 그리고 프라이빗은 지정된 개인에게 패킷을 전송하는 것을 말합니다. 특히, 프라이빗 전송은 보안을 필요로하는 귓속말과 같은 기능을 구현할 때 아주 요긴하게 사용될 수 있습니다. 만약, 이를 구분하지 않는다면 사실상 모든 사용자들에게 귓속말에 해당하는 패킷을 발송하고 클라이언트-사이드에서 귓속말 대상 사용자 외에 다른 사용자들은 보여주지 않도록 예외처리 작업으로 구현해야겠지요. 겉으로는 완전해 보이겠지만, 이건 눈가리고 아웅입니다. 트래픽 낭비에 보안문제도 안고있죠. 다음 예제는 각기 다른 상황에 대한 응답 형태를 Node.JS 서버에서 구분한 것입니다.

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function(socket) {

  // on public
  socket.on('join', function (data) {
    io.sockets.emit('join', socket.id, data);
  });

  // on broadcast
  socket.on('message', function (data) {
    socket.broadcast.emit('message', socket.id, data);
  });

  // on privat
  socket.on('whisper', function (id, data, fn) {
    if (id && io.sockets.sockets[id]) {
      io.sockets.sockets[id].emit('whisper', socket.id, data);
      fn(true);
    } else {
      fn(false);
    }
  });

  socket.on('disconnect', function () {
    socket.broadcast.emit('close', socket.id);
  });

});

위 예제에서 브라이빗 패킷 송/수신 부분을 살펴 보면 클라이언트로 부터 수신할 대상의 id를 받는 부분에 집중해야 합니다. Socket.IO는 자체적으로 sessionId를 발급하고 이것으로 사용자를 구분합니다. 위 예제는 이 sessionId를 클라이언트에서도 동일하게 취급한다고 가정한 것입니다. 그리고 또 한 가지 주의해야 할 점은 발송 대상 추출시 룸(room) 또는 채널(channel) 범주에 구속되어야 한다는 것입니다. io.sockets.sockets 개체에는 모든 클라이언트들에 대한 정보가 들어있기 때문입니다. 물론, 룸이나 채널을 사용하지 않으면 상관 없습니다.

Comments

Got something to add? You can just leave a comment.

Your Reaction Time!

avatar

captcha