프론트엔드 정복하기
Node_로그인 라우터(+쿠키 +comparePW + token) 본문
[ 로그인 라우터 ]
app.post('/api/users/login', (req, res) => {
User.findOne({email:req.body.email},(err,user) => {
if(!user){
return res.json({
loginSuccess:false,
message:"제공된 이메일에 해당하는 유저가 없습니다."
})
}
user.comparePassword(req.body.password , (err,isMatch)=>{
if(!isMatch)
return res.json({loginSuccess:false, message:"비밀번호가 틀렸습니다."})
user.generateToken((err,user) => {
if(err) return res.status(400).send(err);
res.cookie("x_auth",user.token)
.status(200)
.json({loginSuccess:true, userId:user._id})
})
})
})
})
1) '/api/users/login' 엔드포인트에서
2) User (mongoDB model)에서 email(mongoDB email)과 사용자가 입력한 email(req.body.email.)이 일치하는 것이 존재하는지 찾는다. **findOne : mongoDB 제공 method
3) 만약 user가 아니라면
4) json 형식의 msg1, msg2를 리턴한다.
5) 만약 user라면
6) user(mongoDB) 정보와 사용자가 입력한 PW가 일치하는지 비교한다.
7) isMatch가 없다면 json형식의 msg1, msg2를 리턴한다. (comparePW문에서 PW가 일치하면 isMatch를 콜백함)
8) match된다면 user(mongoDB)에 토큰을 생성한다.
9) 만약 에러가 나면 err를 리턴하고
10) 그렇지 않다면 '쿠키'에 '이름1'인 user.token을 저장한다.
11) 성공했고
12) msg1, msg2를 전달한다. (msg2에서는 user의 id를 반환한다.)
**comparePassword
user.js에서 comparePassword function을 선언한다.
userSchema.methods.comparePassword = function(plainPassword,cb){
bcrypt.compare(plainPassword, this.password, function(err,isMatch){
if(err) return cb(err);
cb(null,isMatch);
})
}
: bcrypt를 활용해, [사용자가 입력한 plainPassword]도 암호화해서 [mongoDB]와 비교할 것이다.
plainPW와 this(userSchema)PW를 bcrypt에서 비교한다.
만약 err라면 err를 콜백하고,
그렇지 않다면 다음을 콜백한다. (err=null이고, isMatch는 isMatch다.)
**generateToken
user.js에서 generateToken function을 선언한다.
const jwt=require('jsonwebtoken');
userSchema.methods.generateToken=function(cb){
var user=this;
var token = jwt.sign(user._id.toHexString(), 'secretToken')
user.token=token
user.save(function(err,user){
if(err) return cb(err)
cb(null,user)
})
}
1) jwt를 불러온다.
2) function 선언
3) user는 userSchema다.
4) token은 user(mongoDB의 ID)와 secretToken이다.
5) user.token은 ' user._id / secretToken '이다.
6) user(userSchema)는 다음을 저장한다.
7) 만약 err가 나면 err를 콜백 리턴한다.
8) 그렇지 않다면 err는 null이고 user다.
**토큰은 쿠키, 로컬스토리지 등에 저장할 수 있다.
쿠키 저장이 안전하냐, 로컬--저장이 안전하냐 의견이 분분한 상황이다.
'Node > Node_tool 사용법' 카테고리의 다른 글
Node_회원가입 라우터 (0) | 2020.05.16 |
---|---|
Node_Schema & Model (0) | 2020.05.16 |
Node_Bcrypt로 비밀번호 암호화 (0) | 2020.05.13 |
Node_비밀 설정 정보 관리 (0) | 2020.05.13 |
Node_tool 설치하기 (0) | 2020.05.12 |