๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[http ๋ชจ๋๋ก ์๋ฒ] (3) ์๋ฒ์์ ์ฟ ํค ๋ง๋ค์ด ์์ฒญ์์ ๋ธ๋ผ์ฐ์ ์ ๋ฃ๊ธฐ + ์ธ์ ์ฟ ํค ๋ณธ๋ฌธ
[http ๋ชจ๋๋ก ์๋ฒ] (3) ์๋ฒ์์ ์ฟ ํค ๋ง๋ค์ด ์์ฒญ์์ ๋ธ๋ผ์ฐ์ ์ ๋ฃ๊ธฐ + ์ธ์ ์ฟ ํค
์ง์ง์ํ์นด 2023. 4. 19. 00:22<๋ณธ ๋ธ๋ก๊ทธ๋ 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๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ์ค ์
๋๋ค.");
})