본문 바로가기
Language/Node.js

쿠키와 세션

by 노믹 2022. 12. 19.

쿠키와 세션이란?

쿠키(cookie)

브라우저가 서버로부터 응답으로 Set-Cookie 헤더를 받은 경우 해당 데이터를 저장한 뒤 모든 요청에 포함하여 보냅니다.

  • 데이터를 여러 사이트에 공유할 수 있기 때문에 보안에 취약할 수 있습니다.
  • 쿠키는 userId=user-1321;userName=sparta와 같이 문자열 형식으로 존재하며 쿠키 간에는 세미콜론(;)으로 구분됩니다.

세션(Session)

쿠키를 기반으로 구성된 기술입니다. 단, 클라이언트가 마음대로 데이터를 확인할 수 있던 쿠키와는 다르게 세션은 데이터를 서버에만 저장하기 때문에 보안이 좋으나, 반대로 사용자가 많은 경우 서버에 저장해야 할 데이터가 많아져서 서버 컴퓨터가 감당하지 못하는 문제가 생기기 쉽습니다.

 

쿠키(Cookie) 만들어보기

서버가 클라이언트의 HTTP 요청(Request)수신할 때, 서버응답(Response)과 함께 Set-Cookie 라는 헤더를 함께 전송할 수 있습니다. 그 후 쿠키는 해당 서버에 의해 만들어진 응답(Response)과 함께 Cookie HTTP 헤더 안에 포함되어 전달받습니다.

그렇다면 '/set-cookie' API를 호출했을 때 name=sparta라는 쿠키를 할당하는 API를 만들어 보겠습니다.

 

Set-Cookie를 이용하여 쿠키 할당하기

app.get("/set-cookie", (req, res) => {
  const expire = new Date();
  expire.setMinutes(expire.getMinutes() + 60); // 만료 시간을 60분으로 설정합니다.

  res.writeHead(200, {
    'Set-Cookie': `name=sparta; Expires=${expire.toGMTString()}; HttpOnly; Path=/`,
  });
  return res.status(200).end();
});

res.cookie()를 이용하여 쿠키 할당하기

app.get("/set-cookie", (req, res) => {
  const expires = new Date();
  expires.setMinutes(expires.getMinutes() + 60); // 만료 시간을 60분으로 설정합니다.

  res.cookie('name', 'sparta', {
    expires: expires
  });
  return res.status(200).end();
});

req를 이용하여 쿠키 접근하기

클라이언트서버요청(Request)을 보낼 때 자신이 보유하고 있는 쿠키자동으로 서버에게 전달하게 됩니다. 여기서 클라이언트가 전달하는 쿠키 정보는 Request header에 포함되어 서버에 전달되게 됩니다. 그렇다면 서버에서는 어떠한 방식으로 쿠키를 사용할 수 있을까요?

일반적으로 쿠키는 req.headers.cookie에 들어있습니다. req.headers는 클라이언트가 요청한 Request헤더를 의미합니다.

 

/get-cookie에 접근했을 때, 설정된 쿠키를 출력하는 API를 만들어보겠습니다.

  • req.headers에서 전달된 쿠리를 출력하는 예제입니다.
app.get("/get-cookie", (req, res) => {
  const cookie = req.headers.cookie;
  console.log(cookie); // name=sparta
  return res.status(200).json({ cookie });
});

cookie-parser 미들웨어 적용하기

쿠키를 사용하기 위해서는 req.headers.cookie와 같이 여러 프로퍼티를 넘어서야 사용할 수 있었습니다.

여기서 cookie-parser 미들웨어는 요청에 추가된 쿠키를 req.cookies 객체로 만들어 줍니다.  더 이상 req.headers.cookie 와 같이 번거롭게 사용하지 않아도 됩니다.

cookie-parser 미들웨어를 전역으로 사용하기 위해서는 다음과 같이 사용합니다.

app.use(cookieParser());

cookie-parser를 이용해 쿠키를 출력하는 API를 수정해보겠습니다.

const cookieParser = require('cookie-parser');
app.use(cookieParser());

app.get("/get-cookie", (req, res) => {
  const cookie = req.cookies;
  console.log(cookie); // { name: 'sparta' }
  return res.status(200).json({ cookie });
});

cookie를 불러오는 부분을 req.cookies 로 변경되었고, cookie의 형식이 name=sparta가 아니라 객체 형식으로 바뀌었습니다.

cookie-parser는 단순히 쿠키를 req.cookies로 만들어 주기만 하는 것이 아니라 더욱 쿠키를 손쉽게 사용할 수 있도록 도와주는 라이브러리입니다. 더욱 자세한 내용을 확인하고 싶다면 npm 문서를 확인해보세요

세션(Session) 만들어보기

쿠키의 경우 서버를 재시작하거나 새로고침을 하더라도 로그인이 유지됩니다. 사용자의 입장에서는 편하게 사용할 수 있지만 서버의 입장에서는 상당히 위험한 상황입니다. 쿠키가 조작되거나 노출되어 보안적으로 문제가 발생할 수 있습니다.

그렇다면 쿠키에는 어떠한 정보를 넣어줘야 할까요? 서버에서 해당하는 사용자가 누구인지 확실하게 구분할 수 있는 정보만 있다면 서버에서 해당 사용자의 유니크한 정보도 반환할 수 있겠죠?

/set-session API를 호출했을 때 name=sparta 의 정보를 서버에 저장하고, 저장한 시점의 시간 정보를 쿠키로 반환받는 API와

/get-session API를 호출했을 때 쿠키의 시간 정보를 이용하여 서버에 저장된 name 정보를 출력하는 API를 만들어보겠습니다.

 

/set-session API 만들기

let session = {};
app.get('/set-session', function (req, res, next) {
  const name = 'sparta';
  const uniqueInt = Date.now();
  session[uniqueInt] = { name };

  res.cookie('sessionKey', uniqueInt);
  return res.status(200).end();
});
  • 서버에 해당하는 유저의 정보를 저장하기 위한 session 객체를 만들었습니다.
  • /set-session API를 호출했을 때 name=sparta의 정보를 session에 삽입하고, 해당하는 데이터를 불러들이기 위한 시간 정보를 쿠키로 반환받습니다.

/get-session API 만들기

app.get('/get-session', function (req, res, next) {
  const { sessionKey } = req.cookies;
  const name = session[sessionKey];
  return res.status(200).json({ name });
});
  • 쿠키에 저장된 sessionKey를 이용하여session 저장된 데이터를 불러옵니다.

'Language > Node.js' 카테고리의 다른 글

Access Token, Refresh Token  (0) 2022.12.19
JWT란?  (0) 2022.12.19
Request와 Response  (0) 2022.12.13
Module의 이해  (0) 2022.12.13
Routin 이해 및 Router 학습  (0) 2022.12.12