웹프로그래밍/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);
});

세션은 서버(메모리)에 저장이 되고 그 세션에 접근할 수 있는 랜덤값을 쿠키에 저장해서 접근 할 수 있도록 한다.

이렇게 하면 세션의 값을 알 수 없다.