[ Node.js ์ˆ™๋ จ์ฃผ์ฐจ1 (1-9)] ์ฟ ํ‚ค์™€ ์„ธ์…˜

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 });
});