WEB5 - Express passport.js

passport.js 로그아웃

수업소개

Passport.js 에서 로그아웃하는 방법을 알아봅니다.

 

 

 

강의

 

 

 

소스코드 

변경사항

댓글

댓글 본문
  1. CrashOverride
    저도 세션 인증이 반영된 모습을 새로고침 해줘야만 한다던가 FIleStore의 파일 읽고 쓰는 타이밍, 권한 등등의 문제로 오류 로그가 간헐적으로 발생해서
    asekang님 말씀을 기초로 express session store들 중 하나로 제공되는 connect-loki 미들웨어를 설치하여 해결했습니다.

    우선 기존에 FIleStore 방식으로 작성된 main.js의 코드를 보면
    ## main.js ####################
    var session = require('express-session')
    var FileStore = require('session-file-store')(session)
    ...
    ...
    ...
    app.use(session({
    store: new FileStore(),
    secret: 'blahblah~~~@#$',
    resave: false,
    saveUninitialized: true
    }))
    ...
    ...
    ...
    #################### main.js ##

    요런 형태인데 일단 session-file-store는 잠시 옆으로 치워놓고
    아래 모듈을 추가적으로 설치하고 코드 몇 줄 교체하니 깔끔하게 잘 작동하네요~

    @@ 명령 프롬프트(도스창)에서 @@@@@
    npm install connect-loki -save

    만약 설치 중 lokijs 가 있네 없네 하면서 실패하면 아래 명령을 순차적으로 실행

    npm install lokijs -save
    npm install connect-loki -save
    @@@@@ 명령 프롬프트(도스창)에서 @@

    ## main.js ####################
    var session = require('express-session')
    //var FileStore = require('session-file-store')(session)
    var LokiStore = require('connect-loki')(session)
    ...
    ...
    ...
    /*
    app.use(session({
    store: new FileStore(),
    secret: 'blahblah~~~@#$',
    resave: false,
    saveUninitialized: true
    }))
    */
    app.use(session({
    store: new LokiStore(),
    secret: 'blahblah~~~@#$',
    resave: false,
    saveUninitialized: true
    }))
    ...
    ...
    ...
    #################### main.js ##

    그리고 요릏게 조치하고 제 경우는 pm2를 사용 중이라 이것을 기준으로 말씀 드리면

    기존 FileStore(sesson-file-store) 사용할 때
    pm2 start main.js --watch --ignore-watch="data/* sessions/*" 실행해줘야
    sessions 디렉토리 밑에 나타났다 사라지고 바뀌는 파일들을 무시했는데

    Loki 적용 후에는 session-store.db 라는 파일이 프로젝트 루트 디렉토리 밑에 생성되기 때문에
    pm2 start main.js --watch --ignore-watch="data/* session-store.db" 요릏게 바꿔서 실행해주셔야
    세션 관련된 동작이 일어날 때마다 was가 재기동되는 상황을 막을 수 있습니다.

    그리고 여담이지만
    connect-loki 설치할 때 lokijs 어쩌고 하면서 오류가 나던 게 제 상황인데
    어쨌든 최종적으로 다 설치해놓고 connect-loki의 package.json을 열어보니 lokijs가 의존 모듈로 엮여있어
    필요하면 lokijs 까지 알아서 설치를 했어야 됐을텐데
    왜 오류가 났던건지 모르겠네요 ㅎㅎ..

    Loki.js 랑 connect-loki 에 관한 자세한 정보는 공식 깃헙 리포지터리 참고하세요~
    https://github.com......iJS
    https://github.com......oki
    대화보기
    • Dea No
      오 감사합니다
      되네요
      대화보기
      • asekang
        FileStore 의 파일 쓰기 작동 방식이 Windows 와 Unix(Linux) 방식과 틀려 작동이 상이하게 된다고 나오네요(Win 7에서는 해결되었는데 Win10 에서는 여전히 오류 발생한다고 Google 검색)
        가장 단순히 해결하는 방법은 session-file-store를 사용하지 않고 connect-loki 를 사용하면 패스포트 예시 그대로 작업해도 되고 여기서 설명하는 그대로 작동되는 것을 확인할 수 있습니다. connect-loki 는 디렉토리 루트에 session-store-db 파일을 만드는데 여기에 passport 항목을 보면 로그온 성공 시 사용자 detail 을 확인할 수 있습니다.
      • 홍지성
        만약에 facebook / google / ID,PW 세가지를 사용하려고 하면
        serializeUser, deserializeUser 함수 내부에서 조건을 만들어서 다른 처리를 해주어야 하는건가요?
      • 굼벵이
        완료
      • DOTOLEE
        main.js에서
        app.use(session({
        httoOnly : true,
        sercure : true,
        secret: 'keyboard cat',
        resave: false,
        saveUninitialized: true
        //store : new FileStore()
        }))

        store 부분 주석 처리하면 새로고침 안해도 됩니다.
      • 저도 새로고침 해야 나오는 현상이...
      • leesj020925@naver.com
        저는 pm2 나 nodemon 안쓰고 콘솔에서 node main.js 이렇게 껐다 키면서 강의를 진행해 왔는데요.
        밑에 분 처럼 로그인 했을때 닉네임이랑 로그아웃 버튼으로 바로 안바뀌는 현상이 나타나네요. 새로고침을 해야 정상적으로 나타납니다... 문제 해결 방법이 있을까요?
      • Specialist
        어째 아무리 해봐도 그냥 세션을 이용해서 하는것만 못한거 같아요. 이고잉님 이거 너무 어렵네요...
      • 치미
        로그인 할 때도 바로 적용이 안되는 경우가 있는데
        로그아웃 할 때 save나 destroy처럼 세션에 대한 처리를 완료한 다음에
        콜백함수를 통해 다음작업을 진행 할 수 있는 함수가 있나요? 아니면 pm2문제일까요?
      • evilsakura22
        세션파일 자체는

        유저가 로그인을 하든 안하든

        express-session 미들웨어를 사용하기만 하면

        언제나 만들어지고 사용되는 것이니까요.
      • evilsakura22
        그러니까 로그아웃을 할 때 세션파일을 지우면 안되고,
        로그인을 하면서 저장한 데이터만 지우면 됩니다.

        로그인 할때 req.session.is_logged = true; 라고 했다면
        로그아웃할때는 delete req.session.is_logged; 만 하면 됩니다.
      • evilsakura22
        request.session.destroy() 를 사용하면 세션파일이 삭제됩니다.

        그런데 response.redirect('/')로 홈으로 다시 돌아올때,
        다시 요청을 보내면서 request header에는
        이미 지워진 파일이름에 해당하는 세션아이디를 쿠키값으로 여전히 가지고 있기 때문에,
        이미 지워진 파일을 다시 찾으려고 하기에 콘솔에서 파일을 찾을 수 없다고 나오는 것입니다.
      • 삼고잉
        잘 읽었습니다
      graphittie 자세히 보기