강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

likeOasis님의 프로필 이미지
likeOasis

작성한 질문수

socket.io에서 socketID 관련해 질문 있습니다

작성

·

744

·

수정됨

0

안녕하세요! 대학교에서 간단한 웹 기반 게임을 만들고 있는 대학생입니다!

다름이 아니라 실시간 채팅과 서버에서 간편한 유저 관리를 위해 socket.io를 사용하여 실시간 양방향 통신을 만들고 있는데, url이 바뀌면서 socketID가 자동으로 갱신 되어 곤란을 겪고 있습니다. 다른 페이지로 이동 해도 소켓 id를 유지 시켜 줄 수 있는 방법이 있는지 궁금해서 질문 남깁니다!

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

socket.io에서 socketID는 클라이언트와 서버 간의 실시간 통신을 위해 생성되는 유일한 값입니다. 따라서 어떤 페이지로 이동하더라도 socketID는 새로 발급되고, 기존에 사용하던 socketID는 더 이상 유효하지 않습니다. 이러한 특징 때문에 채팅방 입장 또는 유저 관리와 같은 기능을 구현할 때에는 socketID를 활용하여 구현해야 합니다.

다만, socket.io에서는 지속적으로 연결이 유지되는 경우 기존의 socketID를 사용할 수 있게끔 하는 방법을 제공합니다. 브라우저 새로고침이나 다른 페이지로 이동할 때마다 socket.io에게 기존의 socketID를 재사용하도록 할 수 있습니다. 이 기능은 클라이언트에서 소켓을 연결할 때 재연결 기능을 사용하면 구현할 수 있습니다.

Socket.io에서 기본으로 내장된 인터페이스 중에 하나인 ‘reconnection’을 사용하면 됩니다. 이 인터페이스를 사용하면 클라이언트의 연결이 끊겼다가 다시 연결되는 경우, 기존에 사용하던 socketID를 유지할 수 있습니다. 이 방법을 사용하기 위해서는 클라이언트의 소스코드에서 옵션 인자로 ‘forceNew’를 false로 설정하면 됩니다.

예시:

var socket = io.connect('http://localhost', {
  reconnection: true,
  reconnectionDelay: 1000,
  reconnectionAttempts: 5,
  forceNew: false
});

이렇게 forceNew를 false로 설정해두면, socket.io에서 클라이언트와 서버 간의 연결 유지를 시도할 때, 기존 socket ID를 사용하려 할 것입니다. 하지만 이 방법은 보안상 취약하여 사용자가 다른 유저의 ID를 훔쳐오는 것과 같은 문제가 발생할 수 있으므로 각 클라이언트별 인증 과정이 필요합니다.
따라서, 사용자 인증 과정이 필요한 상황에서는 서버 사이드에서의 세션 및 쿠키를 활용하는 방법도 고려해 보시길 추천드립니다.

추가적으로, 보안에 대한 이슈와 관련해 소켓 연결 시 토큰 방식을 사용할 수 있습니다.
감사합니다.

likeOasis님의 프로필 이미지
likeOasis

작성한 질문수

질문하기