...

๋ ธ๋ - cookie ๋ค๋ฃจ๊ธฐ
์ ๋ ธ๋์์ http ๋ชจ๋์ ์ธ๋๋, ์ด๋ ๊ฒ ์ผ์ผํ ์ฟ ํค ์ค์ ์ ์ฝ๋ฉํด ์ค์ผ ํ์๋ค.
// ์ฟ ํค ๋ฌธ์์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํ๋ ํจ์
const parseCookies = (cookie = '') =>
cookie
.split(';')
.map(v => v.split('='))
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
http
.createServer(async (req, res) => {
// ๋จผ์ ์ ์ฅ๋์ด์๋ ์ฟ ํค๊ฐ ์๋์ง ์๋์ง ๊ฒ์ฌ
const cookies = parseCookies(req.headers.cookie); // ๋ณํ -> { mycookie: 'test' }
// form์์ action์ด /Login์ผ๋ก, submitํ๋ฉด ๋ฐ๋
if (req.url.startsWith('/login')) {
const { query } = url.parse(req.url); // url์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด queryํค๋ง ๋นผ์ด
const { name } = qs.parse(query); // queryํค์ ๊ฐ์ธ ๋ฌธ์์ด์ ๋ ๊ฐ์ฒดํํด์ nameํค๋ง ๋นผ์ด. ์ด ๊ฐ์ ์ฟ ํค์ ์ ์ฅ๋ ๊บผ์
const expires = new Date();
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์ด๋ผ๋ ์ฟ ํค๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ก๊ทธ์ธ ๋ ๊ฒฝ์ฐ
Express - cookie-parser
์ฟ ํค ์ฝ๊ธฐ/์ฐ๊ธฐ
cookie-parser๋ ์์ฒญ๊ณผ ํจ๊ป ๋ค์ด์จ ์ฟ ํค๋ฅผ ํด์ํ์ฌ ๊ณง๋ฐ๋ก req.cookies๊ฐ์ฒด๋ก ๋ง๋ ๋ค.
์์์๋ ๋ฐ๋ก ์ฟ ํค๋ฅผ ํ์ฑํด์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ์จ์ผ ํ์๋๋ฐ, ์ด ๋ถ๋ถ์ด ์๋ต๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํจ ๊ธฐ๊ฐ์ด ์ง๋ ์ฟ ํค๋ ์์์ ๊ฑธ๋ฌ๋ธ๋ค.
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const app = express();
app.set('port', process.env.PORT || 3000);
app.use(cookieParser()); // get์์ฒญ์ด ์ค๋ฉด uri๋ณ์๋ค์ด ํ์ฑ๋์ด req.cookies๊ฐ์ฒด์ ์ ์ฅ๋๋ค.
app.get('/', (req, res) => {
// ์ฟ ํค ์ฝ๊ธฐ
if (req.cookies) {
console.log(req.cookies) // { mycookie: 'test'}
} else { // ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋ ์ฟ ํค๊ฐ ์๋ค๋ฉด
// ์ฟ ํค ์ฐ๊ธฐ
// 'Set-Cookie': `name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
res.cookie('name', encodeURIComponent(name), {
expires: new Date(),
httpOnly: true,
path: '/',
})
}
res.send('Hello, index');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
์ฝ๋ ๋ฌธ๋ฒ๋ง ๋ค๋ฅด์ง ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฟ ํค ์๋ฆฌ์ ๊ฐ๋ค.
์ express ์ฟ ํค ํ์์์ ์ ๋ฐ์์ผ๋ก ์ฐ๋์ง๋ ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ฉด ์ฟ ํค ์๋ฆฌ์ ๋ํด ์๋ฒฝํ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
[JS] ๐ ์ฟ ํค(Cookie) ๐ช ๋ค๋ฃจ๊ธฐ
์ ํ ํ์ต [WEB] ๐ ์ฟ ํค / ์ธ์ ์ ๋ฆฌ ๋น์ฐ๊ฒฐ์ฑ(Connectionless)๊ณผ ๋น์ํ์ฑ(Stateless) HTTP ํ๋กํ ์ฝ์๋ ๋น์ฐ๊ฒฐ์ฑ(Connectionless)๊ณผ ๋น์ํ์ฑ(Stateless)์ด๋ผ๋ ํน์ง์ด ์์ต๋๋ค. ์ด๋ ์๋ฒ์ ์์์ ์ ์ฝํ..
inpa.tistory.com
์ฟ ํค ์ฝ๊ธฐ
app.use(cookieParser());
console.log(req.cookies)
์ฌ์ฉ๋ฒ์ cookieParser() ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ค
์ด๋ฒ์์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์๋ฌด๊ฒ๋ ๋ฃ์ง ์์์ง๋ง, ์๋ช ๋ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋งค๊ฐ๋ณ์์ ๋น๋ฐํค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๊ฒ์ฆ์ ํ๋ค
cookieParser๋ฅผ ํตํด ํด์๋ ์ฟ ํค๋ req.cookies๋ฅผ ํตํด ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค
์ฟ ํค ์ฐ๊ธฐ(๋ง๋ค๊ธฐ)
์ฟ ํค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์๋ res.cookie๋ฅผ ํตํด ๋ง๋ค๋ฉฐ res.cookie(ํค, ๊ฐ, ์ต์ ) ์ ํํ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
์ฟ ํค ์ต์
- maxAge : ๋ง๋ฃ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ค์
- expires : ๋ง๋ฃ ๋ ์ง๋ฅผ GMT ์๊ฐ์ผ๋ก ์ค์
- path : ์ฟ ํค์ ๊ฒฝ๋ก ๋ํดํธ ๊ฐ์ "/"
- domain : ๋๋ฉ์ธ ๋ค์ ๋ํดํธ ๊ฐ์ "loaded"
- secure : https์์๋ง ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค
- httpOnly : ์น์๋ฒ๋ฅผ ํตํด์๋ง ์ฟ ํค์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค
- signed : ์ฟ ํค์ ๋ํ ์๋ช ์ ์ง์ ํ๋ค
res.cookie('name', 'beomseok', {
expires: new Date(Date.now() + 900000),
httpOnly: true,
secure: true
});
์ต์ ์ค signed๋ผ๋ ์ต์ ์ด ์๋๋ฐ, ์ด๋ฅผ true๋ก ์ค์ ํ๋ฉด ์ฟ ํค ๋ค์ ์๋ช ์ด ๋ถ๋๋ค.
๋ด ์๋ฒ๊ฐ ์ฟ ํค๋ฅผ ๋ง๋ค์๋ค๋ ๊ฒ์ ๊ฒ์ฆํ ์ ์์ผ๋ฏ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋ช ์ต์ ์ ํค๋ ๊ฒ์ด ์ข๋ค.
์๋ช ์ ์ํ ๋น๋ฐ ํค๋ cookieParser ๋ฏธ๋ค์จ์ด์์ ์ธ์๋ก ๋ฃ์ process.env.COOKIE_SECRET์ด ๋๋ค.
์ฟ ํค ์ญ์
์ฟ ํค๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์๋res.clearCookie ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฟ ํค๋ฅผ ์ง์ฐ๋ ค๋ฉด ํค, ๊ฐ, ์ต์ ๋ ์ ํํ ์ผ์นํด์ผ ์ง์์ง๋ค (expires๋ maxAge ์ ์ธ).
res.clearCookie('name', 'beomseok', {
httpOnly: true,
secure: true
});
์ธ์ฆ(์๋ช )๋ ์ฟ ํค
cookieParser() ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋น๋ฐ ํค๋ฅผ ๋ฃ์ด์ค ์ ์๋ค.
์๋ช ๋ ์ฟ ํค๊ฐ ์๋ ๊ฒฝ์ฐ, ์ ๊ณตํ ๋น๋ฐ ํค๋ฅผ ํตํด ํด๋น ์ฟ ํค๊ฐ ๋ด๊ฐ ๋ง๋ ์ฟ ํค์์ ๊ฒ์ฆํ ์ ์๋ค.
์ฟ ํค๋ ํด๋ผ์ด์ธํธ์์ ์์กฐํ๊ธฐ ์ฌ์ฐ๋ฏ๋ก, ๋น๋ฐ ํค๋ฅผ ํตํด ๋ง๋ค์ด๋ธ ์๋ช ์ ์ฟ ํค ๊ฐ ๋ค์ ๋ถ์ด๋ ๊ฒ์ด๋ค.

true๋ก ์ค์ ๋ 'singed'์ต์ ์ ํฌํจํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๊ทธ ํ์ res.cookie()๋ cookieParser(secret)์ ์ ๋ฌ๋ ์ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์๋ช ํ๋ค.
์ดํ์ req.signedCookie ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
์๋ช ์ด ๋ถ์ผ๋ฉด ์ฟ ํค๊ฐ name=name.sign ํํ๊ฐ ๋๋ค.
๋ํ ์๋ช ๋ ์ฟ ํค๋ req.cookies ๋์ req.signedCookies ๊ฐ์ฒด์ ๋ค์ด๊ฐ๋ค.
req.signedCookies์ ์์ฒญ์ ์ํด ์๋ช ๋์ง ์๊ณ ์ฌ์ฉํ ์ค๋น๊ฐ ๋ ์ฟ ํค๋ฅผ ๋ณด๋ผ ๋ ์๋ช ์ ํฌํจํ๋ค.
์๋ช ๋ ์ฟ ํค๋ ๊ฐ๋ฐ์์ ์๋๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํด์๋ค
์ฟ ํค์ ์๋ช ํ๋ ๊ฒ์ ์จ๊ธฐ๊ฑฐ๋ ์ํธํํ๋ ๊ฒ์ด ์๋๋ผ ๊ทธ์ ๊ฐ์ญ์ ๊ฐ๋จํ๊ฒ ๋ฐฉ์งํ๋ ๊ฒ์ด๋ค.(์๋ช ์ ์ฌ์ฉํ๋ ๋น๋ฐ ํค๋ ๋น๊ณต๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.)
์๋ช ํ์ง ์์ ์ฟ ํค๋ฅผ ๋ณด๋ด๋ฉด ์์ฑ์ ๊ธฐ๋ณธ ๊ฐ์ ๋น ๊ฐ์ฒด๋ก ์ค์ ๋๋ค.
// ์ฟ ํคํ์์ ๋น๋ฐํค๋ฅผ ๋ฃ์ด ์์ฒญ์จ ์ฟ ํค๊ฐ์ด ๋ด๊ฐ ์๋ช
ํ ์ฟ ํค์ธ์ง ํ์
ํ๋ค.
// ์ํธ ํค๋ฅผ ์์ฑํ๋ ๊ฒ์๋ ํฌ๊ฒ ๊ท๊ฒฉ์ด ์์ผ๋ฉฐ ๊ฐ๋ฐ์์ ์์ ์ด๋ค. ๋จ ์ฝ๊ฒ ์ ์ถํ ์ ์๋ ๊ฐ์ ์ฌ์ฉํ์ง ๋ง์.
app.use(cookieParser(process.env.COOKIE_SECRET));
app.get('/', (req, res) => {
req.signedCookies // ์๋ช
๋ ์ฟ ํค ๋ฐ์ดํฐ
});
์๋ช ๋ ์ฟ ํค๋ฅผ ๊ฐ์ธ ์ ์ฅ์๋ก ํ์ฉํ๊ธฐ
ํด๋ผ์ด์ธํธ์ count์ ๋ณด๋ฅผ ์ฟ ํค๋ฅผ ์ ์ฅ์๋ก ์ด์ฉํด ์ฌ์ฉํด๋ณด์


cookieParser()๊ฐ์ฒด๋ฅผ ์ฌ์ฉ์ ์ธํ ๋ ์ธ์๋ก ์๋ช ์ ์ํ ์ํธ ํค๋ฅผ ์ ๋ฌํ์.
์ธ์์ ์ํธ ํค๋ฅผ ์์ฑํ๋ค๋ฉด ์์ผ๋ก ์๋ช ๋ ์ฟ ํค๋ฅผ ์์ฑํ๊ณ ํ์ฉํ ๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ PC๋ง ์์๋ณผ ์ ์๋๋ก ํต์ ํ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ req.signedCookies ๊ฐ์ฒด๋ก ๋ค์ด์, countํค๋ฅผ ๊ฒ์ฌํ๊ณ ๊ฐ์ ์ ๋ฐ์ดํธ ํ๋ค.
ํด๋ผ์ด์ธํธ์๊ฒ์ ์ ๋ฌ๋ฐ์ ์๋ช ๋ ์ฟ ํค ์ ๋ณด์ ์ ๊ทผํ๊ธฐ ์ํด์๋ req.signedCookies ์์ฑ์ ํตํด ์ ๋ณด์ ์ ๊ทผํด์ผํ๋ค๋ ๊ฒ์ ์์ง ๋ง์.
๋ง์ฝ req.cookies๋ก ์ ๊ทผํ๋ค๋ฉด undefined ํน์ ๋น ๋ฐ์ดํฐ๊ฐ ๊ฐ์ผ๋ก ๋ฐํ๋๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ด๋ค.
count ๊ฐ์ ์ ๋ฐ์ดํธํ์ผ๋ฉด ๋ค์ ํด๋ผ์ด์ธํธ์ ์ ๋ฐ์ดํธํ ์ฟ ํค ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค.
res.cookie()๋ฅผ ํตํด ์ฟ ํค๋ฅผ ์์ฑํ ๋ ๊ฐ์ฒด ์ต์ ์ผ๋ก singed๋ฅผ true๋ก ์ค์ ํ๋ฉด ์๋ช ๋ ์ฟ ํค๋ฅผ ์์ฑํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
์ด์ /count URL๋ก ์ ์ํด๋ณด์.

๊ฐ์ singedCookies ์์ฑ์ ํตํด ์ฟ ํค ์ ๋ณด์ ์ ๊ทผํ๊ณ ๊ฐ์ count ๋ณ์์ ๋ด์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ ํ๋ฉด์ ์ถ๋ ฅํ์ ๋๋ ์ฟ ํค์ ์ ์ฅ๋๋ ์์ํ ๊ฐ์ด ์ถ๋ ฅ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด Networkํญ์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ PC๊ฐ ํต์ ํ ์ฟ ํค ํ์ผ ์ ๋ณด๋ฅผ ์ด์ด๋ณด์.

Request Headers์ Cookie ์ ๋ณด์ Response Headers์ Set-Cookie ์ ๋ณด๋ฅผ ๋ณด๋ฉด ,
์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฐ์ดํฐ๋ก ๋ณ์กฐํ์ฌ ์๋ฒ PC์ ํด๋ผ์ด์ธํธ PC๋ง์ด ํต์ ํ ์ ์๋ ์ํธ๊ท์น์ผ๋ก ์ ๋ณด๋ฅผ ํต์ ํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ฐ๋ผ์ ํด์ปค๋ ํ๋ฉด์ ์ถ๋ ฅ๋๋ ๊ฐ์ด ์ฟ ํค์ ์ ์ฅ๋๋ ๊ฐ์ธ์ง ์ฝ๊ฒ ํ๋จํ ์ ์๊ณ ์ด๋ค ์ ๋ณด๋ฅผ ์๋ฏธํ๋์ง ์ ์ถํ ์๊ฐ ์๊ฒ ๋๋ค.
๋น๋ฐํค๋ฅผ ์๋ฒ ์ด๋๊ฐ์ ์ ์ฅํด๋๊ณ ์น๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์ฟ ํค๊ฐ์ด ์ค๋ฉด ์ด๋ฅผ ๋ณตํธํํด ์ฟ ํค์ ๋ณด๋ฅผ ์ป๋ ๋ฐฉ์์ผ๋ก ํํ๋ค. ์์ธํ๊ฑด ์๋ฐฉํฅ ์ํธํ ์๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ์
body-parser
์์ฒญ์ ๋ณธ๋ฌธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํด์ํ์ฌ req.body ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ฃผ๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
๋ณดํต ํผ ๋ฐ์ดํฐ ๋๋ AJAX ์์ฒญ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋ฌ๋ ๋ฉํฐํํธ (์ด๋ฏธ์ง, ๋์์. ํ์ผ) ๋ฐ์ดํฐ๋ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค. ๊ทธ ๊ฒฝ์ฐ multer ๋ชจ๋์ ์ฌ์ฉํ๋ค.
http๋ชจ๋ ๋ฐฉ์์ ์ผ์๋์๋, ํ๋ํ๋ ์คํธ๋ฆผ์ผ๋ก ๋ฐ์์ ํ์ฑํด์ name๊ฐ์ ๊บผ๋ด์คฌ์ด์ผ ํ์ง๋ง,
...
} else if (req.method === 'POST') {
if (req.url === '/user') {
let body = '';
// ์์ฒญ์ body๋ฅผ stream ํ์์ผ๋ก ๋ฐ์
req.on('data', data => {
body += data;
});
// ์์ฒญ์ body๋ฅผ ๋ค ๋ฐ์ ํ ์คํ๋จ
return req.on('end', () => {
console.log('POST ๋ณธ๋ฌธ(Body):', body);
const { name } = JSON.parse(body); // name์ ํด๋ผ์ด์ธํธ์์ ํผ ์ ์กํ ๋ ๋ณด๋ธ ๊ฐ์ฒด๋ค.
const id = Date.now();
users[id] = name;
res.writeHead(201, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('ok');
});
}
body.parser()ํน์ express์์ ๋ด์ฅ๋ ๋ฐ๋ํ์๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ฐ๋จํ๊ฒ ๋ฝ์ ๋ผ์๊ฐ ์๋ค.
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const app = express();
app.set('port', process.env.PORT || 3000);
app.use(express.json()); // ํด๋ผ์ด์ธํธ์์ application/json ๋ฐ์ดํฐ๋ฅผ ๋ณด๋์๋ ํ์ฑํด์ body ๊ฐ์ฒด์ ๋ฃ์ด์ค
app.use(express.urlencoded({ extended: true })); // ํด๋ผ์ด์ธํธ์์ application/x-www-form-urlencoded ๋ฐ์ดํฐ๋ฅผ ๋ณด๋์๋ ํ์ฑํด์ body ๊ฐ์ฒด์ ๋ฃ์ด์ค
app.get('/', (req, res) => {
req.body.name // ์์ ๋ฐ๋ํ์ ๋ฏธ๋ค์จ์ด ๋๋ถ์ ์ฌ์ฉํ ์ ์๋ค.
res.send('Hello, index');
});
html์ form ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ post/get ๋ฐฉ์์ผ๋ก ์์ฒญํ๊ฑฐ๋, ajax ๋ฑ์ ์์ฒญ์ ํ ๋ 'application/x-www-form-urlencoded' ํ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ค๊ฒ ๋๋ค.
์ด ๋ฐ์ดํฐ๋ฅผ express.urlencoded()๋ก ํ์ฑํด์ body ๊ฐ์ฒด์ ๋ฃ์ด ๊ฐ๋ฐ์๊ฐ ๊ฐํธํ๊ฒ ํผ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ญ์ ์๋ฒ์ ์๋ฒ๋ก ์์ฒญํ์๋ ๋ณดํต JSON ํ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ๋๋๋ฐ, application/json ํ์ ์ ๋ฐ์ดํฐ๋ก ์ค๊ฒ๋๋ค.
์ด ๋ฐ์ดํฐ๋ฅผ express.json()์ผ๋ก ํ์ฑํด ๋body ๊ฐ์ฒด์ ๋ฃ์ด ๊ฐ๋ฐ์๊ฐ ๊ฐํธํ๊ฒ ํผ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
body-parser๋ ์ต์คํ๋ ์ค 4.16.0 ๋ฒ์ ๋ถํฐ ์ผ๋ถ ๊ธฐ๋ฅ์ด ์ต์คํ๋ ์ค์ ๋ด์ฅ๋๊ฒ ๋์๋ค.
์๋ฅผ ๋ค์ด ์์์ ์ฌ์ฉํ express.json ๊ณผ express.urlencoded ํ์ ์ธ์,
Raw, Text ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ํด์ํ๊ณ ์ถ์ ๋, body-parser๋ฅผ ์ค์นํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
Raw๋ ์์ฒญ์ ๋ณธ๋ฌธ์ด ๋ฒํผ ๋ฐ์ดํฐ์ผ ๋,
Text๋ ํ ์คํธ ๋ฐ์ดํฐ์ผ ๋ ํด์ํ๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
URL-encoded๋ ์ฃผ์ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์์ด๋ค. ํผ ์ ์ก์ URL-encoded ๋ฐฉ์์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
urlencoded ๋ฉ์๋๋ฅผ ๋ณด๋ฉด { extended: false } ๋ผ๋ ์ต์ ์ด ๋ค์ด์๋๋ฐ,
์ด ์ต์ ์ด false๋ฉด ๋ ธ๋์ querystring ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ์คํธ๋ง์ ํด์ํ๊ณ ,
true๋ฉด qs ๋ชจ๋ (npm ํจํค์ง ์ค ํ๋) ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ์คํธ๋ง์ ํด์ํ๋ค.
qs๋ querystring์ ๊ธฐ๋ฅ์ ํ์ฅํ ๋ชจ๋์ด๋ค.
๊ฐ๋ฅํ extended : true๋ก ๋๋์.
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.