์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ์ฝ๋ฉ์ ํ
- ๊ฐ๋ฐ
- ์ฝ๋ฉํ ์คํธ
- ๋ฐฑ์ค
- Python
- ๋ ธ๋ง๋์ฝ๋
- ๋ชจ๊ฐ์ฝ
- fe
- ๊ทธ๋ฆฌ๋
- ์ฝ๋ฉ
- ์๊ณ ๋ฆฌ์ฆ
- ํ์ด์ฌ
- error
- ๋๋ฆผ์ฝ๋ฉ
- HTML
- CSS
- JS
- react
- ํ๋ก์ ํธ
- heapq
- node.js
- Til
- ํ๋ก๊ทธ๋๋จธ์ค
- mongodb
- ํ๋ก ํธ์๋
- ํฌ๋กค๋ง
- ํ ์ดํ๋ก์ ํธ
- KDT
- ๊ตญ๋น์ง์
- javascript
- Today
- Total
๐ฑ → ๐ณ
[node.js] Session์ผ๋ก ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ ๋ณธ๋ฌธ
๐ session
: ์๋ฒ์ ์ฟ ํค
๐ HTTP Session ์ด๋?
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์๋ฒ์ ์ ์ฅ๋๋ ์ฟ ํค
- ์ฌ์ฉ์๊ฐ ์๋ฒ์ ์ ์ํ ์์ ๋ถํฐ ์ฐ๊ฒฐ์ ๋๋ด๋ ์์ ์ ํ๋์ ์ํ๋ก ๋ณด๊ณ ์ ์งํ๋ ๊ธฐ๋ฅ์ ํจ -> ๋ก๊ทธ์ธ ์ ์ง
- ์๋ฒ๋ ๊ฐ ์ฌ์ฉ์์ ๋ํ ์ธ์ ์ ๋ฐํํ๊ณ ์๋ฒ๋ก ์ ๊ทผ(request)ํ ์ฌ์ฉ์๋ฅผ ์๋ณํ๋ ๋๊ตฌ๋ก ์ฌ์ฉ
- ์ฟ ํค์ ๋ฌ๋ฆฌ ์ ์ฅ ๋ฐ์ดํฐ์ ์ ํ ์์
- ๋ง๋ฃ ๊ธฐ๊ฐ ์ค์ ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋๋ฉด ๋ฐ๋ก ์ญ์
๐HTTP Session์ ๋์ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ์ต์ด๋ก ์๋ฒ ์ฐ๊ฒฐ์ ํ๋ฉด ํ๋์ session-id(์์์ ๊ธด ๋ฌธ์์ด)๊ฐ ๋ฐํ
- ๋ฐํ ๋ session-id๋ ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฟ ํค ํํ๋ก ์ ์ฅ๋จ
- ์๋ฒ๋ ์ฌ์ฉ์๊ฐ ์๋ฒ์ ์ ๊ทผ ์, ์ฟ ํค์ ์ ์ฅ๋ session-id๋ฅผ ํตํด ์ฌ์ฉ์๋ฅผ ๊ตฌ๋ถํ๊ณ ์์ฒญ์ ๋ํ ์๋ต์ ํจ
โ๏ธ Cookie vs Session
- ํ๋ ์ญํ ์ ๋น์ท
- ์ฟ ํค : ๋ก์ปฌ์ ์ ์ฅ๋๋ฏ๋ก ๋ณด์ ์ด์ ๋ฐ์ ๊ฐ๋ฅ
- ์ธ์ : ๋ก์ปฌ์ session-id๋ง ์ ์ฅํ๊ณ , ๋ฐ์ดํฐ๋ ์๋ฒ์์ ์ฒ๋ฆฌํ๋ฏ๋ก ๋ณด์์ด ๋ ์ข์
- ๋จ, ์ฟ ํค๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ์์ผ๋ฏ๋ก ์๋๊ฐ ๋น ๋ฆ
- ์ธ์ ์ ์ฟ ํค์์ session-id๋ฅผ ์ฝ์ด์ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํ๋ฏ๋ก ์๋๋ ๋ ๋๋ฆผ
๐ Session์ผ๋ก ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ
๐session ๋ชจ๋ ์ค์น
npm i express-session -s
๐session ๋ชจ๋ ์ถ๊ฐ ๋ฐ ๋ฏธ๋ค์จ์ด ์ฐ๊ฒฐ
const session = require('express-session')
const app = express();
app.use(
session({
secret: 'bay',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000 * 60 * 60,
},
})
);
๐ session ๋ชจ๋ ์ต์ ์ค๋ช
- secret: ์ธ์ ์ ๋ฐ๊ธํ ๋ ์ฌ์ฉ๋๋ ํค ๊ฐ(์๋ฌด๊ฑฐ๋ ์ ๋ ฅ ๊ฐ๋ฅ)
- resave: ๋ชจ๋ request๋ง๋ค ๊ธฐ์กด์ ์๋ session์ ์๋ฌด๋ฐ ๋ณ๊ฒฝ์ฌํญ์ด ์์ด๋ session์ ๋ค์ ์ ์ฅํ๋ ์ต์
- saveUninitialized: ์ธ์ ์ ์ ์ฅํ ๋ด์ญ์ด ์๋๋ผ๋ ์ฒ์๋ถํฐ ์ธ์ ์ ์์ฑํ ์ง ์ค์
- secure: https ์์๋ง ์ธ์ ์ ์ฃผ๊ณ ๋ฐ์ ์ ์์(http์์๋ ์ธ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ ๋ถ๊ฐ๋ฅ)
- cookie: ์ธ์
์ฟ ํค ์ค์ (์ธ์
๊ด๋ฆฌ์ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด๋ ์ฟ ํค)
- maxAge: ์ฟ ํค์ ์๋ช ๊ธฐ๊ฐ, ๋จ์๋ ms
- httpOnly: ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ธ์ ์ ์ฌ์ฉํ ์ ์๋๋ก ๊ฐ์
โ ํ์ ๊ฐ์ ํ์ด์ง
register.ejs/ register.js ์์ฑ
// register.js
// ํ์๊ฐ์
๊ธฐ๋ฅ ๋ชจ๋ํ
const express = require('express');
const mongoClient = require('./mongo');
const router = express.Router();
router.get('/', (req, res) => {
res.render('register');
});
module.exports = router;
๐ ์๋ฒ์ ๋ผ์ฐํฐ ๋ฑ๋ก
const registerRouter = require('./routes/register');
app.use('/register', registerRouter);
๐ register.ejs์์ ๋ฐ์ดํฐ ๋ฐ๊ธฐ
- post ๋ฐฉ์/ register ์ฃผ์๋ก ํ์ ๊ฐ์ ์์ฒญํ๋ฏ๋ก
- 'users'๋ผ๋ collection ๋ง๋ค์ด์ ํ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ
- req.body์ ๋ด๊ฒจ์๋ id๊ฐ db์ ์กด์ฌํ๋์ง ํ์ธ ํ ์กด์ฌํ ๊ฒฝ์ฐ id ์ค๋ณต ์๋ด
- ํ์ ๊ฐ์ ํ์ด์ง๋ก ์ด๋ ์๋ด
- id๊ฐ ์ค๋ณต๋์ง ์์ ๊ฒฝ์ฐ, db์ ์๋ก์ด ํ์์ ๋ฑ๋กํ๊ณ ํ์ ๊ฐ์
์ฑ๊ณต ๋ฉ์์ง ์ถ๋ ฅ
- ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ ์๋ด
router.post('/', async (req, res) => {
const client = await mongoClient.connect();
const userCursor = client.db('db๋ช
').collection('users');
const duplicated = await userCursor.findOne({
id: req.body.id,
});
if (duplicated === null) {
const result = await userCursor.insertOne({
id: req.body.id,
password: req.body.password,
});
if (result.acknowledged) {
res.send('ํ์ ๊ฐ์
์ฑ๊ณต!<br><a href="/login">๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋</a>');
} else {
res.status(404);
res.send(
'ํ์ ๊ฐ์
๋ฌธ์ ๋ฐ์.<br><a href="/register">ํ์๊ฐ์
ํ์ด์ง๋ก ์ด๋</a>'
);
}
} else {
res.status(404);
res.send(
'์ค๋ณต๋ id ๊ฐ ์กด์ฌํฉ๋๋ค.<br><a href="/register">ํ์๊ฐ์
ํ์ด์ง๋ก ์ด๋</a>'
);
}
});
โ ๋ก๊ทธ์ธ ํ์ด์ง
login.ejs/ login.js ์์ฑ
// login.js
// ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๋ชจ๋ํ
const express = require('express');
const mongoClient = require('./mongo');
const router = express.Router();
router.get('/', async (req, res) => {
res.render('login');
});
module.exports = router;
์๋ฒ์ ๋ผ์ฐํฐ ๋ฑ๋ก
const loginRouter = require('./routes/login');
app.use('/login', loginRouter);
โ๏ธ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
- post ๋ฐฉ์/ login ์ฃผ์๋ก ๋ก๊ทธ์ธ ์์ฒญํ๋ฏ๋ก
- req.body์ ๋ด๊ฒจ์๋ id๊ฐ db์ ์กด์ฌํ๋์ง ํ์ธ ํ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ํด๋น id๊ฐ ์๋ค๊ณ ์๋ด
- ๋ก๊ทธ์ธ ํ์ด์ง, ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ ์๋ด
- id๊ฐ ์์ ๊ฒฝ์ฐ, id์ ๋น๋ฐ๋ฒํธ๊น์ง ์ผ์นํ๋์ง ํ์ธํ๊ณ ๋ ๋ค ์ผ์นํ๋ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ์ฑ๊ณต
- req.session์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ ์ฌ๋ถ/ ๋ก๊ทธ์ธ ๋ id๋ฅผ session์ ์ ์ฅ
- ๊ฒ์ํ ์๋น์ค๋ก ์ด๋
- ๋น๋ฐ๋ฒํธ๊ฐ ํ๋ฆฌ๋ฉด ๋น๋ฐ ๋ฒํธ ๋ถ์ผ์น ์๋ด
- ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ ์๋ด
router.post('/', async (req, res) => {
const client = await mongoClient.connect();
const userCursor = client.db('db๋ช
').collection('users');
const idResult = await userCursor.findOne({
id: req.body.id,
});
if (idResult !== null) {
const result = await userCursor.findOne({
id: req.body.id,
password: req.body.password,
});
if (result !== null) {
req.session.login = true;
req.session.userId = req.body.id;
res.redirect('/board');
} else {
res.status(404);
res.send(
'๋น๋ฐ๋ฒํธ๊ฐ ํ๋ ธ์ต๋๋ค.<br><a href="/login">๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋</a>'
);
}
} else {
res.status(404);
res.send(
'ํด๋น id ๊ฐ ์์ต๋๋ค.<br><a href="/login">๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋</a>'
);
}
});
โ๏ธ ๋ก๊ทธ์์ ์ฒ๋ฆฌ
- ๋ก๊ทธ ์์ ๋ฒํผ ๋ง๋ค๊ธฐ
- board.ejs ํ์ผ์ ๋ก๊ทธ์์ ๋ฒํผ ์ถ๊ฐ
- get๋ฐฉ์ /login/logout ์ฃผ์๋ก ๋ก๊ทธ์์ ์์ฒญ
<div class="board_write">
<span>ํ์ฌ ๋ฑ๋ก ๊ธ : <%= articleCounts %></span>
<a class="btn red" href="/board/write">๊ธ์ฐ๊ธฐ</a>
<a class="btn orange" href="/login/logout">๋ก๊ทธ์์</a>
</div>
๋ก๊ทธ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์์ฑ๋ req.session์ ์ญ์ ์ฒ๋ฆฌ -> ์ต์ด ํ๋ฉด์ผ๋ก ์ด๋
router.get('/logout', async (req, res) => {
req.session.destroy((err) => {
res.redirect('/');
});
});
โ๏ธ ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ฅธ ๊ฒ์ํ ์๋น์ค ๋ณ๊ฒฝ
- ๋ก๊ทธ์ธ์ด ์๋์ด ์์ผ๋ฉด ๊ฒ์ํ์ ์ ์์ด ๋ถ๊ฐ๋ฅ ํ๋๋ก ์์
- req.session์ ์ด๋ ๋ผ์ฐํฐ์์๋ ๋ถ๋ฌ์ ์ธ ์ ์์
- req.session.login์ ๊ฐ์ ํ์ธํด์ ๊ฒ์ํ ์๋น์ค๋ก ์ด๋ ํ ์ง, ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ ์๋ดํ ์ง ๊ฒฐ์
- board.ejs ํ์ผ์ req.session.id์ ์ ์ฅ๋ ํ์ id ์ ๋ณด๋ ๊ฐ์ด ์ ๋ฌ
router.get('/', async (req, res) => {
if (req.session.login) {
const client = await mongoClient.connect();
const cursor = client.db('db๋ช
').collection('board');
const ARTICLE = await cursor.find({}).toArray();
const articleLen = ARTICLE.length;
res.render('board', {
ARTICLE,
articleCounts: articleLen,
userId: req.session.userId,
});
} else {
res.status(404);
res.send('๋ก๊ทธ์ธ ํด์ฃผ์ธ์.<br><a href="/login">๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋</a>');
}
});
๐ ๋ก๊ทธ์ธ ํ์ธ์ฉ ํจ์ ์ด์ฉ
- ๋ฏธ๋ค์จ์ด์ 2๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก ๋ก๊ทธ์ธ ํ์ธ์ฉ ํจ์๋ฅผ ๋ฃ์ด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ req.session ๊ฐ์ ํตํด ํ๋ณํ๊ณ , ๋ก๊ทธ์ธ์ด ๋์ด ์์ผ๋ฉด next()๋ฅผ ์ด์ฉํด ๋ค์ ์ต๋ช ํจ์๋ฅผ ์ํํ๋ ๊ตฌ์กฐ
- if๋ฌธ์ ์ ๊ฒ ์ฌ์ฉํ๊ณ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
function isLogin(req, res, next) {
if (req.session.login) {
next();
} else {
res.send('๋ก๊ทธ์ธ ํด์ฃผ์ธ์.<br><a href="/login">๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋</a>');
}
}
router.get('/', isLogin, async (req, res) => {
const client = await mongoClient.connect();
const cursor = client.db('kdt1').collection('board');
const ARTICLE = await cursor.find({}).toArray();
const articleLen = ARTICLE.length;
res.render('board', {
ARTICLE,
articleCounts: articleLen,
userId: req.session.userId,
});
});
โ๏ธ ๊ฒ์๊ธ์ ์์ฑ์ id ์ ๋ณด ์ถ๊ฐ
- ๊ฐ๊ฐ์ ๊ฒ์๊ธ์ ์์ฑ์๊ฐ ๋๊ตฌ์ธ์ง ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ ์ถ๊ฐ
- ์์ ์ด ์์ฑํ ๊ธ์ ์์ ๋ฐ ์ญ์ ๋ฒํผ์ด ๋ณด์ด๋๋ก ๊ธฐ๋ฅ ์ถ๊ฐ
- ์์ ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ์ํด์๋ ๊ฒ์๊ธ db์ ์์ฑ์์ id ์ ๋ณด ์์ด์ผํจ
๐board.ejs ํ์ผ ์์
์ ๋ชฉ ์์ ์์ฑ์์ id๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ ์ถ๊ฐ
<li>
<div class="author">
์์ฑ์ : <%= ARTICLE[i].id %>
</div>
<div class="title">
<%= ARTICLE[i].title %>
</div>
๐์์ ์ด ์์ฑํ ๊ธ์๋ง ์์ ์ญ์ ๋ฒํผ ํ์
๊ฒ์๊ธ์ ์์ฑ์ id์ ๋ก๊ทธ์ธํ ์ ์ ์ id๋ฅผ ๋น๊ตํด์ ์์ ๋ฐ ์ญ์ ๋ฒํผ ํ์
<div class="foot">
<% if (ARTICLE[i].id === userId) { %>
<a class="btn orange" href="board/modify/<%= ARTICLE[i].title %>">์์ </a>
<a class="btn blue" href="#" onclick="deleteArticle('<%= ARTICLE[i].title %>')">์ญ์ </a>
<% } %>
</div>
โ๏ธ ๊ฒ์๊ธ ์ถ๊ฐ(์์ , ์ญ์ ) ๊ธฐ๋ฅ ์์
๋ก๊ทธ์ธ ์ํ๊ฐ ์๋๋ฉด ํด๋น ํ์ด์ง๋ก ์ด๋์ด ์๋๋๋ก ์ค์
router.get('/write', isLogin, (req, res) => {
res.render('board_write');
});
๊ธ์ ์ถ๊ฐ ํ ๋๋ ๋ก๊ทธ์ธ ์ฌ๋ถ ํ๋ณ
์๋ก์ด ๊ฒ์๊ธ์ ์ถ๊ฐํ ๋, title, content ์ด์ธ์ id ๊ฐ์ผ๋ก ๋ก๊ทธ์ธํ ์ ์ ์ id๊ฐ์ ๋ฐ์์ ๊ธ์ ์ถ๊ฐ
router.post('/', isLogin, async (req, res) => {
if (req.body) {
if (req.body.title && req.body.content) {
const newArticle = {
id: req.session.userId,
title: req.body.title,
content: req.body.content,
};
'Server > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[node.js] passport(local ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ตฌํ) (0) | 2022.09.24 |
---|---|
[node.js] Cookie - ํ์ ์ฐฝ ํ๋ฃจ๋์ ๋ณด์ง ์๊ธฐ (0) | 2022.09.24 |
[node.js] Front์์ Back์ผ๋ก ๋ฐ์ดํฐ ์ ์ก (0) | 2022.09.24 |
[node.js] Error Handling (1) | 2022.09.24 |
[node.js] View Engine(ejs, pug, nunjucks) (0) | 2022.09.24 |