Auth Boiler Plate with Node.js-JWT
29 Apr 2021 | Node.jsBoiler Plate with Node.js - JWT
JSON Web Token
지난번 포스팅의 token 생성 부분을 이어서 작성한다
클라이언트가 보낸 요청의 이메일이 있으면 genToken 메소드를 사용해 토큰을 생성하고 그것을 쿠키에 담는다
쿠키에 담던 로컬스토리지에 담던 세션에 담던 각각의 장단점이 있지만 여기선 쿠키에 담기로 한다
먼저 token을 만들기 위한 JWT 패키지를 설치한다
npm i --save jsonwebtoken
그러고 User.js Model에 메소드를 추가하자
const jwt = require('jsonwebtoken');
userSchema.methods.genToken = function (cb) {
var user = this;
// JWT로 토큰 생성
var token = jwt.sign(user._id.toHexString(), 'secretToken');
user.token = token;
user.save(function (err, user) {
if (err) return cb(err);
cb(null, user);
});
};
secretToken 부분은 임의로 정하면되고, 헥스코드로 변형한 user의 id와 secretToken을 합하여 토큰을 만든다
생성된 토큰을 스키마의 user token 컬럼에 추가하고 user를 save하고 콜백으로 user를 반환한다
쿠키를 생성하거나 요청의 쿠키값을 추출하게 해주는 cookie-parser 패키지를 설치한다
npm i --save cookie-parser
const cookieParser = require('cookie-parser'); // cookie-parser 패키지
app.use(cookieParser()); // cookie-parser 사용
app.post('/api/users/login', (req, res) => {
// 클라가 요청한 이메일을 DB에서 검색
User.findOne({ email: req.body.email }, (err, user) => {
if (!user) {
return res.json({
loginSuccess: false,
message: '아이디가 일치하지 않습니다',
});
} else {
// 이메일이 DB에 있으면 비밀번호 대조
user.comparePassword(req.body.password, (err, isMatch) => {
if (!isMatch)
return res.json({
loginSuccess: false,
message: '비밀번호가 일치하지 않습니다',
});
// 비밀번호 맞으면 Token 생성
user.genToken((err, user) => {
if (err) return res.status(400).send(err);
// Token을 쿠키에 저장
res
.cookie('x_auth', user.token)
.status(200)
.json({ loginSuccess: true, userId: user._id });
});
});
}
});
});
비밀번호 대조에 성공하면 반환받은 user에서 토큰을 꺼내어 쿠키에 저장 후 성공 여부를 JSON으로 응답한다
로그인 성공