본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

Express - 5장 : Authentication - 1 (Session-based Auth)

by VictorMeredith 2023. 3. 3.

1. Authentication 개요

Authentication

1. session-based authentication

- 로그인 시 cookie를 발행(session id가 적혀있다.)

- 요청 시 user의 session id를 보내고 받는다.

- 로그인 상태를 서버에 다 저장한다.

 

2. token-based (JsonWebToken)

- JWT (REST원칙에 맞다)

- 로그인 시 JSON Web Token을 발행.

- 쿠키나 로컬스토리지에 저장.

- 요청 시 user의 JWT를 헤더에 포함해서 보내고 받는다.

- JWT토큰 유효성 검사 후 보내준다.

- 유저의 로그인 상태를 저장할 필요가 없다.

 

3. Open Authentication(OAuth)

- 다른 사이트의 프로필 정보를 가져온다. (구글, 페이스북, 카카오, 애플 등)

- 로그인버튼을 누르면 동의 팝업이 뜬다

- 필요한 정보를 서버에 보낸다

- 이후에 정보를 기반으로 JWT를 발행할 수 있다.

 

2. Session-based Auth

1. 설치

npm i passport passport-local express-session

 

2. 세팅

//라이브러리 설치
const passport = require('passport')
const localStrategy = require('passport-local')
const session = require('express-session')
    
//미들웨어 설정 (app.use : 미들웨어사용 : 요청-응답 중간에 뭔가 실행되는 코드이다.)
app.use(session({secret : '비밀코드', resave : true, saveUninitialized : false}));
app.use(passport.initialize())
app.use(passport.session)

 

3. 사용 (mongoDB예제)

	app.post('/login', passport.authenticate('local',{failureRedirect: '/fail'}), (req,res)=>{ 
	  //두번째 파라미터로 passport라이브러리로 아이디비번검사
	  //local 방식으로 회원 인증
	  //auth함수 두번째 파라미터로 세팅 가능(passport라이브러리 사용법 보면됨)
	  res.redirect('/') //회원인증 성공하면 메인화면으로 이동
	})
	
	//아래는 복붙해서 썼음
	passport.use(new LocalStrategy({
	  usernameField: 'id', //form 의 name부분 
	  passwordField: 'pw', //form 의 name부분 
	  session: true, //로그인 후 세션으로 저장할것인가요? 
	  passReqToCallback: false, //id/pw말고도 다른 정보 검증 시 사용
	}, function (입력한아이디, 입력한비번, done) { // 사용자와 비번을 검증하는 콜백함수
	  console.log(입력한아이디, 입력한비번);
	  db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
	    if (에러) return done(에러) //에러처리
	    if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
	    if (입력한비번 == 결과.pw) { //pw가 암호화되지 않아서 보안이 쓰레기다
	      return done(null, 결과) // done함수 파라미터 설명 : done(서버에러, 모두 일치할때 DB데이터, 에러메시지넣는곳)
	    } else {
	      return done(null, false, { message: '비번틀렸어요' })
	    }
	  })
	}));
	
	// session을 저장시키는 코드 (로그인 성공 시 발동됨) 쿠키를 발행해줌.
	passport.serializeUser((user, done)=>{
	  done(null, user.id) //id를 이용해서 세션을 저장
	});
	
	//로그인한 유저의 개인정보를 DB에서 찾아준다 (마이페이지 접속 시 db에서 결과를 가져와서 보내준다)
	//app.get('/mypage') 이부분 안에 req.user 여기에 담기게 된다.
	passport.deserializeUser((아이디, done)=>{
	  db.collection('login').findOne({id:아이디},(err,result)=>{
	    done(null,{ result })
	  }) 
	})

 

4. 미들웨어로 사용

	//미들웨어 만들기 (mypage접속할때마다 로그인했니 함수 실행해준다)
	app.get('/mypage', 로그인했니 ,(req,res)=>{
	  res.render('mypage.ejs',{사용자 : req.user})
	  console.log(req.user)
	})

 

댓글