일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- GIT
- game
- nodejs
- 자료구조
- Queue
- 정렬
- class
- MySQL
- TypeScript
- Sequelize
- Python
- MongoDB
- mongoose
- 게임
- OCR
- dfs
- Nest.js
- AWS
- Bull
- Express
- cookie
- Dinosaur
- react
- 공룡게임
- nestjs
- jest
- JavaScript
- flask
- typeORM
- Today
- Total
포시코딩
Node.js, MongoDB 로 웹서비스 만들기 - 12. 로그인(1) - passport 본문
로그인은 Node.js Express 의 인증 미들웨어인 Passport.js 를 이용해 구현할거임
먼저 설치 ㄱㄱ
npm install passport passport-local express-session
member.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');
var router = require('express').Router();
router.use(session({secret:'비밀코드', resave: true, saveUninitialized: false}));
// '비밀코드' -> 세션을 만들 때 쓰는 비밀번호
router.use(passport.initialize());
router.use(passport.session());
설치한 애들을 선언해주고
원래라면 미들웨어는 app.use~ 이렇게 사용할텐데
라우터로 쓰이는 member.js 위에서의 코드이기 때문에
router.use~ 로 쓰인 점 참고
로그인 검사 기능
passport.use(new LocalStrategy({
usernameField: 'id', // input name 이 id 인 값
passwordField: 'pw', // input name 이 pw 인 값
session: true, // 로그인 후 세션 저장할건지
}, (input_id, input_pw, done)=>{
db.collection('login').findOne({id: input_id}, (error, user)=>{
if(error) return done(error);
if(!user) {
console.log('로그인실패: 아디없음');
return done(null, false, {message: '존재하지 않는 아이디'});
}
bcrypt.compare(input_pw, user.pw, (error, result)=>{ // 기존 로그인 확인 코드
try {
if(result) {
console.log('로그인성공');
return done(null, user);
} else {
console.log('로그인실패: 비번틀림');
return done(null, false, {message: '비번틀림'});
}
} catch(error) {
return done(error);
}
})
})
}));
이전 로그인 기능에서 사용했던 코드를 가져와 합쳤다.
리턴시키는 done 함수는
done(서버에러, 성공시사용자db데이터, 에러메시지) 의 뜻으로 사용했음
성공시엔 done(null, user정보) 를 리턴시켜주었다.
/login 으로 POST 요청을 받을 때 위 로그인 기능이 써지게끔 코드를 수정해보자
router.post('/login', passport.authenticate('local', {
failureRedirect: '/member/loginFail'
}), (req, res) => {
res.send({code: 1});
})
router.get('/loginFail', (req, res)=>{
res.send({code: 0});
})
POST 요청 시 passport.authenticate 를 통해 위 로그인 기능이 발동됨
실패 시 failureRedirect 를 통해 '/member/loginFail' 로 보내지게 해놨는데
리액트를 쓴다면 failureFlash 라는 기능을 써서 바로 클라이언트쪽에서의 처리를 할텐데
해당 방법은 리액트를 배운 나중에 적용해볼거라 패스
로그인 POST 요청이 Ajax 로 되고 있으니 res.send 를 통해 code 값을 리턴시켜준다. 기존 로그인 코드 참고
그럼 원래 목적인 로그인 시 사용자 정보 session 은 어떻게 저장되는가?
passport 엔 로그인 성공 시 발동되는 놈이 있는데
passport.serializeUser 얘가 세션 데이터를 만들고 세션의 id 정보를 쿠키로 보낸다고 한다.
passport.serializeUser((user, done)=>{
done(null, user.id);
});
작성하면 다음과 같은 코드가 된다.
로그인에 성공했을 때 return done(null, user);
된 값에서 user 가 저 파라미터로 들어간거고
serializeUser 가 로그인 성공 시 발동된다면
다른 모든 페이지에 접근할 때 발동되는게 또 있는데
deserializeUser 다.
passport.deserializeUser((id, done)=>{
db.collection('login').findOne({id: id}, (error, result)=>{
done(error, result);
})
});
페이지에 접근할 때 위에서 세션에 저장한 user.id 를 불러와
login 컬렉션에서 해당 사용자 정보를 찾아 뱉어내는 구조다.
정리하면
로그인 -> LocalStrategy -> 로그인성공 -> serializeUser(세션저장) -> 페이지이동 -> deserializeUser(유저정보겟) -> 페이지출력
이런느낌?
나보다 더 잘 설명한 블로그가 있다.
https://p-iknow.netlify.app/backend/node/passport-local-strategy
passport, localStrategy의 동작에 대해 이해하기
들어가며 프론트 개발을 공부하다 처음으로 백엔드 코드를 작성하기 시작했다. 로그인을 구현하기 위해 passport 를 사용해야 했다. 가려진 부분이 많아 해당 패키지를 이용할 때 무슨 일이 일어
p-iknow.netlify.app
나머진 다음글
Node.js, MongoDB 로 웹서비스 만들기 - 13. 로그인(2)
이전 글에서 로그인 기능을 완성했다면 로그인 후 세션에 유저정보가 잘 저장되어 있는지 확인하는 시간을 가져보자 마이페이지 대충 만들어서 들어가면 유저아이디 나오나 확인할거임 mypage.ej
4sii.tistory.com
'Node.js' 카테고리의 다른 글
Node.js, MongoDB 로 웹서비스 만들기 - 14. 메뉴(navbar) (0) | 2022.06.27 |
---|---|
Node.js, MongoDB 로 웹서비스 만들기 - 13. 로그인(2) (0) | 2022.06.27 |
Node.js, MongoDB 로 웹서비스 만들기 - 11. 회원가입, 로그인 - bcrypt (0) | 2022.06.26 |
Node.js, MongoDB 로 웹서비스 만들기 - 10. 회원가입(2) - bcrypt 암호화 (0) | 2022.06.10 |
Node.js, MongoDB 로 웹서비스 만들기 - 9. 회원가입(1) - INSERT (3) | 2022.06.10 |