간단한 쿠키 예제에서 막혔습니다. ㅜㅜㅜㅜ

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);
    
 
  // 주소가 /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번 포트에서 서버 대기 중입니다!');
  }); 

여기서… parseCookies함수에서 매개변수로 cookie=’’ 이렇게 초기화 하는데 이렇게 하는 이유가 뭔가요? 맨처음 실행할때 쿠키에 값이 없기 때문에 이렇게 한느건가요??

그리고 밑에보면 .split(’;’)되어있는데 개발자 도구 들어가서 요청의 쿠키값 확인해보면 쿠키로 전달되는 값은 {name: xxx}이거 밖에 없는데… 왜 ;이걸로 분리시키나요??
혹시 요청갈때에도 쿠키에 Set-Cookie에 담은 값들 expires나… httpOnly 이런애들 다 같이 가나요?

  1. ParseCookies 함수에서 cookie = ‘’ 하는 이유

답변 : default 한 값을 넣어주려고 하기 때문입니다. 지금 코드상에서 cookies가 createServer 함수의 상단에 존재하는데, 클라이언트가 최초 ‘/’ path 진입시 req.headers.cookie는 쿠키를 한번도 주지 않은 상태이기에 undefined 입니다. 그렇기에 전달 받는 인자는 .split메서드 이하의 메서드가 존재하지 않고, 이를 강제실행 하려 했기 때문에 Error가 발생합니다. 그러나 파라메터를 위와 같이 작성하게 되면 전달 받은 인자가 undefined경우 @param cookie는 ‘’ string type이 됩니다. 그래서 에러를 발생시키지 않고 빈 문자열이 return 됩니다. 즉 전달 받은 인자가 공백인 경우 에러를 방지 하기 위해 디폴트 값을 적용한 겁니다.

  1. .split 으로 되어 있는데 ; 이걸로 무엇을 하나요 ?

복수의 쿠키를 적용하여 볼까요 ?

res.writeHead(302, {
      Location: '/',
      'Set-Cookie': [`name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
      'test=test'
    ],
    });

이렇게 복수의 cookie를 전송하고 다시 요청을 받아보면 console.log(req.headers.cookie)의 결과는 name=%22jong%22; test=test 이렇게 나옵니다. split 메서드로 ';'로 구분짓는 이유는 ';'으로 헤더에 딸려온 쿠키를 구분 짓기 위함임을 알 수 있겠죠 ?

  1. http only expires 옵션도 같이 오나요 ?

브라우저에서 관리하는 것들이라 같이 오지 않는걸로 알고 있습니다. 만약 expires같은 옵션을 확인해야 할 필요가 있다면 jwt토큰 같이 보안이 잘되어 있는 json을 사용해보시길 권장드립니다.

끝으로 혹시라도 다른 이의 코드에서 해당 변수의 쓰임새 혹은 타입이 무엇인지 모르겠다면 구간 마다 console.log로 확인해보시며 공부하시길 권장드립니다 &^^

아… 감사드립니다.!! 콘솔로 다찍어보면서 했는데 split으로 구분짓는 이유를 몰랐거든요
정말 정말 감사합니다!!!