์›น ๊ฐœ๋ฐœ/node.js

node.js(4) - Express.js ์‹œ์ž‘ํ•˜๊ธฐ

SolartheNomad 2023. 4. 15. 02:05

๐Ÿฅ express ์‹œ์ž‘ํ•˜๊ธฐ 

 

โœ ๋ช…๋ น์–ด ์ž…๋ ฅํ•˜๊ธฐ 

$ npm i express
$ npm i -D nodemon

 

โœ package.json์˜ scripts ์ˆ˜์ •ํ•˜๊ธฐ 

  "name": "learn-express",
  "version": "0.0.1",
  "description": "์ต์Šคํ”„๋ ˆ์Šค๋ฅผ ๋ฐฐ์šฐ์ž",
  "main": "app.js",
  "scripts": {
    "start": "nodemon app"
  },
  "author": "ZeroCho",
  "license": "MIT"
}

 start ์†์„ฑ :  nodemon app์„ ํ•˜๋ฉด app.js๋ฅผ nodemon์œผ๋กœ ์‹คํ–‰ํ•จ

 

 

app.js

- ์„œ๋ฒ„๊ฐ€ ๋จ

const express= require('express');

const app = express();
app.set('port', process.env.PORT || 3000);

app.get('/', (req,res) => {
    res.send('Hello, Express');
});

app.listen(app.get('port'), ()=>{
    console.log(app.get('port', '๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘'));

});

express ๋ชจ๋“ˆ ์•ˆ์— http ๋ชจ๋“ˆ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„์˜ ์—ญํ• ์„ ํ•ด์ค€๋‹ค. 

 

app.set('port', ํฌํŠธ)

- ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋  ํฌํŠธ๋ฅผ ์„ค์ •ํ•จ

- process.env ๊ฐ์ฒด์— PORT ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ , ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ 3000๋ฒˆ ํฌํŠธ๋ฅผ ์ด์šฉํ•˜๊ฒŒ ํ•œ๋‹ค. 

 

app.get('์ฃผ์†Œ', ๋ผ์šฐํ„ฐ)

- ์ฃผ์†Œ์— ๋Œ€ํ•œ GET ์š”์ฒญ์ด ์˜ฌ ๋•Œ ์–ด๋–ค ๋™์ž‘์„ ํ• ์ง€ ์ ๋Š” ๋ถ€๋ถ„

- req : ์š”์ฒญ์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๊ฐ์ฒด

- res :  ์‘๋‹ต์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๊ฐ์ฒด

- ์—ฌ๊ธฐ์„œ๋Š” GET / ์š”์ฒญ ์‹œ ์‘๋‹ต์œผ๋กœ Hello, Express๋ฅผ ์ „์†ก

 

๊ฐ™์€ ์˜๋ฏธ๋กœ app.post, app.put, app.patch. app.delete, app.options ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Œ 

 

 

res.Sendfile(__dirname, '์‘๋‹ต์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ html ํŒŒ์ผ ์ด๋ฆ„')

- HTMLํŒŒ์ผ๋กœ ์‘๋‹ตํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ 

- ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ path ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•ด์•ผ ํ•จ 

 

index.html

<html>
<head>
  <meta charset="UTF-8" />
  <title>์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„</title>
</head>
<body>
  <h1>์ต์Šคํ”„๋ ˆ์Šค</h1>
  <p>๋ฐฐ์›Œ๋ด…์‹œ๋‹ค.</p>
</body>
</html>

 

app.js 

const express = require('express');
const path = require('path');

const app = express();
app.set('port', process.env.PORT || 3000);
app.get('/', (req, res) => {
  // res.send('Hello, Express');
  res.sendFile(path.join(__dirname, '/index.html'));
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘');
});

 

 

 

 

๋ฏธ๋“ค์›จ์–ด

-  ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ค‘๊ฐ„(middle)์— ์œ„์น˜ํ•จ

- ๋ผ์šฐํ„ฐ, ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ฐ€๋ฅดํ‚ด

-  ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์กฐ์ž‘ํ•ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋„ ํ•˜๊ณ , ๋‚˜์œ ์š”์ฒญ์„ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ๋„ ํ•จ 

- app.use(๋ฏธ๋“ค์›จ์–ด) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. 

-  ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋ฉด์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต ์‚ฌ์ด์— ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•จ 

 

โœ app.js

- ์„œ๋ฒ„์™€ ๋ฏธ๋“ค์›จ์–ด ์—ฐ๊ฒฐํ•˜๊ธฐ 

const express= require('express');

const app = express();
app.set('port', process.env.PORT || 3000);

app.use((req, res, next) => {
    console.log('๋ชจ๋“  ์š”์ฒญ์— ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
    next();
});

app.get('/', (req, res, next)=>{
    console.log('GET / ์š”์ฒญ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
    next();
}, (req, res)=>{
    throw new Error('์—๋Ÿฌ๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ฐ‘๋‹ˆ๋‹ค.')
});

app.use((err, req, res, next) => {
    console.error(err);
    res.status(500).send(err.message);

});

app.listen(app.get('port'), ()=>{
    console.log(app.get('port', '๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘'));

})

 

next() ํ•จ์ˆ˜

app.use((req, res, next) => {
    //์‹คํ–‰ ํ•จ์ˆ˜
    next();

-  ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ€๋Š” ํ•จ์ˆ˜

- next๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. 

- app.use, app.get์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ 

- app.use๋‚˜ app.get ๊ฐ™์€ ๋ผ์šฐํ„ฐ์— ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์žฅ์ฐฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

- ์ฃผ์†Œ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฏธ๋“ค ์›จ์–ด๋Š” ๋ชจ๋“  ์š”์ฒญ์—์„œ ์‹คํ–‰๋˜๊ณ , ์ฃผ์†Œ๋ฅผ ๋„ฃ๋Š” ๋‹ค๋ฉด ํ•ด๋‹นํ•œ๋А ์š”์ฒญ์—์„œ๋งŒ ์‹คํ–‰๋œ๋‹ค. 

 

๐Ÿ’š ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด 

app.use((err, req, res, next) => {
    console.error(err);
    res.status(500).send(err.message);

});

-  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ err, req, res, next๋กœ ๋„ค ๊ฐœ๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค. 

-  err์—๋Š” ์—๋Ÿฌ์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

 

โœ morgan, cookie-parser, express-session, dotenv ์„ค์น˜ํ•˜๊ธฐ 

npm i morgan cookie-parser express-session dotenv

 

๐Ÿ’š dotenv

- process.env๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ‚ค์ง€ 

- .env ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

app.js

//์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๋“ค์ธ morgan, cookie-parser, express-session(session) dotenv, express, path ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์˜ด

const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
//ํ™˜๊ฒฝ์„ค์ • ์ ์šฉ : dotenv.config()
dotenv.config();
//const app = express(์„œ๋ฒ„๋ฅผ app์œผ๋กœ, ์„œ๋ฒ„๋Š” express๋กœ ๊ตฌ์ถ•ํ•จ)
const app = express();
//app.set( ) : ํฌํŠธ ์—ฐ๊ฒฐ
//process.env :  ๋ณด์•ˆ๊ณผ ์„ค์ •์˜ ํŽธ์˜์„ฑ ,  .env์— ๋น„๋ฐ€ ํ‚ค๋ฅผ ์ ์–ด๋‘๊ณ  dotenv ํŒจํ‚ค์ง€๋กœ ๋น„๋ฐ€ ํ‚ค๋ฅผ ๋กœ๋”ฉํ•ด์ค€๋‹ค.
app.set('port', process.env.PORT || 3000);


//์œ„์—์„œ ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๋“ค์„ app.use ๋ฏธ๋“ค์›จ์–ด๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
//morgan ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉํ•˜๊ธฐ 
app.use(morgan('dev'));
//static ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉํ•˜๊ธฐ 
app.use('/', express.static(path.join(__dirname, 'public')));
//body-parser ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉํ•˜๊ธฐ
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
//cookie-parser ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉํ•˜๊ธฐ
app.use(cookieParser(process.env.COOKIE_SECRET));
// express-session ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉํ•˜๊ธฐ
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: false,
  },
  name: 'session-cookie',
}));

app.use((req, res, next) => {
  console.log('๋ชจ๋“  ์š”์ฒญ์— ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
  next();
});

 

์œ„์˜ app.use๊ฐ€ ๊ณ„์† ์ค‘๋ณต์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณ„๋กœ ์ด์˜์ง€ ์•Š์•„์„œ, ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ์ž‘์„ฑํ•ด์ฃผ์ž

app.use(
  morgan('dev'),
  express.static('/', path.join(__dirname, 'public')),
  express.json(),
  express.urlencoded({ extended: false }),
  cookieParser(process.env.COOKIE_SECRET),
);

 

๐Ÿ’š morgan ๋ฏธ๋“ค์›จ์–ด

- ์ธ์ˆ˜๋กœ dev ์™ธ์— combined, common, short, tiny ๋“ฑ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. 

- ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” dev๋ฅผ, ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋Š” combined์„ ์‚ฌ์šฉํ•œ๋‹ค.

app.use(morgan('dev'));

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ฝ˜์†” ์ฐฝ์— ์ฐ์–ด๋ณด๋ฉด, 

 

์—์„œ ๋งจ๋งˆ์ง€๋ง‰์˜  GET / 500 7.409 ms - 50 ๋กœ๊ทธ๋Š” ๋ฏธ๋“ค์›จ์–ด์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค. 

-  [HTTP ๋ฉ”์„œ๋“œ] [์ฃผ์†Œ] [HTTP ์ƒํƒœ ์ฝ”๋“œ] [์‘๋‹ต ์†๋„] - [์‘๋‹ต ๋ฐ”์ดํŠธ]๋ฅผ ์˜๋ฏธํ•จ 

 

๐Ÿ’š static ๋ฏธ๋“ค์›จ์–ด

- ์ •์ ์ธ ํŒŒ์ผ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์šฐํ„ฐ

- ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๊ธฐ์— ๋”ฐ๋กœ ์„ค์น˜ํ•  ํ•„์š” ์—†์ด express ๊ฐ์ฒด ์•ˆ์—์„œ ๊บผ๋‚ด ์žฅ์ฐฉํ•˜๋ฉด ๋จ 

 

static ๋ฏธ๋“ค์›จ์–ด ํ˜•ํƒœ

app.use('์š”์ฒญ ๊ฒฝ๋กœ', express.static('์‹ค์ œ ๊ฒฝ๋กœ'));
app.use('/', express.static(path.join(__dirname, 'public')));

- public : ์‹ค์ œ ์„œ๋ฒ„์˜ ํด๋” ๊ฒฝ๋กœ 

- ์š”์ฒญ์ฃผ์†Œ์—๋Š” public์ด ๋“ค์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌด๋„ค ์„œ๋ฒ„์˜ ํด๋” ๊ฒฝ๋กœ์™€ ์š”์ฒญ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ, ๋ณด์•ˆ์  ์ธก๋ช… ๊ฐ•ํ™” 

- ์š”์ฒญ ๊ฒฝ๋กœ์— ํ•ด๋‹น๋˜๋Š” ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ next๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋งŒ์•ฝ ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋Š” ์‹คํ–‰๋œ๋‹ค.(์‘๋‹ต์œผ๋กœ ํŒŒ์ผ์„ ๋ณด๋‚ด๊ณ  next๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ)

 

body-parser ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉํ•˜๊ธฐ

- ์š”์ฒญ์˜ ๋ณธ๋ฌธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•ด์„œ req.body ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. 

- ํผ ๋ฐ์ดํ„ฐ๋‚˜ AJAX ์š”์ฒญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•จ 

- ๋ฉ€ํ‹ฐํŒŒํŠธ(์ด๋ฏธ์ง€, ๋™์˜์ƒ, ํŒŒ์ผ) ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•จ 

- JSON๊ณผ URL-encoded ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์™ธ์—๋„ Raw, Text ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์—ญ์‹œ ํ•ด์„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

โœ ์„ค์น˜ ๋ช…๋ น์–ด 

$ npm i body-parser

 

- body-parser๊ฐ€ ๋‚ด์žฅ๋˜์–ด์žˆ์„ ๋•Œ๋Š” ์“ธ ํ•„์š” ์—†์ง€๋งŒ npm์— ๋“ค์–ด๊ฐ€ ์žˆ์ง€ ์•Š์•„ ๋”ฐ๋กœ ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ์„ app.js์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

const bodyParser = require('body-parser');
app.use(bodyParser.raw());
app.use(bodyParser.text());

 

๐Ÿ’š body-parser ๋ฏธ๋“ค์›จ์–ด ํ˜•ํƒœ

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

 

๐Ÿงƒ express.json

- JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹

- JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ์ธ { name: 'zerocho', book: 'nodejs' }๋ฅผ ๋ณธ๋ฌธ์œผ๋กœ ๋ณด๋‚ธ๋‹ค๋ฉด req.body์— ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. 

 

๐Ÿงƒ express.urlencoded

- ์ฃผ์†Œ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹

 

๐Ÿงƒ express.urlencoded({ extended: false })

- false์ด๋ฉด ๋…ธ๋“œ์˜ querystring ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ํ•ด์„ํ•˜๊ณ , true์ด๋ฉด qs ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ํ•ด์„ํ•œ๋‹ค. 

- URL-encoded ํ˜•์‹์œผ๋กœ name=zerocho&book=nodejs๋ฅผ ๋ณธ๋ฌธ์œผ๋กœ ๋ณด๋‚ธ๋‹ค๋ฉด req.body์— { name: 'zerocho', book: 'nodejs' }๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

 

๐Ÿ“Œ qs ๋ชจ๋“ˆ

 

- ๋‚ด์žฅ ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ npm ํŒจํ‚ค์ง€์ž„

- querystring์„ ๋” ํ™•์žฅํ•œ ๊ฒƒ

- ์„ค์น˜ ๋ฐฉ๋ฒ•

npm i install qs

 

 

๐Ÿ’š cookie-parser์˜ ๋ฏธ๋“ค์›จ์–ด 

- ๋™๋ด‰๋œ ์ฟ ํ‚ค๋ฅผ ํ•ด์„ํ•ด req.cookies ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟˆ

 

cookie-parser ๋ฏธ๋“ค์›จ์–ด ํ˜•ํƒœ

app.use(cookieParser(๋น„๋ฐ€ ํ‚ค));
app.use(cookieParser(process.env.COOKIE_SECRET));

 

-  name=zerocho ์ฟ ํ‚ค๋ฅผ ๋ณด๋ƒˆ๋‹ค๋ฉด req.cookies๋Š” { name: 'zerocho' }์ž„ 

- ์„œ๋ช…์ด ๋ถ™์œผ๋ฉด, name=zerocho.sign์ด ๋˜๊ฒŒ ๋˜๊ณ  req.signedCookies ๊ฐ์ฒด์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋จ 

 

๐Ÿ“Œ ์ฟ ํ‚ค์˜ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ

// ์ฟ ํ‚ค ์ƒ์„ฑ
res.cookie('name', 'solarthenomad', { 
  expires: new Date(Date.now() + 900000),
  httpOnly: true, 
  secure: true,
});
//์ฟ ํ‚ค ์‚ญ์ œ
res.clearCookie('name', 'zerocho', { httpOnly: true, secure: true });

 

 

 

express-session ๋ฏธ๋“ค์›จ์–ด 

- express-session์€ ์„ธ์…˜ ๊ด€๋ฆฌ ์‹œ ํด๋ผ์ด์–ธํŠธ์— ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ธ๋‹ค. 

 

express-session ๋ฏธ๋“ค์›จ์–ด ํ˜•ํƒœ

app.use(session({
  resave: false, // resave : ์š”์ฒญ์ด ์˜ฌ ๋•Œ ์„ธ์…˜์— ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ƒ๊ธฐ์ง€ ์•Š๋”๋ผ๋„ ์„ธ์…˜์„ ๋‹ค์‹œ ์ €์žฅํ• ์ง€ ์„ค์ •ํ•˜๋Š” ๊ฒƒ
  saveUninitialized: false, //  saveUninitialized : ์„ธ์…˜์— ์ €์žฅํ•  ๋‚ด์—ญ์ด ์—†๋”๋ผ๋„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ธ์…˜์„ ์ƒ์„ฑํ• ์ง€ ์„ค์ •ํ•˜๋Š” ๊ฒƒ
  secret: process.env.COOKIE_SECRET, //  cookie-parser์˜ secret๊ณผ ๊ฐ™๊ฒŒ ์„ค์ •ํ•ด์ฃผ๊ธฐ
  cookie: { 
    httpOnly: true,
    secure: false, // secure= false๋กœ ํ•ด์„œ https๊ฐ€ ์•„๋‹Œ ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ, ๋ฐฐํฌ์‹œ์—๋Š” true๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ
  },
  name: 'session-cookie', //name ์„ค์ •์„ ์•ˆํ•ด์ฃผ๋ฉด ๊ธฐ๋ณธ ์„ธ์…˜ ์ด๋ฆ„์€ connect.sid์ด๋‹ค.
}));

- store๋ผ๋Š” ์˜ต์…˜๋„ ์žˆ๊ธดํ•œ๋ฐ,  ๋ฉ”๋ชจ๋ฆฌ์— ์„ธ์…˜์„ ์ €์žฅํ•˜๋„๋ก ํ•จ. ๊ทธ๋Ÿฐ๋ฐ ํ•œ ๋ฒˆ ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉด์„œ ์„ธ์…˜์ด ๋ชจ๋‘ ๋‚ ์•„๊ฐ„๋‹ค. โžก ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด store์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด ์„ธ์…˜์„ ์œ ์ง€ํ•˜๋Š”๋ฐ, redis๊ฐ€ ์‚ฌ์šฉ๋จ 

 

์„ธ์…˜ ์ƒ์„ฑ&์ œ๊ฑฐ

req.session.name = 'solarthenomad'; // ์„ธ์…˜ ๋“ฑ๋ก
req.sessionID; // ์„ธ์…˜ ์•„์ด๋”” ํ™•์ธ
req.session.destroy(); // ์„ธ์…˜ ๋ชจ๋‘ ์ œ๊ฑฐ

 

next ๋™์ž‘ ๊ตฌ์กฐ