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에서 로그인했을 때, 다른 곳에 로그인되어 있음을 알리는
메시지 생성

// 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를 배포했을 때 상황에서 테스트가 필요하다.