본문 바로가기

개발 공부/nodejs

[섹션3-2] 쿠키와 세션

쿠키

클라이언트에서 서버에 무언가를 요청을 할 때마다 서버는 얘가 누군지를 모른다는 특징이 있다. 한번 연결 된다고 해서 끝이 아니라는 말.

 

그러면 우리가 로그인을 하고 네이버 카카오 같은 곳들을 자유롭게 활보할 수 있는 건 어떻게 하는 것일까? 위의 말대로라면 페이지가 바뀔 때마다 로그인을 해야할 것 같은데 말이지.

 

첫번째로 든 나의 생각은 '로그인도 결국 서버에 정보를 보내는 거니까 모든 요청에 로그인 정보를 담게 하면 되겠네' 였다. 그리고 역시 이런 생각은 나 이전에 여러 천재들이 방법을 구현해놓는다. 그게 바로 쿠키이다.

 

 

쿠키는 http 서버에서 아래와 같이 세팅할 수 있다.

 

const http = require('http');

http.createServer((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에 쿠키 정보가 저장이 된다. 그리고 이렇게 저장된 쿠키는 서버에 요청을 보낼 때 함께 보내지게 된다. 서버는 그걸 보고 '아 얘 000이네 통과시켜' 같은 특정 행동을 하는 것이다.

 

아래 사진은 티스토리 블로그 글 에디터에 있는 쿠키 정보이다.

 

 

 

 

사실 나는 쿠키를 잘 몰랐을 때 쿠키는 바로 암호화가 되어서 편하게 서버에서 데이터를 저장해놓고 쓸 수 있는 줄 알았다. 그리고 로컬스토리지와는 다르게 조작도 불가능해서 '이거다..!' 라는 생각을 한적이 있었다.

 

그래서 프론트를 할 때 쿠키에 이것저것 넣어놓고 신나서 작업했던 기억이 난다. 그런데 보니까 조작도 되고, 암호화도 안되고 그냥 내가 저장한 그대로 쓰이는 것이다? 나는 실망을 감출 수 없었다.

 

알고보니 쿠키는 여러 옵션도 있고 암호화는 쿠키의 역할이 아니었다.

 

 

 

쿠키 옵션

쿠키 옵션들은 정말 유용한 것들이 많다.

 

Expires, Max-age(초를 기준으로 한다): 만료 날짜를 설정해줄 수 있다.

Path: 어디서 이 쿠키가 유효한지 설정. '/' -> 여기 아래에 있는 path들은 유효하다.

Secure: https에서만 가능하게 만들어준다.

HttpOnly: 자바스크립트에서 쿠키 조작을 방지하기 위해서 쿠키에 접근할 수 없게 만든다.

 

 

 

사실 쿠키가 이리저리 바뀌는 것은 그 자체로는 큰 문제가 아니다. 문제가 아니라기 보다는 쿠키의 태생이 그래서 수정을 막을 수는 없다. 그런데 이게 서버를 속일 수 있는 경우 큰 문제가 된다.

 

예를 들어서 서버가 쿠키에 'id=ssunthink'를 심었다고 해보자. 그리고 서버는 이 id를 보고 개인정보들을 쭉 나열해준다. 그런데 어떤 사용자가 'id=kim'으로 바꿨다면? 그대로 kim에 대한 정보가 유출되는 것이다. 걍 조지는 것이다.

 

그래서 나온 것이 세션이다.

 

 

 

세션

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

 

위의 코드는 세션을 설정하는 코드이다. 첫번째 줄에서 uniqueInt에 지금 시간을 넣어주고 실제로 쿠키에도 해당 값을 보내준다.

 

이러면 두가지 장점이 있다.

 

1. 쿠키 이름을 보고 이게 어떤 정보인지 파악이 잘 안된다. 세션이긴 세션인데 이게 로그인에 관한 거야? 권한에 관한 거야? 등등

 

2. 쿠키가 조작되든 말든 서버는 그냥 '유효하지 않네 쳐내' 라는 반응을 보이면 된다. 그러면 위험이 없다.

 

사실 이래도 보안 위협은 늘 있기 때문에 조심해야하고, 실제로는 express-session을 많이 쓴다고 하니 이후에 공부하면서 이걸로 연습해보자.