최종 프로젝트 유저 피드백을 진행하면서 발생했던 문제점 중에 하나가 중복 접속으로 인해 메타버스 내에서 이미 들어온 유저가 한명 더 등장하고 그 유저가 나갔음에도 불구하고 해당 유저가 나가지 않은 것처럼 처리되서 지속적으로 참여한 것으로 나오는 문제가 발생했다.
이 문제를 어떻게 해결할까 고민을 하다가 중복 접속이 감지되는 순간 기존에 있던 유저는 나갈 수 있도록 처리하도록 결정하였다.
이를 통해서 사용자에게는 올바르지 않은 경로를 감지했다는 알림 메시지와 함께 해당 페이지를 리다이렉션을 통해서 해당 문제를 원천 차단하기로 했다.
그 외에도 다른 해결 방법으로 나온 것은 이미 들어간 유저가 그대로 남아있고 새로 들어가는 같은 유저가 접속조차 못하게 하는 방법도 나왔지만 해당 방법은 그러면 어떤 오류로 인해 어떤 유저가 그대로 남아있다면 정상적으로 접근한 유저는 계속해서 못들어갈 수 있는 잠재적 문제점이 있었고, 미들웨어를 이용하여 중복 로그인을 처리하려고 했지만 그러면 문제가 생기는 메타버스 외 다른 페이지에서도 추가적인 잠재적 문제가 있을 수 있었다.
중복 접속 차단은 다음과 같은 절차를 따른다.
이렇게 구현을 하고나니 기존에 중복 접속을 차단할 수 있었다. 그렇지만 화상 회의 기능을 정상적으로 이용할 수 없었다. 이는 중복 접속으로 인해서 밖으로 나가는 과정에서 socket이 disconnect되어 사용자에 대한 정보도 함께 없어졌기 때문이다. 이는 프로젝트 구조 자체를 메타버스 용 socket과 화상 회의 용 socket을 분리한 탓인데 이를 막기 위해서는 화상 회의 socket에게 특정 조건을 제공해야 한다는 것을 의미했다.
이 부분도 어떻게 해결할 것인가 얘기를 나눴고, 결론적으로 서버에서 해당 처리를 하는 것이 타당하다고 보여졌다.
프론트 단에서 처리하는 방법도 제시됐는데 다음과 같은 이유로 반려됐다.
그렇다면 서버에서 해당 처리는 어떻게 하느냐. 앞서 말한대로 소켓은 두 네임 스페이스로 나뉘어져 있어서 어떠한 방식으로 데이터를 주고 받을 수 있을까라는 근본적인 질문이 나왔고, 여러 방법들을 구상하다고 결국에는 서버 루트 파일에서 loginCheck를 객체를 변수로 만들어서 해당 네임스페이스에서 공유하는 방식으로 구현을 하였다.
이를 통해서 다음과 같은 로직으로 구현을 하였다.
이를 통해서 화상 회의 기능과 메타버스 기능을 정상적으로 이용할 수 있었고 중복 접속 또한 정상적으로 처리할 수 있었다.