๐4์ฅ ํค์๋๐
http ๋ชจ๋
header, body
REST
์ฟ ํค, ์ธ์
http2
ํด๋ฌ์คํฐ
์ค์ ๋ก ๋์๊ฐ๋ ์๋ฒ๋ฅผ ๋ง๋ค๊ณ , ์๋ฒ ๋์์ ํ์ํ ์ฟ ํค์ ์ธ์ ์ฒ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ณ ์์ฒญ ์ฃผ์ ๋ผ์ฐํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ๊ฒ์ ๋๋ค.
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(8080, () => { // ์๋ฒ ์ฐ๊ฒฐ
console.log('8080๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
๐ localhost
localhost๋ ํ์ฌ ์ปดํจํฐ์ ๋ด๋ถ ์ฃผ์์ด๋ฉฐ, ์์ ์ ์ปดํจํฐ์์๋ง ์ ๊ทผํ ์ ์์ต๋๋ค. 127.0.0.1์ ์ฃผ์๋ก ์ฌ์ฉํด๋ ๊ฐ์ต๋๋ค.
๐ ํฌํธ
์๋ฒ ๋ด์์ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ๋ถํ๋ ๋ฒํธ์ด๋ฉฐ, 80๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฃผ์์์ ํฌํธ๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
const http = require('http');
const fs = require('fs').promises;
http.createServer(async (req, res) => { // ์์ฒญ์ด ๋ค์ด์ค๋ฉด
try {
const data = await fs.readFile('./server2.html'); // fs ๋ชจ๋๋ก HTML ํ์ผ์ ์ฝ๋๋ค
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(data);
} catch (err) {
console.error(err);
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(err.message);
}
})
.listen(8081, () => {
console.log('8081๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
HTTP ์์ฒญ ๋ฉ์๋ | ๋์ |
GET | ์๋ฒ ์์์ ๊ฐ์ ธ์ค๊ณ ์ ํ ๋ ์ฌ์ฉ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ๋ณด๋ผ ๋ ์ฟผ๋ฆฌ์คํธ๋ง ์ฌ์ฉ |
POST | ์๋ฒ์ ์์์ ์๋ก ๋ฑ๋กํ๊ณ ์ ํ ๋ ์ฌ์ฉ ์์ฒญ์ ๋ณธ๋ฌธ(body)์ ์๋ก ๋ฑ๋กํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ |
PUT | ์๋ฒ์ ์์์ ์์ฒญ์ ๋ค์ด ์๋ ์์์ผ๋ก ์นํ ์์ฒญ์ ๋ณธ๋ฌธ(body)์ ์นํํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ |
PATCH | ์๋ฒ ์์์ ์ผ๋ถ๋ง ์์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉ ์์ฒญ์ ๋ณธ๋ฌธ์ ์ผ๋ถ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ |
DELETE | ์๋ฒ์ ์์์ ์ญ์ ํ ๋ ์ฌ์ฉ |
OPTIONS | ์์ฒญ์ ํ๊ธฐ ์ ์ ํต์ ์ต์ ์ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉ |
const http = require('http');
const fs = require('fs').promises;
const path = require('path');
const users = {}; // ๋ฐ์ดํฐ ์ ์ฅ์ฉ
http.createServer(async (req, res) => { // HTTP ์์ฒญ ๋ฉ์๋ ๊ตฌ๋ถ
try {
if (req.method === 'GET') { // ๋ค์ ๊ตฌ๋ถ
if (req.url === '/') {
const data = await fs.readFile(path.join(__dirname, 'restFront.html'));
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
return res.end(data);
} else if (req.url === '/about') {
const data = await fs.readFile(path.join(__dirname, 'about.html'));
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
return res.end(data);
} else if (req.url === '/users') {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
return res.end(JSON.stringify(users));
}
// /๋ /about๋ /users๋ ์๋๋ฉด
try {
const data = await fs.readFile(path.join(__dirname, req.url));
return res.end(data);
} catch (err) {
// ์ฃผ์์ ํด๋นํ๋ ๋ผ์ฐํธ๋ฅผ ๋ชป ์ฐพ์๋ค๋ 404 Not Found error ๋ฐ์
}
} 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);
const id = Date.now();
users[id] = name;
res.writeHead(201, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('๋ฑ๋ก ์ฑ๊ณต');
});
}
} else if (req.method === 'PUT') {
if (req.url.startsWith('/user/')) {
const key = req.url.split('/')[2];
let body = '';
req.on('data', (data) => {
body += data;
});
return req.on('end', () => {
console.log('PUT ๋ณธ๋ฌธ(Body):', body);
users[key] = JSON.parse(body).name;
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
return res.end(JSON.stringify(users));
});
}
} else if (req.method === 'DELETE') {
if (req.url.startsWith('/user/')) {
const key = req.url.split('/')[2];
delete users[key];
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
return res.end(JSON.stringify(users));
}
}
res.writeHead(404);
return res.end('NOT FOUND');
} catch (err) {
console.error(err);
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(err.message);
}
})
.listen(8082, () => {
console.log('8082๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค');
});
const http = require('http');
http.createServer((req, res) => { // req ๊ฐ์ฒด์ ๋ด๊ฒจ ์๋ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์ด
console.log(req.url, req.headers.cookie); // ์ฟ ํค๊ฐ ๋ค์ด์๋ ์์น
res.writeHead(200, { 'Set-Cookie': 'mycookie=test' }); // ์๋ต์ ํค๋์ ์ฟ ํค๋ฅผ ๊ธฐ๋ก
res.end('Hello Cookie');
})
.listen(8083, () => {
console.log('8083๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
๐ / undefinded, /favicon.ico mycookie=test ๋ ๊ฐ๊ฐ ๊ธฐ๋ก๋ ์ด์
์ฒซ ๋ฒ์งธ ์์ฒญ(/)์ ๋ณด๋ด๊ธฐ ์ ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ ํ ์ฟ ํค ์ ๋ณด๋ ๊ฐ๊ณ ์์ง ์์ undefined๊ฐ ๊ธฐ๋ก๋์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ HTML์์ ํ๋น์ฝ์ด ๋ญ์ง ์ ์ถํ ์ ์์ผ๋ฉด ์๋ฒ์ ํ๋น์ฝ ์ ๋ณด์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค.
๋ ๋ฒ์งธ ์์ฒญ(/favicon.ico)์ ํค๋์ ์ฟ ํค๊ฐ ๋ค์ด ์์์ ํ์ธํ ์ ์์ต๋๋ค.
const http = require('http');
const fs = require('fs').promises;
const path = require('path');
const parseCookies = (cookie = '') => // ์ฟ ํค ๋ฌธ์์ด์ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ํ์์ผ๋ก ๋ณ๊ฒฝ
cookie
.split(';')
.map(v => v.split('='))
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
// GET /login ์ฒ๋ฆฌ ๋ถ๋ถ
http.createServer(async (req, res) => {
const cookies = parseCookies(req.headers.cookie); // { mycookie: 'test' }
// ์ฃผ์๊ฐ /login์ผ๋ก ์์ํ๋ ๊ฒฝ์ฐ
if (req.url.startsWith('/login')) {
const url = new URL(req.url, '<http://localhost:8084>');
const name = url.searchParams.get('name'); // name์ด๋ผ๋ Params๊ฐ ์๋์ง ์ฐพ๊ณ name์ ๋ฃ๋๋ค.
const expires = new Date();
// ์ฟ ํค ์ ํจ ์๊ฐ์ ํ์ฌ์๊ฐ + 5๋ถ์ผ๋ก ์ค์
expires.setMinutes(expires.getMinutes() + 5);
res.writeHead(302, { // 302 ์๋ต์ฝ๋, ๋ฆฌ๋ค์ด๋ ํธ ์ฃผ์์ ์ฟ ํค๋ฅผ ํค๋์ ๋ฃ๋๋ค.
Location: '/',
'Set-Cookie': `name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
});
res.end();
// name์ด๋ผ๋ ์ฟ ํค๊ฐ ์๋ ๊ฒฝ์ฐ
} else if (cookies.name) {
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(`${cookies.name}๋ ์๋
ํ์ธ์`);
} else { // ์ฟ ํค๊ฐ ์๋ค.
try {
const data = await fs.readFile(path.join(__dirname, '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๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
์ฟ ํค์๋ ํ๊ธ๊ณผ ์ค ๋ฐ๊ฟ์ ๋ฃ์ ์ ์์ผ๋ฉฐ, ํ๊ธ์ encodeURIComponent๋ก ๊ฐ์ธ์ ๋ฃ์ต๋๋ค.
๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ ์ํ์ง ์์ ๊ฒฝ์ฐ, ๋จผ์ ์ฟ ํค๊ฐ ์๋์ง ์๋์ง ํ์ธํฉ๋๋ค. ์ฟ ํค๊ฐ ์๋ค๋ฉด ๋ก๊ทธ์ธํ ์ ์๋ ํ์ด์ง๋ฅผ ๋ณด๋ด๊ณ , ์๋ค๋ฉด ๋ก๊ทธ์ธํ ์ํ๋ก ๊ฐ์ฃผํด ์ธ์ฌ๋ง์ ๋ณด๋ ๋๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฐฉ์์ ์ฟ ํค๊ฐ ๋ ธ์ถ๋์ด ์์ผ๋ฉฐ ์กฐ์๋ ์ํ์ด ์์ต๋๋ค.
session์ ์ฌ์ฉํด ์๋ฒ๊ฐ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋๋ก ํฉ์๋ค.
const http = require('http');
const fs = require('fs').promises;
const path = require('path');
const parseCookies = (cookie = '') =>
cookie
.split(';')
.map(v => v.split('='))
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
const session = {};
http.createServer(async (req, res) => {
const cookies = parseCookies(req.headers.cookie);
if (req.url.startsWith('/login')) {
const url = new URL(req.url, '<http://localhost:8085>');
const name = url.searchParams.get('name');
const expires = new Date();
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()) {
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(`${session[cookies.session].name}๋ ์๋
ํ์ธ์`);
} else {
try {
const data = await fs.readFile(path.join(__dirname, '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(8085, () => {
console.log('8085๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
๐ https ๋ชจ๋
์น ์๋ฒ์ SSL ์ํธํ๋ฅผ ์ถ๊ฐํ์ฌ ๋ณด์์ ๊ฐํํฉ๋๋ค.
์ธ์ฆํด ์ฃผ๋ ๊ธฐ๊ด์์ ๊ตฌ์ ํด์ผ ํฉ๋๋ค.
const https = require('https');
const fs = require('fs');
https.createServer({
cert: fs.readFileSync('๋๋ฉ์ธ ์ธ์ฆ์ ๊ฒฝ๋ก'),
key: fs.readFileSync('๋๋ฉ์ธ ๋น๋ฐํค ๊ฒฝ๋ก'),
ca: [
fs.readFileSync('์์ ์ธ์ฆ์ ๊ฒฝ๋ก'),
fs.readFileSync('์์ ์ธ์ฆ์ ๊ฒฝ๋ก'),
],
}, (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(443, () => {
console.log('443๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
๋ ธ๋์ http2 ๋ชจ๋์ SSL ์ํธํ์ ๋๋ถ์ด ์ต์ HTTP ํ๋กํ ์ฝ์ธ http/2๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
http/2๋ ์์ฒญ ๋ฐ ์๋ต ๋ฐฉ์์ด ๊ธฐ์กด http/1.1๋ณด๋ค ๊ฐ์ ๋์ด ํจ์ฌ ํจ์จ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ ๋๋ค.
โ cluster ๋ชจ๋์ ์ฑ๊ธ ํ๋ก์ธ์ค๋ก ๋์ํ๋ ๋ ธ๋๊ฐ CPU ์ฝ์ด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋์ ๋๋ค.
โ ์ฝ์ด ํ๋๋น ํ๋ก์ธ์ค ํ๋๊ฐ ๋์๊ฐ๊ฒ ํ์ฌ, ์ฝ์ด๋ฅผ ํ๋๋ง ์ฌ์ฉํ ๋์ ๋นํด ์ฑ๋ฅ์ด ๊ฐ์ ๋ฉ๋๋ค.
โ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ๋ชปํ๋ ๋จ์ ์ด ์์ต๋๋ค.
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`๋ง์คํฐ ํ๋ก์ธ์ค ์์ด๋: ${process.pid}`);
// CPU ๊ฐ์๋งํผ ์์ปค๋ฅผ ์์ฐ
for (let i = 0; i < numCPUs; i += 1) {
cluster.fork();
}
// ์์ปค๊ฐ ์ข
๋ฃ๋์์ ๋
cluster.on('exit', (worker, code, signal) => {
console.log(`${worker.process.pid}๋ฒ ์์ปค๊ฐ ์ข
๋ฃ๋์์ต๋๋ค.`);
console.log('code', code, 'signal', signal);
cluster.fork();
});
} else {
// ์์ปค๋ค์ด ํฌํธ์์ ๋๊ธฐ
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Cluster!</p>');
setTimeout(() => { // ์์ปค ์กด์ฌ๋ฅผ ํ์ธํ๊ธฐ ์ํด 1์ด๋ง๋ค ๊ฐ์ ์ข
๋ฃ
process.exit(1);
}, 1000);
}).listen(8086);
console.log(`${process.pid}๋ฒ ์์ปค ์คํ`);
}
ํด๋ฌ์คํฐ์๋ ๋ง์คํฐ ํ๋ก์ธ์ค์ ์์ปค ํ๋ก์ธ์ค๊ฐ ์์ต๋๋ค.
๋ง์คํฐ ํ๋ก์ธ์ค๋ CPU ๊ฐ์๋งํผ ์์ปค ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ณ , 8086๋ฒ ํฌํธ์์ ๋๊ธฐํฉ๋๋ค.
์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ง๋ค์ด์ง ์์ปค ํ๋ก์ธ์ค์ ์์ฒญ์ ๋ถ๋ฐฐํฉ๋๋ค.
๋น์นธ ์ฑ์ฐ๊ธฐ ๋ฌธ์ (๋น์นธ์ ๋๋๊ทธํด์ ์ ๋ต์ ๋งํ ๋ณด์ธ์!)
1. http ๋ชจ๋์ (createServer) ๋ฉ์๋๋ ์ธ์๋ก ์์ฒญ์ ๋ํ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฃ์ ์ ์์ผ๋ฉฐ, ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ๋งค๋ฒ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํฉ๋๋ค.
2. ์๋ต์ ๋ํ ์ ๋ณด๊ฐ ๊ธฐ๋ก๋๋ ๋ถ๋ถ์ (ํค๋)๋ผ๊ณ ํฉ๋๋ค. (ํค๋)์๋ 200, ์ฝํ ์ธ ํ์, charset ๋ฑ์ด ํฌํจ๋ ์ ๋ณด๊ฐ ์์ต๋๋ค.
3. ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ผ ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ ๋ถ๋ถ์ (๋ณธ๋ฌธ(body))์ด๋ผ๊ณ ํฉ๋๋ค. ๋ฌธ์์ด, ๋ฒํผ ๋ฑ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
4. (REST)๋ ์๋ฒ์ ์์์ ์ ์ํ๊ณ ์์์ ๋ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฆฌํต๋๋ค.
5. ์ฃผ์ ํ๋๋ ์์ฒญ ๋ฉ์๋๋ฅผ ํ๋๋ง ๊ฐ์ง ์ ์์ต๋๋ค. (O/X)
์ ๋ต : O
6. (์ฟ ํค)๋ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฌ์ธ์ง ์๋ณํ๊ธฐ ์ํด ์๋ฒ๊ฐ ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ๋ณด๋ด๋ ๊ฒ์ ๋๋ค.
7. (cluster) ๋ชจ๋์ ์ฑ๊ธ ํ๋ก์ธ์ค๋ก ๋์ํ๋ ๋ ธ๋๊ฐ CPU ์ฝ์ด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋์ ๋๋ค.
์ฝ๋ ๋ฌธ์
1. ๋น์นธ์ ๋ค์ด๊ฐ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์ธ์.
const http = require('http');
http.createServer((req, res) => {
res.{1๋ฒ ๋น์นธ}(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.{2๋ฒ ๋น์นธ}('<h1>Hello Node!</h1>');
res.{3๋ฒ ๋น์นธ}('<p>Hello Server!</p>');
})
.listen(8080, () => { // ์๋ฒ ์ฐ๊ฒฐ
console.log('8080๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
์ ๋ต : writeHead, write, end
2. ๋น์นธ์ ๋ค์ด๊ฐ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์ธ์.
const http = require('http');
const fs = require('fs').promises;
const path = require('path');
const parseCookies = (cookie = '') =>
cookie
.split(';')
.map(v => v.split('='))
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
const session = {};
http.createServer(async (req, res) => {
const cookies = parseCookies(req.{1๋ฒ ๋น์นธ});
if (req.url.startsWith('/login')) {
const url = new URL(req.url, '<http://localhost:8085>');
const name = url.searchParams.get('name');
const expires = new Date();
expires.setMinutes(expires.getMinutes() + 5);
const uniqueInt = Date.now();
session[uniqueInt] = {
name,
expires,
};
res.writeHead(302, {
Location: '/',
'Set-Cookie': `session=${{2๋ฒ ๋น์นธ}}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
});
res.end();
... ์๋ต
์ ๋ต : header.cookie, uniqueInt
[๋ ธ๋ 2] 6์ฅ. ์ต์คํ๋ ์ค ์น ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2023.11.10 |
---|---|
[๋ ธ๋ 2] 5์ฅ. ํจํค์ง ๋งค๋์ (0) | 2023.11.03 |
[๋ ธ๋ 2] 3์ฅ. ๋ ธ๋ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ (2) (0) | 2023.10.13 |
[๋ ธ๋ 2] 3์ฅ. ๋ ธ๋ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ (1) (1) | 2023.10.06 |
[๋ ธ๋ 2] 2์ฅ. ์์๋ฌ์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ (0) | 2023.09.29 |