๋ก๊ทธ์ธ API๊ตฌํ
<aside> ๐ก ๋ก๊ทธ์ธ์ ๋น์ฆ๋์ค ๋ก์ง ์ ๋ฆฌํ๊ธฐ!
- email, password๋ฅผ ์ ๋ฌ ๋ฐ์
- email์ ํด๋นํ๋ ์ฌ์ฉ์๊ฐ DB์ ์กด์ฌํ๋์ง ๊ฒ์ฆ
- ์ฌ์ฉ์๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋ ์ฌ์ฉ์์ ์ ๋ ฅ๋ฐ์ password๊ฐ ์ผ์นํ๋์ง ๊ฒ์ฆ
- JWT ์์ฑ ํ Cookie ๋ฐ Body๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ
- ๋ก๊ทธ์ธ ์ฑ๊ณต! </aside>
๋ก๊ทธ์ธ์ ์ฌ์ฉํ๋ JWTํ ํฐ์ ์์
const token = jwt.sign({ userId: user.userId }, "customized-secret-key");
๋ก๊ทธ์ธ ๊ตฌํ ํ๋ ๋ก์ง EX)
// routes/auth.js
const jwt = require("jsonwebtoken");
const express = require("express");
const router = express.Router();
const User = require("../schemas/user");
// ๋ก๊ทธ์ธ API
router.post("/auth", async (req, res) => {
const { email, password } = req.body;
const user = await User.findOne({ email });
// NOTE: ์ธ์ฆ ๋ฉ์ธ์ง๋ ์์ธํ ์ค๋ช
ํ์ง ์๋๊ฒ์ ์์น์ผ๋ก ํ๋ค.
if (!user || password !== user.password) {
res.status(400).json({
errorMessage: "์ด๋ฉ์ผ ๋๋ ํจ์ค์๋๊ฐ ํ๋ ธ์ต๋๋ค.",
});
return;
}
const token = jwt.sign(
{ userId: user.userId },
"customized-secret-key",
);
res.cookie("Authorization", `Bearer ${token}`); // JWT๋ฅผ Cookie๋ก ํ ๋นํฉ๋๋ค!
res.status(200).json({ token }); // JWT๋ฅผ Body๋ก ํ ๋นํฉ๋๋ค!
});
module.exports = router;
-
- โ ์ ๊ฒฝ๋ก๊ฐ /auth ์ธ๊ฐ์?
๋ด ์ ๋ณด๋ฅผ ์กฐํํ๋ API
// routes/users.js
const authMiddleware = require("./middlewares/auth-middleware");
...
// ๋ด ์ ๋ณด ์กฐํ API
router.get("/users/me", authMiddleware, async (req, res) => {
const { email, nickname } = res.locals.user;
res.status(200).json({
user: { email, nickname }
});
});
์ํ ๋ชฉ๋ก ์กฐํ API ์์ ์ฝ๋ ์์)
// routes/goods.js
// ์ํ ๋ชฉ๋ก ์กฐํ API
router.get("/goods", async (req, res) => {
const { category } = req.query;
const goods = await Goods.find(category ? { category } : {})
.sort("-date")
.exec();
const results = goods.map((item) => {
return {
goodsId: item.goodsId,
name: item.name,
price: item.price,
thumbnailUrl: item.thumbnailUrl,
category: item.category,
};
});
res.json({ goods: results });
});
์ํ ์์ธ ์กฐํ API ์์ ์ฝ๋ ์์
// routes/goods.js
// ์ํ ๋ชฉ๋ก ์กฐํ API
router.get("/goods", async (req, res) => {
const { category } = req.query;
const goods = await Goods.find(category ? { category } : {})
.sort("-date")
.exec();
const results = goods.map((item) => {
return {
goodsId: item.goodsId,
name: item.name,
price: item.price,
thumbnailUrl: item.thumbnailUrl,
category: item.category,
};
});
res.json({ goods: results });
});
์ฝ๋ ์ค๋ํซ ์์๋ฅผ ์ฌ๋ฆฐ์ด์ ๋ ๋ด๊ฐ ์ข ๋ ์ด ๋ก์ง์ ๋ฐ๋ณตํด์ ๋ณด๋ฉด์ ๋์ ์ต์ํด์ง๊ณ ์์ ์ต์ํด ์ก์ผ๋ฉด ํ๋ ๋ง์์ ์ ์ด ์ฌ๋ ธ๋ค.