• Home
  • About
    • Lajancia Workspace photo

      Lajancia Workspace

      .

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Tumblr
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects
  • Record
  • Blender
  • Blockchain

Node.js cookie

22 Oct 2021

Reading time ~1 minute

Node.js Cookie


서버는 누가 요청을 보냈는지 모름

따라서 로그인을 통해 누가 요청을 했는지 알아야 함

쿠키와 세션이 필요

쿠기

  • 키=값의 쌍
  • 매 요청마다 서버에 동봉해서 보냄
  • 서버는 쿠키를 읽어 누구인지 파악

1. 서버 → 쿠키

const http = require('http')
http.createServe((req,res)=>{
	console.log(req.url,req.headers.cookie);
	res.writeHead(200,{'Set-cookie':'mycookie=test'});
	res.end('Hello Cookie');
})
.listen(8083,()=>{
console.log('8083에서 대기중');
});

쿠키확인: Application → cookies에서 확인 가능

  • 세션: 쿠키의 만료기간이 존재한다.
  • 일반 웹사이트를 이용했을 때 며칠 뒤에 자동으로 로그아웃되어있는 것은 쿠키가 만료되었기 때문이다.

2. 쿠키 → js

const http = require('http');
const fs = require('fs').promises;
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;
    }, {});

http.createServer(async (req, res) => {
  const cookies = parseCookies(req.headers.cookie); // { mycookie: 'test' }
  // 주소가 /login으로 시작하는 경우
  if (req.url.startsWith('/login')) {
    const { query } = url.parse(req.url);
    const { name } = qs.parse(query);
    const expires = new Date();
    // 쿠키 유효 시간을 현재시간 + 5분으로 설정
    expires.setMinutes(expires.getMinutes() + 5);
    res.writeHead(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('./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번 포트에서 서버 대기 중입니다!');
  });
  • 현재에는 5분으로 지정되어있다.
  • 한글과 같은 경우 쿠키로 넘겼을 때 에러가 발생할 수 있기 때문에 encodeURIComponent 를 통해 변형시켜주어야 한다.


backendcookienode.js Share Tweet +1