ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠키와 세션 구현하기
    웹프로그래밍/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

    댓글

Designed by Tistory.