1. 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)
})
'더이상 하지 않는 Backend - NodeJS > Node-Express 개론(완)' 카테고리의 다른 글
[O'REILLY] Node & Express - 2장 : NodeJS 시작하기 (0) | 2023.03.06 |
---|---|
[O'REILLY] Node & Express - 1장 : EXPRESS에 대하여 (0) | 2023.03.06 |
Express - 4장 : Mongoose 의 CRUD (0) | 2023.03.03 |
Express - 3장 : Mongoose 더 살펴보기 (0) | 2023.02.27 |
Express - 2장 : MongoDB / Mongoose 세팅하기 (0) | 2023.02.27 |
댓글