nodejs 세션,쿠키 및 인증
nodejs 세션을 통한 로그인/회원가입
가입설정
app . post ( ' /auth/register ' , function ( req , res ) { hasher ( { password : req . body . password } , function ( err , pass , salt , hash ) { var user = { username : req . body . username , password : hash , salt : salt , displayName : req . body . displayName } ; users . push ( user ) ; req . session . displayName = req . body . displayName ; req . session . save ( function ( ) { res . redirect ( ' /welcome ' ) ; } ) ; } ) ; } ) ;
password 객체를 받아 salt(인코딩된 base64 문자열)을 생성하고 해당 문자열을 통하여
hash(암호화된 값)를 만들어낸다.
그 후 아래 메서드를 통해 세션을 할당하고 저장 한 후 콜백함수로 welcome페이지로 보낸다.
req.session.displayName = req.body.displayName;
requesst에서 session객체를 사용하려면
var session = require ( ' express-session ' ) ; var FileStore = require ( ' session-file-store ' ) ( session ) ; app . use ( session ( { secret : ' 1234DSFs@adf1234!@#$asd ' , resave : false , saveUninitialized : true , store : new FileStore ( ) } ) ) ;
위 코드를 통하여 미리 설정해주어야 한다
로그인
app . post ( ' /auth/login ' , function ( req , res ) { var uname = req . body . username ; var pwd = req . body . password ; for ( var i = 0 ; i < users . length ; i ++ ) { var user = users [ i ] ; if ( uname === user . username ) { return hasher ( { password : pwd , salt : user . salt } , function ( err , pass , salt , hash ) { if ( hash === user . password ) { req . session . displayName = user . displayName ; req . session . save ( function ( ) { res . redirect ( ' /welcome ' ) ; } ) } else { res . send ( ' Who are you? login ' ) ; } } ) ; } } res . send ( ' Who are you? 2login ' ) ; } ) ;
아이디와 비밀번호를 받아 일치하는 회원이 있는지 찾아준다 (메모리에 저장한 데이터라 for을 이용)
패스워드에 salt값으로 암호환 된 내용과 사용자에게 받은 값을 salt값으로 암호화 한게
맞는지 확인한다.
로그아웃
app . get ( ' /auth/logout ' , function ( req , res ) { delete req . session . displayName ; res . redirect ( ' /welcome ' ) ; } ) ;
세션 삭제를 통한 로그아웃 구현
사용자페이지
app . get ( ' /welcome ' , function ( req , res ) { if ( req . session . displayName ) { res . send ( ` Hello, ${ req . session . displayName } logout ` ) ; } else { res . send ( ` Welcome Login Register ` ) ; } } ) ;
세션에 해당 사용자가 있을경우는 메세지를 보여주고 아닐 경우는
로그인 페이지 출력
passport.js
app . use ( passport . initialize ( ) ) ; app . use ( passport . session ( ) ) ;
패스포트를 사용하기 위한 미들웨어
app . post ( ' /auth/login ' , passport . authenticate ( ' local ' , { successRedirect : ' /welcome ' , failureRedirect : ' /auth/login ' , failureFlash : false } ) ) ;
login은 post 로 데이터를 받았을 경우 passport를 통해 검증을 하고
successRedirect는 성공하였을 경우의 링크 는 아닐경우의 링크를
출력한다.
passport . use ( new LocalStrategy ( function ( username , password , done ) { var uname = username ; var pwd = password ; for ( var i = 0 ; i < users . length ; i ++ ) { var user = users [ i ] ; if ( uname === user . username ) { return hasher ( { password : pwd , salt : user . salt } , function ( err , pass , salt , hash ) { if ( hash === user . password ) { console . log ( ' LocalStrategy ' , user ) ; done ( null , user ) ; } else { done ( null , false ) ; } } ) ; } } done ( null , false ) ; } ) ) ;
username과 password, 콜백함수를 전달받고
아이디와 패스워드를 통하여 검증을 한 후 콜백함수를 실행한다.
성공하였을 경우에는 데이터를 전달하고 그렇지 않았을 경우 false를 리턴
로그인에 성공을 하였을 경우 아래 메서드를 호출한다.
passport . serializeUser ( function ( user , done ) { console . log ( ' serializeUser ' , user ) ; done ( null , user . authId ) ; } ) ;
인증이 된 경우 페이지에 접근 시 마다 deserializeUser를 실행하게된다.
assport . deserializeUser ( function ( id , done ) { User . findById ( id , function ( err , user ) { done ( err , user ) ; } ) ; } ) ;
db에 계속 요청하기보다 reddis나 세션에 모든 데이터를 집어넣도록 하자.
쿠키
app . use ( cookieParser ( ) ) ; app . get ( ' /count ' , function ( req , res ) { res . cookie ( ' count ' , 1 ) ; res . send ( ' count: ' + req . cookies . count ) ; } ) ;
쿠키값 저장
res . clearCookie ( " key " ) ;
쿠키삭제
app . get ( ' /count ' , function ( req , res ) { if ( req . signedCookies . count ) { var count = parseInt ( req . signedCookies . count ) ; } else { var count = 0 ; } res . cookie ( ' count ' , count + 1 , { signed : true } ) ; res . send ( ' count: ' + req . cookies . count ) ; } ) ;
signedCookie를 활용한 쿠키 암호화
from http://harrythegreat.tistory.com/24 by ccl(A) rewrite - 2020-03-07 21:20:25
댓글
댓글 쓰기