WEB5 - Express passport.js

passport.js 로그아웃

수업소개

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

 

 

 

강의

 

 

 

소스코드 

변경사항

댓글

댓글 본문
  1. 수두니
    ㅠㅠ 밑댓글 따라 connect-loki 설치하다가 뭔가 다 꼬여서
    ENOENT: no such file or directory이 나오네요.. 해결법 아시는 분 계실까요 ㅠ
    지금 아무것도 안되네요ㅠㅠ
  2. ldhan0715
    20-09-21
  3. 뚜루뚜루뚭
    감사합니다
  4. 쑤우
    수강완료. 감사합니다~
  5. 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 자세히 보기