c o d i n g . . ๐Ÿ‰/Node.js

[์ƒํ™œ์ฝ”๋”ฉ] NodeJs ํ™œ์šฉํ•˜๊ธฐ(1)

H J 2021. 8. 2. 20:39

HTTP

: ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ€ ์†Œํ†ต(request, response message)ํ•˜๋Š” ํ†ต์‹  ๋ฐฉ๋ฒ• - stateless

 

 

Cookie

: ์„œ๋ฒ„์—์„œ ์ „์˜ ๊ธฐ๋ก์„ ์ €์žฅ

→ session → ์ธ์ฆ์œผ๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Œ

 

์ด๋Ÿฐ ์‹์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค
Network์—์„œ ํ™•์ธ์„ ํ•˜๋ฉด Set-Cookie๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ ๋‚˜๋Š”.. ์—†๋‹ค.. ์ฟ ํ‚ค๊ฐ€.. ์™œ์ง€?? ์•„ ^.^ ์•Œ๊ณ ๋ณด๋‹ˆ ๋”ฐ๋กœ ๋‹ค์šดํ•ด์ค˜์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค ( ๊ทธ๊ฑฐ์Šจ ๋’ค์—... )

 

request์˜ ํ—ค๋”์—์„œ๋„ cookie ๋ถ€๋ถ„์˜ count๊ฐ€ 1๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

 

์ด์ œ Nodejs๋ฅผ ์ด์šฉํ•ด์„œ count์˜ ์ˆ˜๋ฅผ ๋Š˜๋ ค๊ฐ€๋ฉด์„œ response ํ—ค๋”๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ธํŒ…ํ•˜๋ผ๊ณ  ๋ช…๋ นํ•œ๋‹ค

๊ทธ๋ฆฌ๊ณ   ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์˜ ๋ช…๋ น์— ๋”ฐ๋ผ ๋‹ค์Œ์— ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ count๋ฅผ 2๋กœ ๋ฐ”๊พผ๋‹ค

 

 

!! ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ฒŒ ํ•„์š”ํ•œ์ง€ ์•Œ์•„๋ณด๋ฉด !!

https://expressjs.com/en/4x/api.html#req.cookies

 

Express 4.x - API Reference

Express 4.x API express() Creates an Express application. The express() function is a top-level function exported by the express module. var express = require('express') var app = express() Methods express.json([options]) This middleware is available in Ex

expressjs.com

 

cookie-parser๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค

 

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

๊ทธ๋ฆฌ๊ณ  js ํŒŒ์ผ์— ์ด๋ ‡๊ฒŒ cookie๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค

 

app.get('/count', function(req, res){
    let count = parseInt(req.cookies.count); //๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ
    if(!req.cookies.count){ // cookie์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด
        count=0;
    }
    count = count+1;
    res.cookie('count', count);
    res.send('count : '+ count);
})

/count๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ count๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ req.cookies.count ๋ฅผ ํ†ตํ•ด cookie์˜ count์— ์ ‘๊ทผํ•ด์„œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ค€๋‹ค

 

req.cookie.count์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด count ๊ฐœ์ˆ˜๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค

 

๊ฐ•์˜์—์„œ๋Š” var๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜ ์„ ์–ธ์˜ ์œ„์น˜๊ฐ€ ์ƒ๊ด€์—†์—ˆ์ง€๋งŒ let์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๊ฐ€์žฅ ์œ„์—์„œ ํ•ด์ค˜์•ผ ํ•œ๋‹ค

 

๋ฐฉ๋ฌธ ํšŸ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค res.cookie๋ฅผ ์‚ฌ์šฉํ•ด์„œ count๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๊ณ , ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ค€๋‹ค

 

↓↓↓ ๊ทธ ๊ฒฐ๊ณผ

๋”๋ณด๊ธฐ
์งœ๋ผ๋ž€! ๋‚˜๋„ ์ด์ œ Set-Cookie ์ƒ๊ฒผ๋‹น
๋ฆฌ๋กœ๋“œํ•ด์ฃผ๋ฉด request์˜ cookie count๊ฐ€ 1๋กœ ์„ค์ •๋œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

 

 

let products = {
    1:{title: 'The history of web 1'},
    2:{title: 'The next web'}
};

app.get('/products', function(req, res){
    let output='';
    for(let name in products){
        output += `
            <li>
                <a href="/cart/${name}">${products[name].title}</a>
            </li>
        `
    }
    res.send(`<h1>Products</h1><ul>${output}</ul><a href="/cart">Cart</a>`);
})

์ด ๋ถ€๋ถ„์€ ๊ฐ•์˜๊ฐ€ ์ž ๊ฒจ์žˆ์–ด์„œ ์ผ๋‹จ ์ฝ”๋“œ๋งŒ ๋”ฐ๋ผ ์ผ๋‹ค

 

์—ฌ๊ธฐ์„œ products ๊ฐ์ฒด๋Š” id ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” title์˜ ๊ฐ’์ด ๋‹ด๊ฒจ์žˆ๋‹ค

/product๋ฅผ get ๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŠธ ํ•ด์ฃผ๊ณ ! ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค์„œ 1, 2์˜ title์„ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ณ , url์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค

๋งˆ์ง€๋ง‰์œผ๋กœ cart ํŽ˜์ด์ง€์—๋„ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค

 

 

์ด์ œ ๊ฐ ๋งํฌ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ์˜ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŠธ ํ•ด์ค€๋‹ค

app.get('/cart/:id', function(req, res){
    let id = req.params.id;
    let cart;
    let cart = req.cookies.cart;
    if(!req.cookies.cart){
        cart = {}; // ๋นˆ ๊ฐ์ฒด - ์ •๋ณด x -> ํ•œ๋ฒˆ๋งŒ
    }
    if(!cart[id]){ //์—†๋Š” id์— ์ ‘๊ทผํ•˜๋ฉด
        cart[id] = 0; // cnt 0์œผ๋กœ ์„ค์ •
    }
    cart[id] = parseInt(cart[id])+1; // ํ•ด๋‹น url์˜ count ๋”ํ•˜๊ธฐ
    res.cookie('cart', cart); // ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ์— cart ๊ฐ์ฒด ์‹ฌ๊ธฐ
    res.send(cart);
})

cookie cart๊ฐ€ ์žˆ๋‹ค๋ฉด cart์— ๊ทธ๋Œ€๋กœ ๋Œ€์ž…, ์—†๋‹ค๋ฉด ์ตœ์ดˆ๋กœ ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์ƒ์„ฑ!

id๊ฐ€ ์—†๋Š” cart๋ผ๋ฉด 0์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๊ณ , ํ˜„์žฌ cart์—์„œ 1์„ ๋”ํ•ด์ค€๋‹ค

 

์ด๊ฒƒ์ฒ˜๋Ÿผ cart ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด id๊ฐ€ 1์ธ ์‚ฌ์ดํŠธ์—” 2๋ฒˆ, id๊ฐ€ 2์ธ ์‚ฌ์ดํŠธ์—” 4๋ฒˆ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

 

 res.redirect('/cart');

๊ทธ๋ฆฌ๊ณ  cart ํŽ˜์ด์ง€๋กœ ๋ณด๋‚ด๊ธฐ

 

 

๋‹ค์Œ์œผ๋กœ๋Š” cart ํŽ˜์ด์ง€ ๋ผ์šฐํŠธ ํ•˜๊ธฐ!

app.get('/cart', function(req, res){
   let cart = req.cookies.cart;
   let output='';
   if(!cart){
       res.send('Empty!');
   }
   else{
       for(let id in cart){
           output += `<li>${products[id].title} (${cart[id]})</li>`;
       }
   }
   res.send(`
   <h1>Cart</h1>
   <ul>${output}</ul>
   <a href="/products">Products List</a>`)
})

cart๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด ๋น„์–ด์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ณ ,

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด ๋ฌผํ’ˆ์˜ ์ด๋ฆ„๊ณผ ์นดํŠธ์˜ ์ˆ˜๋ฅผ output์— ๋‹ด์•„์ค€๋‹ค

 

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ output์„ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  products ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค

 

↓↓↓ ๊ทธ ๊ฒฐ๊ณผ

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณด์•ˆ๊ณผ ๊ด€๋ จ๋œ ์ฟ ํ‚ค!!

 

→ cookie๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ https ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค (์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ์†Œํ†ต)

 

→ cookie ๊ฐ’ ์ž์ฒด๋ฅผ ์•”ํ˜ธํ™”: app.use(cookieParser('134123jrehfds**(&#94'));

์ด๋Ÿฐ ์‹์œผ๋กœ cookieParser๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์— ์•„๋ฌด ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ์ €๊ฒŒ key ๊ฐ’์ด ๋œ๋‹ค

๊ทธ๋ฆฌ๊ณ  /count์—์„œ count๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋˜ํ•œ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค

app.use(cookieParser('134123jrehfds**(&#94'));

app.get('/count', function(req, res){
    let count = parseInt(req.signedCookies.count); //๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ
    if(!req.signedCookies.count){ // cookie์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด
        count=0;
    }
    count = count+1;
    res.cookie('count', count, {signed: true});
    res.send('count : '+ count);
})

req.cookies๋ฅผ ์“ฐ๋˜ ๋ถ€๋ถ„์„ req.signedCookies๋กœ, cookie๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋˜ ๋ถ€๋ถ„์˜ 3๋ฒˆ์งธ ์ธ์ž๋กœ

{signed: true}๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค

 

 

์ฒ˜์Œ๊ณผ ๋‹ค๋ฅด๊ฒŒ Set-Cookie์—์„œ count์˜ ๊ฐ’์ด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๊ณ  ์•”ํ˜ธํ™”๋œ ์ •๋ณด๋กœ ๋ฐ”๋€๋‹ค!

 

 

 


์˜ค๋Š˜ ์€ ์—ฌ๊ธฐ๊นŒ ์ง€ ! !!!

 

ํ•˜์•„ใ…œใ…œ ์š”์ฆ˜ ๊ตํ™˜ํ•™์ƒ, ํœดํ•™, ๋ผํ”ผ์‹  ๋“ฑ๋“ฑ ๋•Œ๋ฉ” ๋จธ๋ฆฌ๊ฐ€ ์•„ํ”„๋‹ค ํœด

์–ด๋–ป๊ฒŒ ํ•ด์•ผ๋ ์ง€ ๋” ๊ณ ๋ฏผํ•ด๋ด์•ผ๊ฒ ๋‹ค

 

4์ผ์— ๋ผํ”ผ์‹  ๊ฒฐ์ •๋˜๊ณ !

18์ผ์— ์ˆ˜๊ฐ•์‹ ์ฒญํ•˜๊ณ  ๊ฒฐ์ •๋  ๋“ฏ!!

 

์˜ค๋Š˜๋ถ€ํ„ฐ ์•„์นจ๋งˆ๋‹ค ์›”~๊ธˆ ํ† ์ต ํ•™์› ๊ฐ€์•ผ๋˜๋Š”๋ฐ ๊ณผ์ œ๊ฐ€ ๋„˜ ๋งŽ์•„ใ… ใ… ใ… ใ…  ;ใ……;

 

๋‚˜ ํ”„๋กœ์ ํŠธ๋„ ํ•ด์•ผ๋Œ€๋Š”๋””ใ… ใ… ใ