SessionStore를 통한 중복 로그인 처리

Ssookveloper·2021년 3월 10일
0

TIL-or-오늘의삽질

목록 보기
1/2

서비스에 한 아이디로 2명 이상의 유저가 로그인하지 못하게 하고 싶었다.
(a라는 아이디로 두 명이 로그인하면 먼저 로그인한 사용자는 로그아웃 되도록..)
이를 위해서 구글링을 해보니 세션 스토어를 적용하면 될 것 같았다.

connect-mongo

위의 라이브러리를 다운받고 하라는대로 했더니 compass에서 sessions라는 collection이 생성되었다.
(npmjs 짱짱..)

이제
1. 로그인할 때마다 req.session에 유저의 키값을 넣어주고
2. session에서 찾아서 있으면 지우면 되겠구나
했는데 삽질이 시작되었다.

  1. Sessions에서 find를 어떻게 하지?

현재 프로젝트에서는 models에서 스키마를 정의하고 이를 export하여 사용한다. 근데 sessions는 세션스토어에서 만들어주는 db라서? 이거를 어떻게 갖고와야할지 감이 안왔다. 그래서 collection의 이름을 통해 찾는 방법을 구글링했다.

mongoose.connection.db.collection('sessions', (err, collection) => {
	collection.find({ session: searchWord }).toArray(function (err, sessionData) { 
	//sessions에 스트링으로 쭉 들어가서 정규식을 통해 찾아주었다.
       ....

몇시간의 삽질 끝에 위와 같은 코드를 통해 db에 접근할 수 있게 되었다. 근데 find말고 findAndDelete를 사용하면 에러가 났다..

  1. 찾은 세션을 어떻게 삭제하지...

그래서 이거를 어떻게 지워줘야되나 고민하고 있었는데 친구가 session.destroy 메소드를 이야기했다. 생각해보니 로그아웃할때도 이 메소드를 통해 로그아웃하고 있었는데!
(destroy의 파라미터도 정확히 몰랐고 db에서 삭제해야한다는 강박관념이 있었다. doc을 잘봐야되...)

const sessionStore = MongoStore.create({
          mongoUrl: env.dbUrl,
        });
sessionStore.destroy(sessionData[0]._id, function (err) {...

세션스토어를 저런식으로 다시 연결하고 찾은 세션의 id를 파라미터로 삭제해주었다.
(사실 저렇게 하는지 옳은지는 모르겠다.)

이제 서비스에 a라는 아이디로 크롬 일반탭과 시크릿탭에서 차례대로 로그인을 해보았더니 먼저 로그인했던 세션은 삭제된다!
그리고 기존에는 서버를 재시작하면 로그인이 다 풀려서 다시 로그인했어야됐는데, 세션스토어를 통해 세션을 db에 저장하게 되니 다시 로그인할 필요가 없게 되었다!

첫글이라 주저리 주러리 떠들었습니다..

(질문과 논리적인 손가락질 환영합니다)

profile
💻🎸🎱🏓..

0개의 댓글