๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[http ๋ชจ๋“ˆ๋กœ ์„œ๋ฒ„] (3) ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค ๋งŒ๋“ค์–ด ์š”์ฒญ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ๋„ฃ๊ธฐ + ์„ธ์…˜์ฟ ํ‚ค ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ๋ฐฑ์—”๋“œ(Back-End)/Node js

[http ๋ชจ๋“ˆ๋กœ ์„œ๋ฒ„] (3) ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค ๋งŒ๋“ค์–ด ์š”์ฒญ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ๋„ฃ๊ธฐ + ์„ธ์…˜์ฟ ํ‚ค

์ง•์ง•์•ŒํŒŒ์นด 2023. 4. 19. 00:22
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” Node.js ๊ต๊ณผ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

 

๐ŸŽ€ ์ฟ ํ‚ค

: ์œ ํšจ ๊ธฐ๊ฐ„์ด ์žˆ์œผ๋ฉฐ name=zerocho ์™€ ๊ฐ™์ด ๋‹จ์ˆœํ•œ "ํ‚ค-๊ฐ’" ์˜ ์Œ

: ์„œ๋ฒ„๋Š” ๋ฏธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์— ์š”์ฒญ์ž๋ฅผ ์ถ”์ •ํ•  ๋งŒํ•œ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค๋กœ ๋งŒ๋“ค์–ด ๋ณด๋‚ด๊ณ , ๊ทธ ๋‹ค์Œ์—๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„ ์š”์ฒญ์ž๋ฅผ ํŒŒ์•…

: ์š”์ฒญ์˜ ํ—ค๋”(Cookie)์— ๋‹ด๊ฒจ ์ „์†ก

: ๋ธŒ๋ผ์šฐ์ €๋Š” ์‘๋‹ต์˜ ํ—ค๋”(Set-Cookie)์— ๋”ฐ๋ผ ์ฟ ํ‚ค ์ €์žฅ

// ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ์กด์žฌ, ์ฟ ํ‚ค ๊ฐ„์— ; ๋กœ ๊ตฌ๋ถ„
name=zerocho;year=1995

 

๐ŸŽ€ ์ฟ ํ‚ค๋กœ ์‚ฌ์šฉ์ž ์‹๋ณ„ํ•˜๊ธฐ

๐ŸŒฟ cookie2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>์ฟ ํ‚ค&์„ธ์…˜ ์ดํ•ดํ•˜๊ธฐ</title>
</head>
<body>
    <form action = "/login">
        <input id = "name" name = "name" placeholder = "์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”" />
        <button id = "login">๋กœ๊ทธ์ธ</button>
    </form>
</body>
</html>

 

๐ŸŒฟ cookie2.js

const http = require("http");
const fs = require("fs").promises;
const url = require("url");
const qs = require("querystring");

const parseCookies = (cookie = "") =>
    cookie
        .split(";")
        .map(v => v.split("="))
        .reduceRight((acc, [k, v]) => {
            acc[k.trim()] = decodeURIComponent(v);
            return acc;
        }, {});

http.createServer(async (req, res)=> {
    const cookies = parseCookies(req.headers.cookie);

    // ์ฃผ์†Œ๊ฐ€ /login์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ
    if (req.url.startsWith("/login")) {
        const {query} = url.parse(req.url);
        const {name} = qs.parse(query);
        const expires = new Date();

        // ์ฟ ํ‚ค ์œ ํšจ ์‹œ๊ฐ„์„ ํ˜„์žฌ ์‹œ๊ฐ„ + 5๋ถ„ ์„ค์ •
        expires.setMinutes(expires.getMinutes() + 5);
        res.writeHead(302, {
            Location : "/",
            "Set-Cookie" : `name=${encodeURIComponent(name)};Expires=${expires.toGMTString()};HttpOnly;Path=/`,
        });
        res.end();

        
    } else if (cookies.name) {// name ์ด๋ผ๋Š” ์ฟ ํ‚ค ์žˆ๋Š” ๊ฒฝ์šฐ
        res.writeHead(200, { "Content-Type" : "text/plain; charset=utf-8"});
        res.end(`${cookies.name}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”`);
    } else {
        try {
            const data = await fs.readFile("./cookie2.html");
            res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
            res.end(data);
        } catch (err) {
            res.writeHead(500, { "Content-Type" : "text/plain; charset=utf-8"});
            res.end(err.message);
        }
    }
})
    .listen(8084, () => {
        console.log("8084๋ฒˆ ํฌํŠธ์—์„œ ์„œ๋ฒ„ ๋Œ€๊ธฐ์ค‘ ์ž…๋‹ˆ๋‹ค.");
    })

 

์ƒˆ๋กœ๊ณ ์นจ ํ•ด๋„ ๋กœ๊ทธ์ธ์ด ์œ ์ง€๋จ

์ฟ ํ‚ค ๋…ธ์ถœ!!!!!!!!

 

๐ŸŽ€ ์ฟ ํ‚ค๋กœ ์‚ฌ์šฉ์ž ์‹๋ณ„ํ•˜๊ธฐ + ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ด€๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ธฐ

๐ŸŒฟ ์„ธ์…˜ ์ฟ ํ‚ค

: ์„ธ์…˜์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ฟ ํ‚ค

: ์„œ๋ฒ„์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™„๋Š ์„ธ์…˜ ์•„์ด๋””๋กœ๋งŒ ์†Œํ†ตํ•˜๊ธฐ

 

๐ŸŒฟ session.js

const http = require("http");
const fs = require("fs").promises;
const url = require("url");
const qs = require("querystring");

const parseCookies = (cookie = "") =>
  cookie
    .split(";")
    .map(v => v.split("="))
    .reduceRight((acc, [k, v]) => {
      acc[k.trim()] = decodeURIComponent(v);
      return acc;
    }, {});

const session = {};

http.createServer(async (req, res) => {
  const cookies = parseCookies(req.headers.cookie);

  // ์ฃผ์†Œ๊ฐ€ /login์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ
  if (req.url.startsWith("/login")) {
    const { query } = url.parse(req.url);
    const { name } = qs.parse(query);
    const expires = new Date();

    // ์ฟ ํ‚ค ์œ ํšจ ์‹œ๊ฐ„์„ ํ˜„์žฌ ์‹œ๊ฐ„ + 5๋ถ„ ์„ค์ •
    expires.setMinutes(expires.getMinutes() + 5);
    const uniqueInt = Date.now();
    // ์ฟ ํ‚ค์— ์ด๋ฆ„ ๋Œ€์‹  ์ˆซ์ž ๊ฐ’
    session[uniqueInt] = {
      name,
      expires,
    };
    res.writeHead(302, {
      Location: "/",
      "Set-Cookie": `session=${uniqueInt};Expires=${expires.toGMTString()};HttpOnly;Path=/`,
    });
    res.end();

  } else if (cookies.session && session[cookies.session].expires > new Date()) {// session ์ฟ ํ‚ค๊ฐ€ ์กด์žฌํ•˜๊ณ , ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด
    res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
    res.end(`${session[cookies.session].name}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”`);
  } else {
    try {
      const data = await fs.readFile("./cookie2.html");
      res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
      res.end(data);
    } catch (err) {
      res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
      res.end(err.message);
    }
  }
})
  .listen(8084, () => {
    console.log("8084๋ฒˆ ํฌํŠธ์—์„œ ์„œ๋ฒ„ ๋Œ€๊ธฐ์ค‘ ์ž…๋‹ˆ๋‹ค.");
  })

728x90
๋ฐ˜์‘ํ˜•
Comments