๐ŸŒฑ → ๐ŸŒณ

[node.js] Cookie - ํŒ์—… ์ฐฝ ํ•˜๋ฃจ๋™์•ˆ ๋ณด์ง€ ์•Š๊ธฐ ๋ณธ๋ฌธ

Server/Node.js

[node.js] Cookie - ํŒ์—… ์ฐฝ ํ•˜๋ฃจ๋™์•ˆ ๋ณด์ง€ ์•Š๊ธฐ

BAY 2022. 9. 24. 15:49
728x90

๐Ÿ“Œ Cookie

: HTTP ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

  • JS์˜ ๊ฐ์ฒด์ฒ˜๋Ÿผ key ๊ฐ’๊ณผ, data๊ฐ€ ๋“ค์–ด ์žˆ์Œ
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฟ ํ‚ค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€, ๋™์ผํ•œ ์„œ๋ฒ„์— ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋  ๋•Œ ์ฟ ํ‚ค์— ์ €์žฅ๋œ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ „์†ก
  • ์„œ๋ฒ„์—์„œ๋Š” ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ์š”์ฒญ์ด ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €์— ๋“ค์–ด์™”๋Š”์ง€(ํ˜น์€ ์š”์ฒญ์ด ๋™์ผํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋“ค์–ด์™”๋Š”์ง€) ๋“ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ
  • ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ํ•  ์ •๋ณด๋ฅผ ๊ด€๋ฆฌ -> ๋กœ๊ทธ์ธ ์ •๋ณด, ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ํŒ์—… ํ•˜๋ฃจ ๋™์•ˆ ์•ˆ ๋ณด๊ธฐ ๋“ฑ
  • ์ค‘์š”ํ•œ ์ •๋ณด(์ด๋ฆ„, ๋ฐ์ดํ„ฐ, ๋งŒ๋ฃŒ์ผ, ๊ฒฝ๋กœ ๋“ฑ)๋Š” ๋กœ์ปฌ์— ๋‚จ๊ฒŒ ๋˜๋ฏ€๋กœ ์ ˆ๋Œ€ ์ €์žฅํ•ด์„œ๋Š” ์•ˆ๋จ

 

โœ… Cookie์˜ ๋™์ž‘ ๋ฐฉ์‹

โœ… ํ”„๋ก ํŠธ์—์„œ ์ฟ ํ‚ค ์‚ฌ์šฉํ•˜๊ธฐ 

(์‚ฌ์šฉ X, ํŽธ๋ฒ•)

document.cookie๋กœ ์‚ฌ์šฉ 

<script>
    console.log(document.cookie);
    document.cookie = "user=test1; expires=19 Sep 2022 13:00:00 GMT; path=/";
    document.cookie = "test=test2; expires=19 Sep 2022 13:00:00 GMT; path=/";
    console.log(document.cookie);
</script>

expires๊ฐ’๊ณผ ๋ธŒ๋ผ์šฐ์ €์˜ ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด์„œ ์ฟ ํ‚ค๊ฐ€ ํ•ด๋‹น ์‹œ๊ฐ„์ด ๋˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ ์ฒ˜๋ฆฌ

 

window.onload = () => {
   if (document.cookie) alert(`์ฟ ํ‚ค ํŒ”์•„์š”! ${document.cookie}`);
};

Front JS ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํŠน์ • ์ƒํ™ฉ์—์„œ ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ ๊ณ ์นจ ํ•ด๋„ ์ €์žฅ์ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•˜์—ฌ DB์ฒ˜๋Ÿผ ํ™œ์šฉ๋„ ๊ฐ€๋Šฅ 

(ํ•˜์ง€๋งŒ, ๋”ฑํžˆ ์“ธ ์ผ์€ ๋งŽ์ง€ ์•Š์Œ)

 

๐Ÿ“ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค ํ™•์ธํ•˜๊ธฐ 

๊ฐœ๋ฐœ์ž ๋„๊ตฌ -> Application ->  Storage -> Cookies ์— ๊ฐ€๋ฉด ์ฟ ํ‚ค ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ 

 

โœ… ๋ฐฑ์—”๋“œ(express)์—์„œ ์ฟ ํ‚ค ์‚ฌ์šฉํ•˜๊ธฐ 

cookie-parsser ๋ชจ๋“ˆ ์‚ฌ์šฉ 

npm i cookie-parder -s

 

๋ฉ”์ธ ์„œ๋ฒ„์— ์ฟ ํ‚ค ๋ชจ๋“ˆ ํ˜ธ์ถœ ๋ฐ ๋ฏธ๋“ค์›จ์–ด ๋“ฑ๋ก

const cookieParser = require('cookie-parser');
app.use(cookieParser());

 

์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ๊ณณ์—์„œ res.cookie('์ฟ ํ‚ค ์ด๋ฆ„', '๋ฐ์ดํ„ฐ', '์˜ต์…˜ ๊ฐ์ฒด'); ๋ฅผ ์จ์„œ ์‚ฌ์šฉ

res.cookie('alert', true, {
    expires: new Date(Date.now() + 1000 * 60),
    httpOnly: true,
});

 

๐Ÿ” ์˜ต์…˜์˜ ์˜๋ฏธ 

  • expires: ์ฟ ํ‚ค๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๋Š” ์ผ์ž ์ง€์ •
  • httpOnly: ํ•ด๋‹น ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์™€์˜ http ํ†ต์‹ ์—์„œ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Œ์„ ํ‘œ์‹œ, ํ”„๋ก ํŠธ์—์„œ์ฒ˜๋Ÿผ JS๋กœ ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ์ฝ์œผ๋ ค ํ•˜๋ฉด ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์ฐจ๋‹จ

๐Ÿ“ ์‹ค์ œ๋กœ ์ฟ ํ‚ค๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ 

index.ejs์—์„œ cookie๊ฐ€ ์„œ๋ฒ„์—์„œ ์ž˜ ์ „์†ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธ 

(ํ”„๋ก ํŠธ์—์„œ ์ฟ ํ‚ค ๋ฐœํ–‰ํ•œ ์ฝ”๋“œ ์ฃผ์„ ์ฒ˜๋ฆฌ + ๊ธฐ์กด์— ๋ฐœํ–‰๋œ ์ฟ ํ‚ค๋„ ์‚ญ์ œ ์ฒ˜๋ฆฌ)

 

window.onload = () => {      
   if (document.cookie) alert(`์ฟ ํ‚ค ํŒ”์•„์š”! ${document.cookie}`);
};

-> httpOnly ์˜ต์…˜ ๋•Œ๋ฌธ์— document.cookie์˜ ๊ฐ’์„ ์ฝ์œผ๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฐจ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— alert์ฐฝ ์•ˆ ๋œธ

 

๋”ฐ๋ผ์„œ, httpOnly ์˜ต์…˜์„ false๋กœ ๋ฐ”๊พธ๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ 

 

๐Ÿ“ ์ฟ ํ‚ค ๊ฐ’ ์ „๋‹ฌ 

์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ฟ ํ‚ค์˜ ๊ฐ’์„ res.render์— ๋‹ด์— ๊ฐ™์ด ์ „๋‹ฌํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ 

 

์ƒ์„ฑ๋œ ์ฟ ํ‚ค์— ๋Œ€ํ•œ ์ ‘๊ทผ: req.cookies.์ฟ ํ‚ค์ด๋ฆ„

res.cookie('alert', true, {
    expires: new Date(Date.now() + 1000 * 60),
    httpOnly: true,
  });
res.render('index', { alert: req.cookies.alert });
// index.ejs
<script>
  window.onload = () => {
      if ('<%= alert %>' === 'true') alert(`์ฟ ํ‚ค ํŒ”์•„์š”! ${document.cookie}`);
    };
</script>

-> httpOnly ์˜ต์…˜์ด ์ผœ์ ธ ์žˆ์Œ์—๋„ ๊ฐ’์„ ์ „๋‹ฌํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— alert์ฐฝ์ด ์ž˜ ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ 

(๋‹จ, ์ฟ ํ‚ค ๋‚ด์šฉ์€ ์•ˆ ๋œธ)

 

๐Ÿ“Œ ํŒ์—… ์ฐฝ ํ•˜๋ฃจ ๋™์•ˆ ๋ณด์ง€ ์•Š๊ธฐ 

: ํŒ์—…์ด ๋œฌ ์ƒํ™ฉ์—์„œ ์˜ค๋Š˜ ํ•˜๋ฃจ ์•ˆ๋ณด๊ธฐ๋ฅผ ์ฒดํฌํ•˜๊ณ  ๋‹ซ๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ฟ ํ‚ค๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , ํ•ด๋‹น ์ฟ ํ‚ค์— ์˜ํ•ด ํŒ์—…์ด ํ•˜๋ฃจ ๋™์•ˆ ์•ˆ๋ณด์ด๋„๋ก ๊ตฌํ˜„ 

 

(๋ฐ˜๋“œ์‹œ, app.js์—์„œ index.ejs ๋ผ์šฐํŒ…๋ณด๋‹ค cookie-parser ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ๋จผ์ € ํ•ด์•ผ ์ž‘๋™ํ•œ๋‹ค)

(๋‚˜๋„ ์•Œ๊ณ  ์‹ถ์ง€ ์•Š์•˜์Œ)

 

๐Ÿ“index.ejs

<body>
  <!-- Modal -->
  <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">cookie ์‹ค์Šต</h5>
          <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        </div>
        <div class="modal-body">
          ์ฟ ํ‚ค ์‹ค์Šต
          <div class="text-end mt-3">
            <input type="checkbox" id="cookie"> <label for="cookie" style="cursor: pointer;">์˜ค๋Š˜ ํ•˜๋ฃจ ์•ˆ๋ณด๊ธฐ</label>
          </div>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" onclick="modalClose();">๋‹ซ๊ธฐ</button>
        </div>
      </div>
    </div>
  </div>

  <script>
    const myModal = new bootstrap.Modal('#exampleModal');
    if ('<%= popup %>' !== 'hide') myModal.show();

    function modalClose() {
      // ํ•˜๋ฃจ ๋™์•ˆ ์•ˆ๋ณด๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ
      const cookie = document.getElementById("cookie");
      if (cookie.checked == true) {
        fetch('/cookie', {
          method: 'post',
          headers: {
            'Content-type': 'application/json'
          },
        }).then((res) => {
          console.log(res.data);
        }).catch((err) => {
          console.log(err);
        })
      }
      myModal.hide();
    }
  </script>

  <div class="container mt-5">
    <h1 class="text-center">Hello, Express Service</h1>
    <h2 class="mt-5 text-center"><a href="/login">๋กœ๊ทธ์ธ ๋ฐ”๋กœ๊ฐ€๊ธฐ</a></h2>
  </div>

</body>

 

๐Ÿ“index.js

// @ts-check

const express = require('express');

const router = express.Router();

router.get('/', (req, res) => {
  res.render('index', { popup: req.cookies.popup });
});

router.post('/cookie', (req, res) => {
  res.cookie('popup', 'hide', {
    expires: new Date(Date.now() + 1000 * 60 * 60 * 24),
    httpOnly: true,
  });
  res.send('์ฟ ํ‚ค ์ƒ์„ฑ');
});

module.exports = router;

 

 

728x90