0. ๋ค์ด๊ฐ๊ธฐ ์์!
- Auth ๊ธฐ๋ฅ
- ํ์ด์ง ์ด๋ ๋๋ง๋ค ๋ก๊ทธ์ธ ๋์๋์ง ์๋์ด ์๋์ง, ๊ด๋ฆฌ์ ์ ์ ์ธ์ง, ๊ธ์ ์ฐ๊ฑฐ๋ ์ง์ธ ๊ถํ์ด ์๋ ์ง, ๊ทธ๋ฐ ๊ฒ๋ค์ ํ๋ํ๋ ๋ค ์ฒดํฌํ๊ธฐ ์ํด Auth ๊ธฐ๋ฅ์ ๋ง๋๋ ๊ฑฐ์.
- ํ์ด์ง ์ด๋ ๋๋ง๋ค ๋ก๊ทธ์ธ ๋์๋์ง ์๋์ด ์๋์ง, ๊ด๋ฆฌ์ ์ ์ ์ธ์ง, ๊ธ์ ์ฐ๊ฑฐ๋ ์ง์ธ ๊ถํ์ด ์๋ ์ง, ๊ทธ๋ฐ ๊ฒ๋ค์ ํ๋ํ๋ ๋ค ์ฒดํฌํ๊ธฐ ์ํด Auth ๊ธฐ๋ฅ์ ๋ง๋๋ ๊ฑฐ์.
- Auth ๊ธฐ๋ฅ ๋ง๋๋ ๋ฒ
- ์ฌ์ ์ ์๋ฒ์๋ DB์ ํด๋ผ์ด์ธํธ์๋ Cookie์ Token์ ์ ์ฅํด๋๋๋ฐ, ์ด ๋ Token์ด ์ผ์นํ๋ ์ง ๊ณ์ ํ์ธํ๋ฉด ๋จ
- ํด๋ผ์ด์ธํธ Cookie์์ Incode ๋ Token์ ์๋ฒ๋ก ๋ณด๋ด Decode ์ํค๋ฉด ์ ์ ์ ์์ด๋๊ฐ ๋์ค๋๋ฐ,
- DB์์ ํด๋น ์ ์ ์์ด๋๋ฅผ ๊ฐ์ง token์ด ์กด์ฌํ๋ฉด ๋ Token์ด ์ผ์นํ๋ค๊ณ ๊ฐ์ฃผ(๊ถํ์ด ์๋ค๋ ๊ฒ)
- ๋ก๊ทธ์์ ๊ธฐ๋ฅ ๋ง๋๋ ๋ฒ
- ๋ก๊ทธ์์ ํ๋ ค๋ ์ ์ ๋ฅผ DB์์ ์ฐพ์์ ๊ทธ ์ ์ ์ ํ ํฐ ์ง์์ฃผ๊ธฐ
- Cookie Token ๊ณผ DB Token์ ์๋ก ๋น๊ตํด ์ธ์ฆํ๋๊ฑด๋ฐ, Token์ ์ง์๋ฒ๋ฆฌ๋ฉด ๋น๊ตํ ์ ์์ด์ ์ธ์ฆ์ด ์๋์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด ํ๋ฆฌ๋ ๊ฑฐ์
1. Auth ๊ธฐ๋ฅ
1) Cookie Token ๋ณตํธํ(Decode)
// User.js
// JWT ํ ํฐ ๊ฒ์ฆ ๋ฐ ์ฌ์ฉ์ ์ฐพ๊ธฐ ๋ฉ์๋
userSchema.statics.findByToken = function (token) {
const user = this;
return new Promise((resolve, reject) => {
jwt.verify(token, "secretToken", (err, decoded) => {
if (err) {
reject(err);
}
// user id๋ฅผ ์ด์ฉํด User๋ฅผ ์ฐพ๊ณ
// ํด๋ผ์ด์ธํธ์์ ๊ฐ์ ธ์จ Token๊ณผ DB์ ์๋ Token์ด ์๋ก ์ผ์นํ๋์ง ํ์ธ
User.findOne({ _id: decoded.userId, token: token })
.then((user) => {
resolve(user);
})
.catch((err) => {
reject(err);
});
});
});
};
2) Cookie Token ๊ณผ DB Token ๋น๊ต
- Auth Route ๋ง๋ค๊ธฐ
// auth.js
const { User } = require("../models/User");
const auth = async (req, res, next) => {
// ์ธ์ฆ ์ฒ๋ฆฌ ํ๋ ๊ณณ
// ํด๋ผ์ด์ธํธ cookie์์ Token์ ๊ฐ์ ธ์ด -> cookie-parser ์ด์ฉ
try {
const token = req.cookies.user_auth;
if (!token) {
return res.json({ isAuth: false, error: true });
}
// ๊ฐ์ ธ์จ Token Decode ํ ํ User ์ฐพ๊ธฐ
const user = await User.findByToken(token);
if (!user) {
return res.json({ isAuth: false, error: true });
}
// index.js์์ req๋ฅผ ์ ์ธํ์ ๋ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ ์ํด req์ token๊ณผ user๋ฅผ ๋ฃ๊ธฐ
req.token = token;
req.user = user;
next(); // middleware์์ ๋ค๋ฅธ ๊ฒ๋ ํ ์ ์๊ฒ next() ์ฌ์ฉ
} catch (err) {
throw err;
}
};
module.exports = { auth };
3) Token ์ผ์นํ๋ฉด ์ ๋ณด ๋๊ฒจ ์ฃผ๊ธฐ
// index.js
app.get("/api/users/auth", auth, (req, res) => {
//์ฌ๊ธฐ๊น์ง middleware๋ฅผ ํต๊ณผํด ์๋ค๋ ์๊ธฐ๋ Authentication์ด True๋ผ๋ ๋ง
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role === 0 ? true : false,
isAuth: true,
email: req.user.email,
name: req.user.name,
role: req.user.role,
image: req.user.image
})
});
2. ๋ก๊ทธ์์ ๊ธฐ๋ฅ
- Logout Route ๋ง๋ค๊ธฐ
// index.js
app.get("/api/users/logout", auth, async (req, res) => {
try {
await User.findOneAndUpdate({ id: req.user._id }, { token: "" });
return res.status(200).send({
success: true,
});
} catch (err) {
return res.json({ success: false, err });
}
});
3. ๊ฒฐ๊ณผ ๐
โ ๋ฐ๋ผํ๋ฉฐ ๋ฐฐ์ฐ๋ ๋ ธ๋, ๋ฆฌ์กํธ ์๋ฆฌ์ฆ - ๊ธฐ๋ณธ๊ฐ์ ํด๋ก ์ฝ๋ฉ ์ ๋๋ค.
'Backend ๐ > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node] Dialogflow API๋ฅผ ํ์ฉํ ์ฑ๋ด ์ฌ์ดํธ - 1. Dialogflow API (0) | 2024.08.12 |
---|---|
[Node] Client์ฉ React App (0) | 2024.08.11 |
[Node] ๋ก๊ทธ์ธ ๊ธฐ๋ฅ, ํ ํฐ ์์ฑ - Bcrypt, Jsonwebtoken (0) | 2024.08.01 |
[Node] ๋น๋ฐ๋ฒํธ ์ํธํ - Bcrypt (0) | 2024.08.01 |
[Node] ๋น๋ฐ ์ค์ ์ ๋ณด ๊ด๋ฆฌ (0) | 2024.08.01 |