웹프로그래밍/node.js
쿠키와 세션 구현하기
hyun_jo_o
2019. 8. 9. 15:10
쿠키 설정하기
const http = require('http');
const parseCookies = (cookie = '') =>
cookie
.split(';')
.map(v => v.split('='))
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
const server = http.createServer((req, res) => {
//req.headers.cookie
const cookies = parseCookies(req.headers.cookie);
console.log(req.url, cookies);
res.writeHead(200, { 'Set-Cookie': 'mycookie=test' });
res.end('Hello Cookie');
}).listen(8081);
server.on('listening', () => {
console.log('8081번 포트에서 서버 대기중입니다.');
});
server.on('error', (error) => {
console.error(error);
});
쿠키를 설정하고 라우터 분기 처리를 할 수 있다.
const http = require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');
const parseCookies = (cookie = '') =>
cookie
.split(';')
.map(v => v.split('='))
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
const server = http.createServer((req, res) => {
//req.headers.cookie
console.log(req.url, parseCookies(req.headers.cookie));
if (req.url.startsWith('/login')) { //요청주소가 login이면
const { query } = url.parse(req.url);
const {name } = qs.parse(query);
const expires = new Date();
expires.setMinutes(expires.getMinutes() + 5);
res.writeHead(302, { //다시 루트로 돌아가고
Location: '/', //cookie를 저장
'Set-Cookie': `name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
});
res.end();
} else if (cookies.name) { //cookie에 있으면
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(`${cookies.name}님 안녕하세요`);
} else {
fs.readFile('./server4.html', (err, data) => {
res.end(data);
});
}
}).listen(8081);
server.on('listening', () => {
console.log('8081번 포트에서 서버 대기중입니다.');
});
server.on('error', (error) => {
console.error(error);
});
쿠키를 저장할 수 있다.
쿠키는 뭘 설정했는지 다 보이기 때문에 보안에 취약해서 session을 쓰게된다.
메모리 세션 구현하기
const http = require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');
const parseCookies = (cookie = '') =>
cookie
.split(';')
.map(v => v.split('='))
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
const session = {};
const server = http.createServer((req, res) => {
const cookies = parseCookies(req.headers.cookie);
if (req.url.startsWith('/login')) {
const { query } = url.parse(req.url);
const { name } = qs.parse(query);
const expires = new Date();
expires.setMinutes(expires.getMinutes() + 5);
const randomInt = Date.now();
session[randomInt] = {
name,
expires,
};
res.writeHead(302, {
Location: '/',
'Set-Cookie': `session=${randomInt}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
});
res.end();
} else if (cookies.session && session[cookies.session] && session[cookies.session].expires > new Date()) {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(`${session[cookies.session].name}님 안녕하세요`);
} else {
fs.readFile('./server4.html', (err, data) => {
res.end(data);
});
}
}).listen(8081);
server.on('listening', () => {
console.log('8081번 포트에서 서버 대기중입니다.');
});
server.on('error', (error) => {
console.error(error);
});
세션은 서버(메모리)에 저장이 되고 그 세션에 접근할 수 있는 랜덤값을 쿠키에 저장해서 접근 할 수 있도록 한다.
이렇게 하면 세션의 값을 알 수 없다.