2023. 9. 5. 01:48ใ3. Node.js
์ฟ ํค(Cookie)
๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ ์๋ต์ผ๋ก Set-Cookie ํค๋๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ค ๋ชจ๋ ์์ฒญ์ ํฌํจํ์ฌ ๋ณด๋ ๋๋ค.
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ(Request)์ ์์ ํ ๋, ์๋ฒ๋ ์๋ต(Response)๊ณผ ํจ๊ป Set-Cookie ๋ผ๋ ํค๋๋ฅผ ํจ๊ป ์ ์กํ ์ ์์ต๋๋ค. ๊ทธ ํ ์ฟ ํค๋ ํด๋น ์๋ฒ์ ์ํด ๋ง๋ค์ด์ง ์๋ต(Response)๊ณผ ํจ๊ป Cookie HTTP ํค๋์์ ํฌํจ๋์ด ์ ๋ฌ๋ฐ์ต๋๋ค.
์ฌ์ฉ์๊ฐ naver.com๊ณผ ๊ฐ์ ์น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๋ ๋ฐ์ดํฐ ํ์ผ.
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ฌ์ดํธ์ ๊ณต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ทจ์ฝํ ์ ์๋ค.
์ฟ ํค๋ userId=user-1321;userName=sparta ์ ๊ฐ์ด ๋ฌธ์์ด ํ์์ผ๋ก ์กด์ฌํ๋ฉฐ ์ฟ ํค ๊ฐ์๋ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๊ตฌ๋ถ๋๋ค.
์ฟ ํค ํ ํ๋ฆฟ
// app.js
import express from 'express';
const app = express();
const PORT = 5001;
app.use(express.json());
app.listen(PORT, () => {
console.log(PORT, 'ํฌํธ๋ก ์๋ฒ๊ฐ ์ด๋ ธ์ด์!');
});
res.cookie()๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค ํ ๋นํ๊ธฐ
// 'res.cookie()'๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค๋ฅผ ํ ๋นํ๋ API
app.get("/set-cookie", (req, res) => {
let expires = new Date();
expires.setMinutes(expires.getMinutes() + 60); // ๋ง๋ฃ ์๊ฐ์ 60๋ถ์ผ๋ก ์ค์ ํฉ๋๋ค.
res.cookie('name', 'sparta', {
expires: expires
});
return res.end();
});
[ req๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค ์ ๊ทผํ๊ธฐ ]
ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ฒญ(Request)์ ๋ณด๋ผ ๋ ์์ ์ด ๋ณด์ ํ๊ณ ์๋ ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์๋ฒ์ ์ ๋ฌํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌํ๋ ์ฟ ํค ์ ๋ณด๋ Request header์ ํฌํจ๋์ด ์๋ฒ์ ์ ๋ฌ๋๊ฒ ๋๋ค.
req.headers.cookie๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค ์กฐํํ๊ธฐ
// 'req.headers.cookie'๋ฅผ ์ด์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์ฟ ํค๋ฅผ ์กฐํํ๋ API
app.get('/get-cookie', (req, res) => {
const cookie = req.headers.cookie;
console.log(cookie); // name=sparta
return res.status(200).json({ cookie });
});
[ cookie-parser ๋ฏธ๋ค์จ์ด ์ ์ฉํ๊ธฐ ]
cookie-parser ๋ฏธ๋ค์จ์ด๋ ์์ฒญ์ ์ถ๊ฐ๋ ์ฟ ํค๋ฅผ req.cookies ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ค๋ค. ๋์ด์ req.headers.cookie์ ๊ฐ์ด ๋ฒ๊ฑฐ๋กญ๊ฒ ์ฌ์ฉํ์ง ์์๋๋จ.
( ์ฆ body.parser์ฒ๋ผ express.json์ ์ค์ app.use์ ์ ์ญ ๋ฏธ๋ค์จ์ด๋ก ๋ฑ๋กํ๊ฒ ๋๋๋ฐ, ๊ทธ๊ฒ๊ณผ ๋์ผํ๊ฒ req.cookies๋ฅผ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ cookie๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฏธ๋ค์จ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. )
1. cookie-parser ์ค์นํ๊ธฐ
# yarn์ ์ด์ฉํด cookie-parser๋ฅผ ์ค์นํฉ๋๋ค.
yarn add cookie-parser
2. cookie-parser ๋ฑ๋กํ๊ธฐ, app.js
import cookieParser from 'cookie-parser';
app.use(cookieParser());
// 'req.cookies'๋ฅผ ์ด์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์ฟ ํค๋ฅผ ์กฐํํ๋ API
app.get('/get-cookie', (req, res) => {
const cookies = req.cookies; //**** <-req.headers.cookie; ์์ ๋ณ๊ฒฝ๋จ!
console.log(cookies);
return res.status(200).json({ cookie: cookies });
});
* cookie-parser ๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ญ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด?
app.use(cookieParser());
์๋จ์ ์์์ ๊ฐ์ด app.use(cookieParser()); ์ ์ฌ์ฉํ์ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ญ์ผ๋ก ์ฌ์ฉ ํ ์ ์๋ค.
์ธ์ (Session)
์ฟ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋ ๊ธฐ์ ์ด๋ค. ๋จ, ํด๋ผ์ด์ธํธ๊ฐ ๋ง์๋๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ธ ํ ์ ์๋ ์ฟ ํค์๋ ๋ค๋ฅด๊ฒ ์ธ์ ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์๋ง ์ ์ฅํ๋ค.
์ธ์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ธ์ Id๋ฅผ ์ฟ ํค๋ฅผ ์ด์ฉํด ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ์ฌ, ์๋ฒ๋ ์ด ์ธ์ Id๋ฅผ ์ฌ์ฉํด ์ ์ฅ๋ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค.
์ธ์ ์ ํตํด ์ฌ์ฉ์์ ์ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๋ฉด, ์๋ฒ๋ ์ฌ์ฉ์์ ์ํ๋ฅผ ์ถ์ ํ ์ ์๊ฒ ๋๋ค.
๋ณด์์ฑ์ ์ข์ผ๋, ๋ฐ๋๋ก ์ฌ์ฉ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์๋ฒ์ ์ ์ฅํด์ผ ํ ๋ฐ์ดํฐ๊ฐ ๋ง์์ ธ์ ์๋ฒ ์ปดํจํฐ๊ฐ ๊ฐ๋นํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
์ฟ ํค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์ ์ญ์ ๋ง๋ฃ ๊ธฐ๊ฐ์ด ์๋ค.
/set-session API ๋ง๋ค๊ธฐ
let session = {};
app.get('/set-session', function (req, res, next) {
// ํ์ฌ๋ sparta๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ์ง๋ง, ๋์ค์๋ ๋ณต์กํ ์ฌ์ฉ์์ ์ ๋ณด๋ก ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
const name = 'sparta';
const uniqueInt = Date.now();
// ์ธ์
์ ์ฌ์ฉ์์ ์๊ฐ ์ ๋ณด ์ ์ฅ
session[uniqueInt] = { name };
res.cookie('sessionKey', uniqueInt);
return res.status(200).end();
});
/get-session API ๋ง๋ค๊ธฐ
app.get('/get-session', function (req, res, next) {
const { sessionKey } = req.cookies;
// ํด๋ผ์ด์ธํธ์ ์ฟ ํค์ ์ ์ฅ๋ ์ธ์
ํค๋ก ์๋ฒ์ ์ธ์
์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค.
const name = session[sessionKey];
return res.status(200).json({ name });
});
