nextjs socket을 이용한 중복 접속 차단

이진호·2024년 2월 6일
4

최종프로젝트

목록 보기
18/18
post-thumbnail
post-custom-banner

최종 프로젝트 유저 피드백을 진행하면서 발생했던 문제점 중에 하나가 중복 접속으로 인해 메타버스 내에서 이미 들어온 유저가 한명 더 등장하고 그 유저가 나갔음에도 불구하고 해당 유저가 나가지 않은 것처럼 처리되서 지속적으로 참여한 것으로 나오는 문제가 발생했다.

이 문제를 어떻게 해결할까 고민을 하다가 중복 접속이 감지되는 순간 기존에 있던 유저는 나갈 수 있도록 처리하도록 결정하였다.
이를 통해서 사용자에게는 올바르지 않은 경로를 감지했다는 알림 메시지와 함께 해당 페이지를 리다이렉션을 통해서 해당 문제를 원천 차단하기로 했다.

그 외에도 다른 해결 방법으로 나온 것은 이미 들어간 유저가 그대로 남아있고 새로 들어가는 같은 유저가 접속조차 못하게 하는 방법도 나왔지만 해당 방법은 그러면 어떤 오류로 인해 어떤 유저가 그대로 남아있다면 정상적으로 접근한 유저는 계속해서 못들어갈 수 있는 잠재적 문제점이 있었고, 미들웨어를 이용하여 중복 로그인을 처리하려고 했지만 그러면 문제가 생기는 메타버스 외 다른 페이지에서도 추가적인 잠재적 문제가 있을 수 있었다.

구현 방법

중복 접속 차단은 다음과 같은 절차를 따른다.

  1. 해당 스페이스(특정 메타버스 환경)에 들어가 있는지를 확인한다.
  2. 들어가 있지 않다면 기존의 작업을 진행한다.
  3. 만약 이미 유저가 들어가 있다면 이미 들어가 있는 유저라고 메시지를 보낸다. 메시지를 받은 유저는 중복 접속 알림과 함께 메타버스 환경 밖으로 나간다.
  4. 새롭게 들어온 유저는 해당 스페이스에 머물게 한다.

또 다른 문제

이렇게 구현을 하고나니 기존에 중복 접속을 차단할 수 있었다. 그렇지만 화상 회의 기능을 정상적으로 이용할 수 없었다. 이는 중복 접속으로 인해서 밖으로 나가는 과정에서 socket이 disconnect되어 사용자에 대한 정보도 함께 없어졌기 때문이다. 이는 프로젝트 구조 자체를 메타버스 용 socket과 화상 회의 용 socket을 분리한 탓인데 이를 막기 위해서는 화상 회의 socket에게 특정 조건을 제공해야 한다는 것을 의미했다.

이 부분도 어떻게 해결할 것인가 얘기를 나눴고, 결론적으로 서버에서 해당 처리를 하는 것이 타당하다고 보여졌다.

프론트 단에서 처리하는 방법도 제시됐는데 다음과 같은 이유로 반려됐다.

  1. 메타버스는 클래스를 이용하여 내부에서 소켓에 대한 이벤트가 처리되는데 이곳에 화상 회의 소켓 로직을 넣기에는 서로 로직을 분리하기 위해서 나눠놨던 것을 합치는 것이기 때문에 부적절하다.
  2. 서로 합친다고 하더라도 복잡한 소스 코드가 되고 유지보수가 힘들 뿐더러 단일 원칙에 위배된다.

그렇다면 서버에서 해당 처리는 어떻게 하느냐. 앞서 말한대로 소켓은 두 네임 스페이스로 나뉘어져 있어서 어떠한 방식으로 데이터를 주고 받을 수 있을까라는 근본적인 질문이 나왔고, 여러 방법들을 구상하다고 결국에는 서버 루트 파일에서 loginCheck를 객체를 변수로 만들어서 해당 네임스페이스에서 공유하는 방식으로 구현을 하였다.
이를 통해서 다음과 같은 로직으로 구현을 하였다.

  1. 해당 스페이스에 들어가 있는지를 확인한다.
  2. 들어가 있지 않다면 기존의 작업을 진행한다.
  3. 만약 이미 들어가 있다면 이미 들어가 있는 유저라고 메시지를 보낸다. 메시지를 받은 유저는 중복 접속 알림과 함께 메타버스 환경 밖으로 나가기 전에 소켓을 disconnect한다.
  4. 서버의 메타버스 소켓에서 disconnect 이벤트를 수신받으면 해당 이유가 client의 의도적 disconnect라면 loginCheck에 true처리를 한다.
  5. 이어서 메타버스 페이지에서 대시보드 페이지로 넘어가면서 화상 회의 socket도 disconnect 이벤트를 수신하게 되고, 이때 loginCheck가 true라면 지금 현재 들어온 유저는 남아 있어야 하는 유저로 판단을 하고 disconnect 이벤트 핸들러를 실행하지 않는다.
  6. loginCheck에 해당 유저를 없애버린다.
  7. 새롭게 들어온 유저는 해당 스페이스에 머물게 한다.

이를 통해서 화상 회의 기능과 메타버스 기능을 정상적으로 이용할 수 있었고 중복 접속 또한 정상적으로 처리할 수 있었다.

profile
dygmm4288
post-custom-banner

0개의 댓글