cookieParser

node에서 쿠키 파싱을 도와주는 라이브러리

// 쿠키 문자열을 자바스크립트 객체로 변환하는 함수
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' }

      // form에서 action이 /Login으로, submit하면 발동
      if (req.url.startsWith('/login')) {
      
         const { query } = url.parse(req.url); // url을 객체로 만들어 query키만 빼옴
         const { name } = qs.parse(query); // query키의 값인 문자열을 또 객체화해서 name키만 빼옴. 이 값은 쿠키에 저장될꺼임

         const expires = new Date();
         expires.setMinutes(expires.getMinutes() + 5);

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


      } else if (cookies.name) { // name이라는 쿠키가 있는 경우, 로그인 된 경우

쿠키를 직접 parsing 해줘야한다.

cookie-parser은 http 요청과 함께 들어온 쿠키를 해석하여 곧바로 req.cookies 객체로 만든다.
유효기간이 지난 쿠키는 알아서 걸러낸다.

쿠키 읽기

cookParser() 함수를 미들웨어로 등록한다.

app.use(cookieParser());
console.log(req.cookies)

http 요청이 들어오면 uri 변수들이 파싱되어 req.cookies 객체에 저장된다.

서명된 쿠키를 사용하는 경우 매개변수에 비밀키를 넣어주면 검증을 한다.

쿠키 쓰기

res.cookie(키, 값, 옵션)

형태로 쿠키를 만들 수 있다.
cookies 객체와 cookie 메서드 헷갈리게 네이밍 했네

쿠키 옵션

signed 옵션을 ture로 설정하면 쿠키 뒤에 서명이 붙는다.
cookieParser() 에 인수로 넣은 process.env.COOKIE_SECRET이 된다.

쿠키 삭제

res.colearCookie(키 ,값, 옵션) 으로 쿠키 제거
키, 값, 옵션이 정확히 일치해야 한다.

res.clearCookie('name', 'beomseok', { 
	httpOnly: true, 
	secure: true 
});

인증(서명된) 쿠키

cookieParser() 의 인수로 비밀키를 넣어줄 수 있다.
쿠키가 위조되지 않게 서명하는 것이다.

res.cookie('name', 'tobi', { signed : true });

signed 옵션을 true로 설정하면 cookieParser(secret)에 전달된 암호를 사용하여 값을 서명한다.

서명된 쿠키는 req.cookies 대신에 req.signdedCookies 객체에 들어간다.

서명된 쿠키를 개인저장소로 활용하기

서명된 쿠키를 storage처럼 사용할 수도 있다.
예를 들어 사이트에 방문하는 횟수를 클라이언트에서 저장하는데 사용될 수 있다.

app.use(cookieParser("secret"));
app.get("/count",(req,res)=>{
	let count=0;
	if(req.signedCookies.count){
		count = parseInt(req.signedCookies.count);
	}
	count+= 1;
	res.cookie('count', count, { signed:true });
})

count 값이 클라이언트 쿠키에 암호화되어 저장된다.

reference