개발공부일지
NodeJS - Database - JWT 사용해서 LOGIN 구현하기 ② 본문
// src/index.js
router.get("/", (req, res) => {
// console.log(req.headers.cookie);
res.render("index.html", { user: req.user });
});
목차
1. 로그인 했을때 쿠키를 만들고 화면 다르게 보여주기
2. token 정보 증명하기
3. DB에 user_id 요청해서 로그인 구현 완성하기
1. 로그인 했을때 쿠키를 만들고 화면 다르게 보여주기
- user_id, user_pw를 쿠키안에 jwt토큰을 넣어주기
// src/user/user.servcie.js
const userRepository = require("./user.repository");
const JWT = require("../../lib/jwt");
const jwt = new JWT();
exports.postLogin = async (userid, userpw) => {
// return `login service`;
try {
const result = await userRepository.findOneByUserInfo(userid, userpw);
if (!result) return { isLogin: false, data: null };
const token = jwt.sign({ id: result.userid });
return { isLogin: true, data: token };
} catch (e) {
throw new Error("Service Error" + e.message);
}
};
npm install cookie-parser
// server.js
const cookieParser = require("cookie-parser");
app.use(cookieParser());
// src/user/user.controller.js
exports.postLogin = async (req, res, next) => {
try {
const { user_id, user_pw } = req.body;
const result = await userService.postLogin(user_id, user_pw);
// console.log(result);
if (!result.isLogin) return res.redirect("/");
res.cookie("token", result.data);
res.redirect("/");
} catch (err) {
next();
}
};
- cookie parser를 사용해서 req.cookies로 쿠키내용을 확인할수있다.
- res.cookie() 로 name, value, option을 적을수있다.
- 옵션으로 maxAge, domain, path를 적는다!
- domain에 localhost라고 적었다면, url에서도 localhost 로 들어가야한다.
<body>
<h2>HOME</h2>
{% if token %}
로그인 되었음!!!! <a href="/users/logout">로그아웃</a>
{% else %}
로그인하세요 <a href="/users/login">로그인 하기</a>
{% endif %}
</body>
// src/user/user.controller.js
exports.getLogout = (req, res) => {
res.setHeader("Set-Cookie", `token=; Max-Age=0; domain=127.0.0.1; path=/;`);
// res.clearCookie("token");
res.redirect("/");
};
- nunjucks 문법 사용해서 token여부를 확인하기
- 로그인이 되었다면 로그아웃을 보여주고
- 로그인을 하지 않았다면 로그인을 보여주기
- getLogout controller 만들어주기
- 유저가 로그아웃을 누른다면 쿠키도 사라지게하기
2. token 정보 증명하기
// src/auth/auth.middleware.js
const JWT = require("../../lib/jwt");
const jwt = new JWT();
exports.auth = async (req, res, next) => {
try {
const { token } = req.cookies;
const payload = jwt.verify(token, "guniee");
console.log("payload : ", payload);
// payload : { id: 'guniee' }
} catch (e) {
console.log(e.message);
}
next();
};
// server.js
const middleware = require("./src/auth/auth.middleware");
app.use(middleware.auth);
token : eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJpZCI6Imd1bmllZSJ9.ZmcGAX9HA4898EevoIEjww3HztCbKypfF-MIWdqHCDU
// lib/jwt.js
verify(token, salt) {
try {
const [header, payload, signature] = token.split(".");
const base64url = [header, payload].join(".");
const newSignature = this.createSignauture(base64url, salt);
if (signature !== newSignature) return null;
const result = this.decode(payload);
return result;
} catch (e) {}
}
- middleware를 사용해서 토큰이 존재하는지 찾기
- token이 있다면 유효성 검사하기
- jwt에서 검사하는 verify() 메서드를 만들어서 payload값을 가져오기
- payload에서 나온 user id 확인하기
3. DB에 user_id 요청해서 로그인 구현 완성하기
// src/user/user.repository.js
exports.findOne = async (field, value) => {
try {
const sql = `select * from Users where ${field}=?`;
const [[result]] = await pool.query(sql, [value]);
return result;
} catch (e) {
throw new Error("Repository Error" + e.message);
}
};
// src/user/user.service.js
exports.findOneByUserId = async (userid) => {
try {
const result = await userRepository.findOne("userid", userid);
return result;
} catch (e) {
throw new Error(e.message);
}
};
// src/auth/auth.middleware.js
exports.auth = async (req, res, next) => {
try {
const { token } = req.cookies;
if (!token) return next();
const payload = jwt.verify(token, "guniee");
console.log("payload : ", payload);
// payload : { id: 'guniee' }
const user = await userService.findOneByUserId(payload.id);
req.user = user;
console.log("user :", user);
// user : { userid: 'guniee', userpw: '1234' }
next();
} catch (e) {
next(e);
}
};
<body>
<h2>HOME</h2>
{% if user %} {{user.userid}} 님 환영합니다~!
<a href="/users/logout">로그아웃</a>
{% else %} 로그인하세요
<a href="/users/login">로그인 하기</a>
{% endif %}
</body>
- repository 에서 user_id 를 가져오기
- service 에서 Users 테이블 field에서 유저 정보를 찾기
- middleware에서 유저 아이디를 담아주기
- 유저가 로그인을 했다면 @@@님 환영한다고 "/" index에서 보여주기
- user : req.user 를 담아서 ( nunjucks 문법 수정하)
※ 예외처리!!!!!!!
※ 의존성 주입
※ 쿠키 만료시간
'NodeJS' 카테고리의 다른 글
NodeJS - Server 분리 (Front, Back), CORS Error (1) | 2023.10.19 |
---|---|
NodeJS - 의존성 주입(DI), 제어의 역전(IoC), Overring, overloading (0) | 2023.10.15 |
NodeJS - Database - JWT 사용해서 LOGIN 구현하기 ① (0) | 2023.09.22 |
NodeJS - Cookie, Set-Cookie, cookie-parser, 암호화 (0) | 2023.09.21 |
NodeJS - Database - connection pool 활용해서 게시판 만들기 (작업중) (0) | 2023.09.20 |