์ฌ์ฉ์ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ, ๊ทธ๋ฆฌ๊ณ JWT ๋ฐ๊ธ์ ์ฒ๋ฆฌํฉ๋๋ค.
โ
์๋์ฒ๋ผ server.js
๋ฅผ ๊ตฌ์ฑํด๋ณด์ธ์:
const express = require('express');
const cors = require('cors');
const todosRouter = require('./routes/todos');
const authRouter = require('./routes/auth');
const app = express();
const PORT = 3000;
app.use(cors());
app.use(express.json());
// โ
RESTful router ๋ฑ๋ก
app.use('/todos', todosRouter);
app.use('/auth', authRouter); // /auth/register, /auth/login
app.listen(PORT, () => {
console.log(`๐ ์๋ฒ ์คํ ์ค: http://localhost:${PORT}`);
});
โ
๊ทธ๋ฆฌ๊ณ routes/auth.js
๋ผ์ฐํฐ ํ์ผ์ ์์ฑํ์ธ์:
routes/auth.js
jwt ํ ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
npm i jsonwebtoken
โ
routes/auth.js
const express = require('express');
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
const router = express.Router();
const USERS_FILE = path.join(__dirname, '../data/users.json');
const SECRET = 'my-vue-jwt-secret'; // JWT ์๋ช
์ฉ ๋น๋ฐ ํค
// ์ ์ ๋ชฉ๋ก ๋ถ๋ฌ์ค๊ธฐ
function getUsers() {
if (!fs.existsSync(USERS_FILE)) return [];
const data = fs.readFileSync(USERS_FILE, 'utf-8');
return JSON.parse(data);
}
// ๐ ํ์๊ฐ์
router.post('/register', (req, res) => {
const { username, password } = req.body;
const users = getUsers();
const exists = users.find(u => u.username === username);
if (exists) {
return res.status(400).json({ message: '์ด๋ฏธ ์กด์ฌํ๋ ์์ด๋์
๋๋ค.' });
}
users.push({ username, password });
fs.writeFileSync(USERS_FILE, JSON.stringify(users, null, 2));
res.status(201).json({ message: 'ํ์๊ฐ์
์๋ฃ' });
});
// ๐ ๋ก๊ทธ์ธ + JWT ๋ฐ๊ธ
router.post('/login', (req, res) => {
const { username, password } = req.body;
const users = getUsers();
const found = users.find(u => u.username === username && u.password === password);
if (!found) {
return res.status(401).json({ message: '์์ด๋ ๋๋ ๋น๋ฐ๋ฒํธ๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค.' });
}
const token = jwt.sign({ username }, SECRET, { expiresIn: '1h' });
res.json({ token, username });
});
module.exports = router;
โ ๊ฐ์ด ์ค๋นํด์ผ ํ ํ์ผ
data/users.json
(์ด๊ธฐ์๋ ๋น ๋ฐฐ์ด):
[]
Postman์ผ๋ก ์ปค์คํ ๋ก๊ทธ์ธ API ํ ์คํธํ๊ธฐ
์ด๋ฒ ๊ฐ์ข์์๋ Postman์ ํ์ฉํด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ API๋ฅผ ์ง์ ํธ์ถํ๊ณ , JWT๊ฐ ๋ฐ๊ธ๋๋ ๊ณผ์ ์ ํ์ธํด๋ด ๋๋ค.
๐ง 1๋จ๊ณ: Postman ์ค์น ๋ฐ ์คํ
Postman ๊ณต์ ์ฌ์ดํธ:
์ค์น ํ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ธํฐํ์ด์ค๊ฐ ๋น๋๋ค.
๐งช 2๋จ๊ณ: ํ์๊ฐ์ API ํ ์คํธ
โค ์ ์์ฒญ ์์ฑ
- Method:
POST
- URL:
http://localhost:3000/auth/register
โค Body ์ค์
- ์๋จ ํญ์์
Body
โraw
์ ํ - ์ฐ์ธก ๋๋กญ๋ค์ด์์
JSON
์ ํ - ์๋ ๋ด์ฉ์ ์ ๋ ฅ:
{
"username": "testuser",
"password": "1234"
}
โค ์ ์ก (Send ๋ฒํผ ํด๋ฆญ)
- ์๋ต ์์:
{
"message": "ํ์๊ฐ์
์๋ฃ"
}
๐งช 3๋จ๊ณ: ๋ก๊ทธ์ธ API ํ ์คํธ
โค ์ ์์ฒญ ์์ฑ
- Method:
POST
- URL:
http://localhost:3000/auth/login
โค Body ์ค์
{
"username": "testuser",
"password": "1234"
}
โค ์ ์ก ๊ฒฐ๊ณผ
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6...",
"username": "testuser"
}
์ด token
์ ์ดํ ์์ฒญ ์ ์ธ์ฆ์ ์ฌ์ฉ๋ฉ๋๋ค.
๐งฉ 4๋จ๊ณ: JWT ํ์ธ ๋ฐ ์ ์ฅ ํ ์คํธ
- ๋ฐ์
token
์ ๋ก์ปฌ ์ ์ฅ์(localStorage) ๋๋ ์ฟ ํค์ ์ ์ฅํด ์ฌ์ฉ์ ์ธ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ์ดํ ์์ฒญ ์, ์๋์ฒ๋ผ
Authorization
ํค๋์ ํฌํจํฉ๋๋ค:
Authorization: Bearer <JWT ํ ํฐ>
โ Tip: Postman Authorization ํญ ํ์ฉ
Headers
์๋ ์ ๋ ฅ ์์ด๋,Authorization
ํญ ์ ํ โBearer Token
์ต์ ์ ํ- ๋ณต์ฌํ JWT ํ ํฐ์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ํค๋ ์๋ ๊ตฌ์ฑ๋จ
BE ์ ์ฅ์
๐ฌ ๋๊ธ
โป ๋ก๊ทธ์ธ ํ ๋๊ธ์ ์์ฑํ ์ ์์ต๋๋ค.