Project_xxx

[Project_] TD Trouble Shooting - 2

wakelight23 2024. 12. 31. 21:33

WebSocket을 사용한 Tower Defense 게임 만들기 트러블 슈팅 - 2

로그인하고 브라우저를 닫았을 때 세션에 대한 처리

● session 개념을 도입하여 Redis에 로그인했을 때 기록을 저장하고 있다.

로그인 했을 때 시간, 토큰 등 저장


발생한 문제점

● 로그인하고나서 '로그아웃' 버튼이 생성되게 구현했지만 쿠키가 저장되지 않는 환경에서 브라우저를 닫으면
   세션이 남아 있는 현상이 발생했다.

다른 곳에 로그인 되어 있다는 알림 발생


해결 방법

● ip에 대한 개념을 도입했다. 

  - Redis session 데이터를 저장할 때 ip에 대한 데이터도 포함했다.

// src/routes/account-router.js
 // Redis에 세션 데이터 저장 (Hash 형식)
    await redisClient.hSet(sessionKey, {
      userId: user.id,
      email: user.email,
      ip: clientIp,
      loginTime: new Date().toISOString(),
      token,
    });

  - 클라이언트가 접속했던 ip를 저장함으로써 다른 ip에서 로그인했을 때, 다른 곳에 로그인되어 있음을 알리는
    메시지 생성

 

Redis에는 요로코롬 저장된다

 

// public/src/login.html
const confirmLogout = confirm(result.message); // "이미 로그인된 계정입니다."
            if (confirmLogout) {
              // 기존 세션 삭제 요청
              await fetch('http://localhost:3000/api/account/logout', {
                method: 'DELETE',
                headers: {
                  'Content-Type': 'application/json',
                },
                body: JSON.stringify({ email }),
              });

              alert('기존 세션이 종료되었습니다. 다시 로그인하세요.');
              document.getElementById('login').click(); // 재로그인 요청
            }

  - Client에서 세션 삭제 요청으로 다른 ip에서 생성된 session을 삭제를 요청하는 코드 구현
  - 이 때 삭제되는 요청에 대해서는 토큰이 필요하지 않다.

 

 

해결이 되었는가?

 

다른 곳에 로그인 되었을 때 로그아웃 하겠냐고 알림 생성

 

기존 세션을 삭제
다시 로그인 하는 과정은 귀찮기에 바로 이미 입력된 값으로 로그인!

 

 

사소하지만...

● 프로젝트에 있어서 사소한 부분이지만 개발할 때나 사용자가 이용할 때는 필요한 부분이다.

● 현재는 로컬에서 테스트하고 있기에 작동할 수도 있고, ip를 배포했을 때 상황에서 테스트가 필요하다.