-
쿠키와 세션 구현하기웹프로그래밍/node.js 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); });
세션은 서버(메모리)에 저장이 되고 그 세션에 접근할 수 있는 랜덤값을 쿠키에 저장해서 접근 할 수 있도록 한다.
이렇게 하면 세션의 값을 알 수 없다.
'웹프로그래밍 > node.js' 카테고리의 다른 글
http 모듈 (0) 2019.08.08 예외처리 (0) 2019.08.08 events모듈 (0) 2019.08.08 util 모듈 && fs 모듈 (0) 2019.08.07 path모듈 && url모듈 && crypto모듈 (0) 2019.08.07 댓글